使用openpyxl分组Excel同名客户发票数据遇问题求助
解决同名客户销售数据合并问题
你的代码存在几个关键问题,导致仅输出第一行数据且未实现合并需求:
- Python不支持
++i语法,应该用i += 1,这会导致变量i始终为0,循环逻辑直接卡死。 - 在遍历行的过程中直接插入行,会打乱工作表的行索引,后续遍历完全混乱。
- 代码逻辑只是尝试分组行,没有实现合并同名客户销售数据为单行的核心需求。
正确实现思路
先把所有数据读入内存,按客户名称分组聚合,再将合并后的数据写入新工作表:
- 读取表头和所有行数据
- 以客户名称(B列)为键,聚合销售相关字段(比如金额求和,其他信息可选择保留第一条或合并)
- 创建新工作表,写入表头和合并后的结果
修正后的代码
from openpyxl import load_workbook, Workbook # 加载原工作簿 wb = load_workbook(r'C:\Users\owner\Downloads\Invoices Overall.xlsx') source_ws = wb.active # 读取表头和所有数据行 header = [cell.value for cell in source_ws[1]] data_rows = [] for row in source_ws.iter_rows(min_row=2, values_only=True): data_rows.append(row) # 按客户名称(第2列,索引1)分组,合并销售数据 customer_data = {} for row in data_rows: customer_name = row[1] if customer_name not in customer_data: # 首次遇到该客户,初始化数据(这里假设第3列是金额,可根据实际调整) customer_data[customer_name] = { 'name': customer_name, 'total_amount': row[2] if row[2] else 0, # 可添加其他需要保留的字段,比如首次开票日期等 'first_invoice_date': row[0] # 假设第1列是日期 } else: # 已有该客户,累加金额 customer_data[customer_name]['total_amount'] += row[2] if row[2] else 0 # 创建新工作簿和工作表 new_wb = Workbook() new_ws = new_wb.active new_ws.title = '合并后数据' # 写入表头 new_ws.append(header[:3]) # 假设保留前3列:日期、客户、总金额,可根据实际调整 # 或者自定义表头:new_ws.append(['首次开票日期', '客户名称', '总销售金额']) # 写入合并后的数据 for customer in customer_data.values(): new_ws.append([customer['first_invoice_date'], customer['name'], customer['total_amount']]) # 保存结果 new_wb.save('Invoices_Merged.xlsx')
注意事项
- 根据你的实际表格结构调整代码中的列索引(比如金额列、日期列的位置)
- 如果需要合并其他字段(比如所有发票号),可以在分组时用列表收集后再拼接(比如
','.join(invoice_numbers)) - 处理空值时要注意,避免
None和数值相加报错
内容的提问来源于stack exchange,提问作者Chris Silva
相关产品推荐
相关产品推荐

