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

使用openpyxl分组Excel同名客户发票数据遇问题求助

解决同名客户销售数据合并问题

你的代码存在几个关键问题,导致仅输出第一行数据且未实现合并需求:

  1. Python不支持++i语法,应该用i += 1,这会导致变量i始终为0,循环逻辑直接卡死。
  2. 在遍历行的过程中直接插入行,会打乱工作表的行索引,后续遍历完全混乱。
  3. 代码逻辑只是尝试分组行,没有实现合并同名客户销售数据为单行的核心需求。

正确实现思路

先把所有数据读入内存,按客户名称分组聚合,再将合并后的数据写入新工作表:

  • 读取表头和所有行数据
  • 以客户名称(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:00:09