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')
修改说明
- 先收集整行内所有匹配A/B/C的数据,再一次性写入ws2的同一行,避免数据拆分。
- 仅当当前行存在有效数据时,才递增行号,彻底避免空行生成。
- 简化了变量定义,去掉了不必要的
Workbook导入(你没用到它)。
内容的提问来源于stack exchange,提问作者Wolk
相关产品推荐
相关产品推荐

