python调用openpyxl实现excel的相同索引的拷贝操作

参考:

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结果如下:

达到预期结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值