Openpyxl跨工作簿复制粘贴去重失效问题排查
问题:Python Excel数据分类复制去重逻辑失效排查与修复
我编写的Python脚本用于将数据从一个工作簿复制到另一个,并按值分类排序。尝试通过if语句检查目标工作簿中是否已存在对应数据实现去重,但该逻辑未能正常运行,请问问题出在哪里?

用户原代码:
from openpyxl import load_workbook from openpyxl import Workbook wb = load_workbook('testData.xlsx') wb2 = load_workbook('testTemplate.xlsx') ws = wb.worksheets[0] mr = ws.max_row ws2 = wb2.worksheets[0] A = ws2.max_row B = ws2.max_row C = ws2.max_row ws2values = set() for row in ws.iter_rows(min_row = 2, min_col = 1, max_row = mr, max_col = 2): for cell in row: if cell.value == "A": if ws2.cell(row = A + 1, column = 1).value in ws2values: pass else: ws2.cell(row = A + 1, column = 1).value = (cell.offset(column = + 1).value) A += 1 elif cell.value == "B": if ws2.cell(row = B + 1, column = 1).value in ws2values: pass else: ws2.cell(row = B + 1, column = 1).value = (cell.offset(column = + 1).value) B += 1 elif cell.value == "C": if ws2.cell(row = C + 1, column = 1).value in ws2values: pass else: ws2.cell(row = C + 1, column = 1).value = (cell.offset(column = + 1).value) C += 1 wb2.save('testTemplate.xlsx')
问题根源分析
- 去重集合未初始化现有数据:
ws2values是空集合,完全没有读取目标工作簿中已存在的数据,导致去重检查毫无意义。 - 检查逻辑完全错误:每次判断的是
ws2.cell(row = A + 1, column = 1).value,这个单元格在写入前是空值,永远不在空集合里,等于跳过了去重判断直接写入。 - 单元格遍历方式错误:嵌套遍历行内每个单元格,会把同一行的分类列和数据列都处理一遍,导致重复判断和写入操作。
修正后的代码
from openpyxl import load_workbook # 加载源工作簿和目标工作簿 wb = load_workbook('testData.xlsx') wb2 = load_workbook('testTemplate.xlsx') ws_source = wb.worksheets[0] ws_target = wb2.worksheets[0] # 用字典管理不同分类的当前最大行号 category_row_map = { "A": ws_target.max_row, "B": ws_target.max_row, "C": ws_target.max_row } # 初始化去重集合,先导入目标表中已有的数据 existing_values = set() for row in ws_target.iter_rows(min_row=2, max_row=ws_target.max_row, min_col=1, max_col=1): cell_val = row[0].value if cell_val: existing_values.add(cell_val) # 遍历源数据的每一行(跳过表头,从第2行开始) for row in ws_source.iter_rows(min_row=2, max_row=ws_source.max_row, min_col=1, max_col=2): category = row[0].value data_value = row[1].value # 跳过未知分类和空值 if category not in category_row_map or not data_value: continue # 去重判断:数据不在已存在集合中才写入 if data_value not in existing_values: target_row = category_row_map[category] + 1 ws_target.cell(row=target_row, column=1).value = data_value # 更新分类行号和去重集合 category_row_map[category] = target_row existing_values.add(data_value) # 保存修改后的目标工作簿 wb2.save('testTemplate.xlsx')
修正说明
- 先读取目标工作簿中已有的数据存入去重集合,确保能检查到历史数据
- 用字典管理分类行号,简化重复代码
- 直接遍历源数据的整行,一次处理分类和对应数据,避免重复操作
- 检查的是要写入的
data_value是否在集合中,逻辑符合需求 - 写入后立即将数据加入集合,避免后续重复写入
内容的提问来源于stack exchange,提问作者Wolk
相关产品推荐
相关产品推荐

