本文,用Python从一个Excel表格提取数据填到另一个表格,详情代码中注释都说明了,请亲们详细查阅:
#将要对填的两张xlsx表格放在同一个目录,并在下方指定该目录路径='G:\\Xct\\python'#“填写表”就是要填充数据的EXCEL表格填写表='东璟府-备案管理人员工资表.xlsx'#有些工作表第一行是大,第二或三行才是明细(如:姓名等)#为节省程序运行时间,在这里事先指定好行,如:“姓名”在第#3行,就在下面填“3”,类推。填写表行=3#“数据表”就是用来搜索数据(不修改,只当字典查)的EXCEL表格数据表='三项目备案人员银行账号汇总.xlsx'数据表行=1#由于EXCEL表格排版多种多样,为简化模型,本代码只自动搜索并#填充一列数据,亲们如果要填充多列,可自行加一个循环,或修改# 下面这个数字,反复运行本代码,即可实现多列数据的填充(本代# 码总是在列后一列后面新增一列来填充数据,所以不会造成数据覆盖)#数据表要填充的列是指:例如,一张表中有一列是“银行账号”,而#另一张表则没有,现要将前一张表(数据表)的“银行账号”这一列# 的数据填充到后一张表(填写表)中,那么“银行账号”这列所在的# 列数,就填在这下面。数据表要填充的列=2#--------------------没有意义的分割符---------------------#导入日志模块import logginglogging.basicConfig(level=logging.DEBUG,format='%(asctime)s-%(levelname)s:%(message)s')logging.disable(logging.CRITICAL)#logging.debug(变量)#--------------------没有意义的分割符---------------------#切换工作目录import os原工作目录 = os.getcwd()logging.debug(f'原工作目录:%s' % (原工作目录))#预存储工作目录os.chdir(路径)现工作目录 = os.getcwd()logging.debug(f'现工作目录:%s' % (现工作目录))#切换到工作目录#--------------------没有意义的分割符---------------------#读取填写表#读取Excel文件,需要导入相关函数#coding=gbkimport openpyxlfrom openpyxl import load_workbook要填写的表格 = load_workbook(填写表)#--------------------没有意义的分割符---------------------# 获得所有sheet的名称#print(f'该工作簿共有如下工作表:\n{要填写的表格.get_sheet_names()}')#--------------------没有意义的分割符---------------------# 获得当前正在显示的sheet, 也可以用wb.get_active_sheet()工作表 = 要填写的表格.active#print(f'获得当前正在显示的工作表:{工作表}')#print(f'获得当前正在显示的工作表名:{工作表.title}')#--------------------没有意义的分割符---------------------# 获得最大列和最大行最大列数=工作表.max_column#print('最大列数:', 工作表.max_column)最大行数=工作表.max_row#print('最大行数:', 工作表.max_row)#--------------------没有意义的分割符---------------------#定位“姓名”列for 变量 in range(1,最大列数+1): 单元格= 工作表.cell(row=填写表行, column=变量) if 单元格.value=='姓名': 姓名列=单元格.column #print(姓名列)#--------------------没有意义的分割符---------------------'''#遍历姓名for 行变量 in range(填写表行+1,最大行数): 单元格 = 工作表.cell(row=行变量, column=姓名列) if not 单元格.value==None: print(单元格.value)'''#--------------------没有意义的分割符---------------------#读取数据表要查找的表格 = load_workbook(数据表)#--------------------没有意义的分割符---------------------#获得当前正在显示的工作表数据工作表 = 要查找的表格.active#print(f'获得当前正在显示的工作表:{数据工作表.title}')#--------------------没有意义的分割符---------------------# 获得最大列和最大行数据表最大列数=数据工作表.max_column#print('数据表最大列数:', 数据工作表.max_column)数据表最大行数=数据工作表.max_row#print('数据表最大行数:', 数据工作表.max_row)#--------------------没有意义的分割符---------------------#定位“数据姓名”列for 数据变量 in range(1,数据表最大行数+1): 数据单元格= 数据工作表.cell(row=数据表行, column=数据变量) if 数据单元格.value=='姓名': 数据姓名列=数据单元格.column #print(数据姓名列)#--------------------没有意义的分割符---------------------'''#遍历数据表姓名for 数据行变量 in range(数据表行+1,数据表最大行数): 数据单元格 = 数据工作表.cell(row=数据行变量, column=数据姓名列) if not 数据单元格.value==None: print(数据单元格.value)'''#--------------------没有意义的分割符---------------------#遍历填写表姓名for 行变量 in range(填写表行+1,最大行数): 单元格 = 工作表.cell(row=行变量, column=姓名列) if not 单元格.value==None: 填写表姓名=单元格.value #遍历数据表姓名 for 数据行变量 in range(数据表行 + 1, 数据表最大行数): 数据单元格 = 数据工作表.cell(row=数据行变量, column=数据姓名列) if not 数据单元格.value == None: 数据表姓名=数据单元格.value #搜索两表姓名 if 填写表姓名==数据表姓名: #在填写表的最后一列后面,新增一列,用来填充搜索结果 修改填写表单元格=工作表.cell(row=行变量, column=最大列数+1) #定位到数据表的数据单元格,并获取它的值(搜索的结果) 数据表数据源单元格=数据工作表.cell(row=数据行变量, column=数据表要填充的列) #将“搜索结果”填入“填写表”的当前工作表中的最后一列 修改填写表单元格.value = 数据表数据源单元格.value #print (f'{填写表姓名}的银行账号是:{修改填写表单元格.value}')#--------------------没有意义的分割符---------------------#保存表格要填写的表格.save(填写表)#--------------------没有意义的分割符---------------------# 打开修改后的Excel表格文件import osos.startfile(路径+'//'+填写表)#--------------------没有意义的分割符---------------------'''写在后面的话:1,为了防止各个工作表格式不同而出错,我就不再遍历所有工作表了,需要在同一个工作簿中填充多张工作表的亲,可自行将要填充数据的工作表前置展示,然后保存退出,运行一下上述代码就会自动填充当前工作表。2,需要注意的是:如果要修改的EXCEL表格被打开着,会造成出错,无法保存,所以,运行代码前,需要先退出要修改的EXCEL表格。3,日志模块可以删掉,代码中已经关闭了,这是测试时用的4,作为国人,我讨厌英文,所以能用中文的地方尽量用中文,习惯看鸟语的亲敬请见谅。5,我是初学者,代码中做了大量注释,供自己学习、复习用,嫌我烦的亲还望海涵。如有错误或更简便的方法,还请直言不讳。6,除了用openpyxl,还有其它的模块也能实现。我学Python不为考级,故不考虑孔已己那样的“回字有几种写法”,只要能解决现实问题,一招制敌足矣。对其它模块感兴趣的亲,可以参考后面我问ChatGPT要来的答案——pandas库和xlrd库 ——将出东方 2023-03-23'''#以下是GhatGPT的原文,一字未改,但请自行测试:'''当然可以!以下是一个使用Python和openpyxl库修改Excel单元格并保存的示例代码:首先,确保已安装openpyxl库:```pip install openpyxl```接下来,可以使用以下代码作为模板:import openpyxl# 加载Excel文档workbook = openpyxl.load_workbook('example.xlsx')# 选择要编辑的工作表worksheet = workbook['Sheet1']# 修改单元格内容worksheet['A1'] = 'Hello World!'# 保存修改后的Excel文档workbook.save('example.xlsx')```在这个示例中,我们首先使用 `load_workbook()` 方法加载了一个名为 `example.xlsx` 的Excel文档。然后,我们选择要编辑的工作表,这里是 `Sheet1`。接着,我们使用 `worksheet['A1']` 访问了单元格 `A1` 并将其内容修改为 `Hello World!`。最后,我们使用 `save()` 方 法保存了修改后的Excel文档。希望这可以帮到你!'''#在我的追问下,GhatGPT给出的另外两个方法:'''好的,这是一个很常见的任务,你需要使用Python的pandas库来读取和写入Excel表格,以及使用xlrd库来搜索数据。下面是一个基本的代码框架,你可以根据自己的需要进行修改和扩展:```pythonimport pandas as pdimport xlrd# 读取要搜索的Excel表格search_file = xlrd.open_workbook('search.xlsx')search_sheet = search_file.sheet_by_index(0)# 读取要填写数据的Excel表格target_file = pd.read_excel('target.xlsx')# 遍历搜索表格中的每一行,查找匹配的数据并填写到目标表格中for row_idx in range(1, search_sheet.nrows): search_value = search_sheet.cell(row_idx, 0).value # 获取要搜索的数据 target_row = target_file[target_file['列名'] == search_value] # 在目标表格中查找匹配的行 if not target_row.empty: # 如果找到匹配的行,则将搜索表格中的数据填写到目标表格中 target_file.at[target_row.index[0], '要填写的列名'] = search_sheet.cell(row_idx, 1).value# 保存目标表格target_file.to_excel('target.xlsx', index=False)```在上面的代码中,你需要将其中的`search.xlsx`和`target.xlsx`替换为你实际使用的文件名,并将`列名`和`要填写的列名`替换为你实际使用的列名。你还需要安装xlrd和pandas库,如果你还没有安装的话。'''#还有一个方法:'''好的,这个任务可以使用Python中的pandas库来完成。首先,我们需要安装pandas库,这可以通过在终端中运行以下命令来完成:```pip install pandas```然后,我们需要导入pandas库并读取要搜索的Excel表格和要填入数据的Excel表格。假设要搜索的Excel表格名为“search.xlsx”,要填入数据的Excel表格名为“output.xlsx”,则可以使用以下代码来完成:```pythonimport pandas as pd# 读取要搜索的Excel表格df_search = pd.read_excel('search.xlsx')# 读取要填入数据的Excel表格df_output = pd.read_excel('output.xlsx')```接下来,我们可以使用pandas库中的merge函数将两个表格合并。假设要在要填入数据的Excel表格中填入名为“John”的人的数据,则可以使用以下代码:```python# 将两个表格合并df_merged = pd.merge(df_output, df_search[df_search['Name'] == 'John'], on='ID', how='left')# 在要填入数据的Excel表格中填入搜索到的数据df_merged.loc[df_merged['Name_y'].notna(), 'Data'] = df_merged['Data'] + df_merged['Name_y']# 删除不需要的列df_merged = df_merged.drop(['Name_y'], axis=1)# 保存结果到要填入数据的Excel表格中df_merged.to_excel('output.xlsx', index=False)```这个代码将在要填入数据的Excel表格中搜索名为“John”的人,然后将他们的数据填入“Data”列中。最后,结果将保存到要填入数据的Excel表格中。'''
来源地址:https://blog.csdn.net/amoyxct/article/details/129728105