Openpyxl复制粘贴Excel数据时出现空单元格问题求助
问题:合并Excel工作表数据时出现空单元格
我编写的脚本原本要实现:把一个Excel工作簿中所有工作表的数据复制到另一个工作簿的首个工作表,同时根据A列的值对数据进行排序。但目前输出结果里数据之间会出现空单元格,不清楚原因,恳请帮忙解答。

原脚本代码:
from openpyxl import load_workbook from openpyxl import Workbook wb = load_workbook('testData.xlsx') wb2 = load_workbook('testTemplate.xlsx') get_sheet = wb.sheetnames for sheet in get_sheet: ws = wb[sheet] mr = ws.max_row mc = ws.max_column ws2 = wb2['Sheet1'] mr2 = ws2.max_row mc2 = ws2.max_column for i in range(2, mr + 2): for j in range(1, mc + 1): if ws.cell(row=i,column=j).value == "A": ws2.cell(row=mr2 + 1,column=j).value = ws.cell(row=i,column=j+1).value elif ws.cell(row=i,column=j).value == "B": ws2.cell(row=mr2 + 1,column=j+1).value = ws.cell(row=i,column=j+1).value elif ws.cell(row=i,column=j).value == "C": ws2.cell(row=mr2 + 1,column=j+2).value = ws.cell(row=i,column=j+1).value mr2 += 1 wb2.save('testTemplate.xlsx')
问题原因
- 行号更新不统一:只有匹配到"C"时才会执行
mr2 +=1,处理"A"、"B"时不会更新目标行号,导致后续数据重复写入同一行,未正确换行的行就会空出来。 - 列索引逻辑混乱:处理不同A列值时,目标列用了
j、j+1、j+2的偏移,加上循环遍历所有列j,会导致同一行数据被写到错位的列,还会重复处理同一行的多个列,造成空单元格和数据混乱。 - 循环范围错误:外层循环
range(2, mr + 2)多遍历了一行,会处理到源工作表的空行,引入无效数据。
修正后的代码
from openpyxl import load_workbook # 加载源工作簿与目标工作簿 wb = load_workbook('testData.xlsx') wb2 = load_workbook('testTemplate.xlsx') ws2 = wb2['Sheet1'] # 从目标工作表已有数据的下一行开始写入 current_row = ws2.max_row + 1 # 遍历源工作簿的所有工作表 for sheet_name in wb.sheetnames: ws = wb[sheet_name] max_row = ws.max_row # 遍历源工作表的有效数据行(第2行起,假设第1行是表头) for row_num in range(2, max_row + 1): col_a_val = ws.cell(row=row_num, column=1).value # 根据A列值,将对应数据写入目标工作表的指定列 if col_a_val == "A": ws2.cell(row=current_row, column=1).value = ws.cell(row=row_num, column=2).value current_row += 1 elif col_a_val == "B": ws2.cell(row=current_row, column=2).value = ws.cell(row=row_num, column=2).value current_row += 1 elif col_a_val == "C": ws2.cell(row=current_row, column=3).value = ws.cell(row=row_num, column=2).value current_row += 1 # 保存修改后的目标工作簿 wb2.save('testTemplate.xlsx')
关键修正点
- 统一用
current_row管理目标行号,每处理一行有效数据就自动+1,彻底避免空行。 - 明确列对应关系:A列值对应目标工作表的第1-3列,避免列索引错位。
- 修正循环范围,只处理源工作表中有数据的行。
内容的提问来源于stack exchange,提问作者Wolk
相关产品推荐
相关产品推荐

