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

Openpyxl复制粘贴数据时出现空行问题求助

原因分析与解决办法

核心问题

你的代码是遍历每行的每个单元格,只要碰到匹配A/B/C的单元格,就会给mr2加1(即新建一行)。这种逻辑会导致两种空行/数据分散的情况:

  • 若同一行里有多个匹配的单元格(比如同时有A和B),代码会把它们分别写到ws2的不同行,原本该在同一行的数据被拆分,中间形成空行。
  • 若某一行没有匹配的单元格,循环执行但没写入数据,后续再写入时mr2已经被之前的操作递增,直接跳过行号,出现空行。

修正思路

应该按行处理:先收集当前行内所有A/B/C对应的数据,再统一写入ws2的同一行;只有当当前行有有效数据时,才递增行号,避免空行。

修改后的代码

from openpyxl import load_workbook

wb = load_workbook('testData.xlsx')
wb2 = load_workbook('testTemplate.xlsx')

ws = wb.worksheets[0]
ws2 = wb2.worksheets[0]

# 从模板已有数据的下一行开始写入
current_row = ws2.max_row + 1

for row in ws.iter_rows(min_row=1, min_col=1, max_row=ws.max_row, max_col=3):
    # 初始化当前行要写入的三个列值
    col1_val = None
    col2_val = None
    col3_val = None
    
    for cell in row:
        if cell.value == "A":
            col1_val = cell.offset(column=1).value
        elif cell.value == "B":
            col2_val = cell.offset(column=1).value
        elif cell.value == "C":
            col3_val = cell.offset(column=1).value
    
    # 只有当前行有数据时才写入并换行
    if any([col1_val, col2_val, col3_val]):
        if col1_val:
            ws2.cell(row=current_row, column=1).value = col1_val
        if col2_val:
            ws2.cell(row=current_row, column=2).value = col2_val
        if col3_val:
            ws2.cell(row=current_row, column=3).value = col3_val
        current_row += 1

wb2.save('testTemplate.xlsx')

修改说明

  1. 先收集整行内所有匹配A/B/C的数据,再一次性写入ws2的同一行,避免数据拆分。
  2. 仅当当前行存在有效数据时,才递增行号,彻底避免空行生成。
  3. 简化了变量定义,去掉了不必要的Workbook导入(你没用到它)。

内容的提问来源于stack exchange,提问作者Wolk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:20:53