Python从一个Excel表格提取数据填到另一个表格

本文,用Python从一个Excel表格提取数据填到另一个表格,详情代码中注释都说明了,请亲们详细查阅:

#将要对填的两张xlsx表格放在同一个目录,并在下方指定该目录
路径='G:\\Xct\\python'
#“填写表”就是要填充数据的EXCEL表格
填写表='东璟府-备案管理人员工资表.xlsx'
#有些工作表第一行是大标题,第二或三行才是明细标题(如:姓名等)
#为节省程序运行时间,在这里事先指定好标题行,如:“姓名”在第
#3行,就在下面填“3”,类推。
填写表标题行=3
#“数据表”就是用来搜索数据(不修改,只当字典查)的EXCEL表格
数据表='三项目备案人员银行账号汇总.xlsx'
数据表标题行=1
#由于EXCEL表格排版多种多样,为简化模型,本代码只自动搜索并
#填充一列数据,亲们如果要填充多列,可自行加一个循环,或修改
# 下面这个数字,反复运行本代码,即可实现多列数据的填充(本代
# 码总是在列后一列后面新增一列来填充数据,所以不会造成数据覆盖)
#数据表要填充的列是指:例如,一张表中有一列是“银行账号”,而
#另一张表则没有,现要将前一张表(数据表)的“银行账号”这一列
# 的数据填充到后一张表(填写表)中,那么“银行账号”这列所在的
# 列数,就填在这下面。
数据表要填充的列=2
#--------------------没有意义的分割符---------------------
#导入日志模块
import logging
logging.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=gbk
import openpyxl
from 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 os
os.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库来搜索数据。下面是一个基本
的代码框架,你可以根据自己的需要进行修改和扩展:

```python
import pandas as pd
import 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”,则可以使用以下代码来完
成:

```python
import 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表格中。
'''

你可能感兴趣的:(excel,python,开发语言)