如何用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})
输入示例
| A | B | C | D |
|---|---|---|---|
| No | Qty | REF | Name |
| 1 | 2 | C1,C2 | CAP |
| 2 | 1 | C3 | CAP |
| 3 | 1 | R1 | RES |
期望输出
| A | B | C | D |
|---|---|---|---|
| No | Qty | REF | Name |
| 1 | 3 | C1,C2,C3 | CAP |
| 2 | 1 | R1 | RES |
解决思路
数据分组:用字典按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
相关产品推荐
相关产品推荐

