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

如何用openpyxl删除列重复值并合并同行数据、求和?

需求与解决思路提示:合并Excel中Name列相同的行

我目前可通过openpyxl高亮Excel表格中的重复值,但需要实现删除重复值,将Name列相同的行进行合并:对Qty列求和,合并REF列内容。以下是现有代码、输入输出示例,求解决思路提示。

现有代码

import openpyxl
import getpass  # 原代码遗漏该导入,需补上

def isheet(request):
    if "GET" == request.method:
        return render(request, 'home/index.html', {})
    else:
        excel_file = request.FILES["excel_file"]

        wb = openpyxl.load_workbook(excel_file)
        wb.create_sheet('Sheet2')

        worksheet = wb.active
        sheets = wb.sheetnames
        print(sheets)

        worksheet = wb["Sheet1"]
        worksheet2 = wb["Sheet2"]
  
        # 重复值高亮逻辑
        red_text = Font(color="9C0006")
        red_fill = PatternFill(bgColor="FFC7CE")
        dxf = DifferentialStyle(font=red_text, fill=red_fill)
        rule = Rule(type="duplicateValues", text="highlight", dxf=dxf)
        worksheet2.conditional_formatting.add('C1:C10000', rule)
        dup = worksheet2.conditional_formatting.add('C1:C10000', rule)

        excel_data = list()

        messages.success(request, 'BOM is Uploaded !')
        for row in worksheet2.iter_rows():
            row_data = list()
            for cell in row:
                row_data.append(str(cell.internal_value))
            excel_data.append(row_data)
        wb.save('C:/Users/'+getpass.getuser()+'/Downloads/VinBOM.xlsx')
        return render(request, 'index.html', {"excel_data":excel_data})

输入示例

ABCD
NoQtyREFName
12C1,C2CAP
21C3CAP
31R1RES

期望输出

ABCD
NoQtyREFName
13C1,C2,C3CAP
21R1RES

解决思路

  • 数据分组:用字典按Name聚合数据
    导入collections.defaultdict,遍历Sheet1的有效数据行(跳过表头),以Name为键,累计Qty的和,收集所有REF的内容:

    from collections import defaultdict
    
    # 初始化分组字典,默认每个Name对应Qty为0、REF列表为空
    group_data = defaultdict(lambda: {'total_qty': 0, 'ref_list': []})
    
    # 从第2行开始遍历数据行(第1行是表头)
    for row in worksheet.iter_rows(min_row=2, values_only=True):
        _, qty, ref, name = row  # 按列顺序提取值,No最后重新生成
        group_data[name]['total_qty'] += int(qty)  # 转成整数求和
        group_data[name]['ref_list'].extend(ref.split(','))  # 拆分REF并加入列表
    
  • 写入合并后的数据到Sheet2
    先清空Sheet2原有内容(避免残留数据),写入表头,再遍历分组好的数据生成新行:

    # 清空Sheet2原有内容
    worksheet2.delete_rows(1, worksheet2.max_row)
    
    # 写入表头
    worksheet2.append(['No', 'Qty', 'REF', 'Name'])
    
    # 遍历分组数据,生成新行
    for seq_num, (name, info) in enumerate(group_data.items(), start=1):
        merged_ref = ','.join(info['ref_list'])  # 合并REF列表为字符串
        worksheet2.append([seq_num, info['total_qty'], merged_ref, name])
    
  • 调整原有逻辑
    原代码中Sheet2的重复值高亮逻辑可按需保留或删除;最后收集excel_data时,直接遍历Sheet2的新数据行即可。

  • 注意事项

    • 确保数据类型转换,比如Qty要转为数字,避免字符串拼接错误
    • 若存在空行或异常值,可添加判断逻辑跳过,比如检查Qty是否为有效数字
    • 列顺序需与输入Excel严格对应,避免提取数据出错

内容的提问来源于stack exchange,提问作者Prashanth127 4g

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:30:58