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

Openpyxl跨工作簿复制粘贴去重失效问题排查

问题:Python Excel数据分类复制去重逻辑失效排查与修复

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

Excel数据示例

用户原代码:

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

问题根源分析

  1. 去重集合未初始化现有数据:ws2values是空集合,完全没有读取目标工作簿中已存在的数据,导致去重检查毫无意义。
  2. 检查逻辑完全错误:每次判断的是ws2.cell(row = A + 1, column = 1).value,这个单元格在写入前是空值,永远不在空集合里,等于跳过了去重判断直接写入。
  3. 单元格遍历方式错误:嵌套遍历行内每个单元格,会把同一行的分类列和数据列都处理一遍,导致重复判断和写入操作。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:01:56