使用openpyxl复制Excel数据时目标文件原有数据丢失求助
问题原因分析
你提供的代码逻辑并不是追加数据,而是从目标工作表的第1行第1列开始覆盖写入,这直接导致目标文件原有数据的前N行(N等于源文件行数)被替换——如果源文件对应位置的单元格是空值,就会把目标文件的对应单元格清空,这就是你看到原有数据变成空白的原因。
解决方案
要实现“将源文件数据追加到目标文件已有数据之后”的需求,核心是先获取目标工作表已有的总行数,然后从该行的下一行开始写入源数据,而不是从第1行开始。
修改后的代码如下:
import openpyxl as xl # 打开源excel文件 filename = "path_to_source_file" wb1 = xl.load_workbook(filename) ws1 = wb1.worksheets[0] # 打开目标excel文件 filename1 = "path_to_destination_file" wb2 = xl.load_workbook(filename1) ws2 = wb2.active # 获取源文件的总行数、总列数 mr = ws1.max_row mc = ws1.max_column # 获取目标文件已有数据的最后一行,追加从下一行开始 start_row = ws2.max_row + 1 # 复制源文件数据到目标文件的追加位置 for i in range(1, mr + 1): for j in range(1, mc + 1): c = ws1.cell(row=i, column=j) # 可选:如果不想把空值写入目标文件,避免清空原有单元格,可以加判断 # if c.value is not None: ws2.cell(row=start_row + i - 1, column=j).value = c.value # 保存目标文件 wb2.save(filename1)
关键改动说明
- 新增
start_row = ws2.max_row + 1:确定追加数据的起始行,确保不会覆盖目标文件原有内容 - 写入目标单元格时,行号改为
start_row + i - 1:把源文件的第i行,对应写入目标文件的start_row + i - 1行(比如目标原有10行,start_row是11,源第1行就写到目标第11行) - 可选判断
if c.value is not None:如果源文件存在空白单元格,不想让这些空白覆盖目标文件可能存在的内容,可以启用这个判断,只写入非空值
内容的提问来源于stack exchange,提问作者MeiLin M
相关产品推荐
相关产品推荐

