参考:
https://diwugebingren.github.io/posts/b31985f0/
我们的目的是想让表2从表1中拷贝以某索引相同的数据。比如表1的数据如下:
表2暂时无数据:
我们的目标就是让表2中同姓名的学生的各科成绩和表1对应起来。
实现代码:
#_*_coding:utf-8_*_
from openpyxl import load_workbook
wb_r = load_workbook(filename="./data/excel/1.xlsx",read_only=True) #源表名称
wb_w = load_workbook("./data/excel/2.xlsx") #目标表名称
ws_r = wb_r.active #激活源工作表
ws_w = wb_w.active #激活目标工作表
ws_r = wb_r["Sheet1"] #源表要提取信息的sheet
ws_w = wb_w["Sheet1"] #目标表要提取信息的sheet
header_row_r = ws_r[1] #源表的行
header_row_w = ws_w[1] #目标表的行
"""
openpyxl用read_only模式载入workbook时,获取到的cell不是一般的cell,
经过测试cell.column变成偏移了几列的整数,所以这里我们定义一个函数来处理,
把整数转换成excel真正的列数,比如“A”、“BB”等。
"""
def readOnly_offsetColunmNumber_toRealColumn(number):
column=''
if number<=26:
column=chr(number+ord('A')-1)
else:
number1=number//26 #整数除法
column1=chr(number1+ord('A')-1)
number2=number%26
column2=chr(number2+ord('A')-1)
column=column1+column2
return column
#初始化两个变量,分别是源表的条件列,要复制的列
source_condition_column=""
source_filled_column=""
"""
循环源表的标题列,得到条件列的位置以及要复制列的位置,
再通过内嵌的循环得到条件列的最大行数
"""
for cell in header_row_r:
if cell.value=="姓名":
source_condition_column=readOnly_offsetColunmNumber_toRealColumn(cell.column)
#初始化两个变量,分别是目标表的条件列,要粘贴的列
target_condition_column=""
target_filling_column=""
"""
循环目标表的标题列,得到条件列的位置以及要粘贴列的位置,
再通过内嵌的循环得到条件列的最大行数
"""
for cell_j in header_row_w:
if cell_j.value=="姓名":
target_condition_column=readOnly_offsetColunmNumber_toRealColumn(cell_j.column)
"""
循环目标表的条件列,内部嵌套循环源表的条件列,一旦目标表条件列的某个cell
与源表条件列某个cell的值相同,我们就把源表要复制列的同一行的cell的值
赋予目标表要粘贴列的同一行的cell。
"""
for cell_m in ws_w[target_condition_column+str(2):target_condition_column+str(5)]:
for cell_n in ws_r[source_condition_column+str(2):source_condition_column+str(5)]:
if cell_m[0].value==cell_n[0].value:
for i in range(2,5):
ws_w[readOnly_offsetColunmNumber_toRealColumn(i)+str(cell_m[0].row)].value=ws_r[readOnly_offsetColunmNumber_toRealColumn(i)+str(cell_n[0].row)].value
wb_w.save("./data/2.xlsx")
为了方便展示,我们表2存储到另一个位置而不是直接在原来的表2上写数据,得出./data/位置的表2结果如下:
达到预期结果。