You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

问题原因

  1. 行号更新不统一:只有匹配到"C"时才会执行mr2 +=1,处理"A"、"B"时不会更新目标行号,导致后续数据重复写入同一行,未正确换行的行就会空出来。
  2. 列索引逻辑混乱:处理不同A列值时,目标列用了j、j+1、j+2的偏移,加上循环遍历所有列j,会导致同一行数据被写到错位的列,还会重复处理同一行的多个列,造成空单元格和数据混乱。
  3. 循环范围错误:外层循环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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:25:21