今天分享一个朋友让帮他实现下面功能的代码,需要按水果名汇总每个序号下的总数量,手动拆分、计算、汇总。一段超实用的Python代码,一键搞定这种复杂的Excel汇总需求,还能自动生成格式超美观的汇总报表!哪怕你是零基础编程小白,跟着步骤走也能直接用~
一、数据样式
(做题前,先理解一下这个需求中的excel)
原始 Excel 属于一种:
半结构化宽表数据
特点:
每行包含多组「名称 + 数量」
名称列可能:
是单一名称(如:苹果)
是多个“水果+数字”组合(如:橙子1 柠檬2)
最终目标:
二、小白也能会的使用步骤
步骤1:准备工作(安装必要工具)
首先确保你的电脑装了Python(不会装的话,搜“Python 安装教程”,跟着装就行),然后打开电脑的「命令提示符」(Windows)/「终端」(Mac),输入以下命令安装需要的库:
pip install pandas openpyxl
等待安装完成即可,不用管中间的提示,没报错就是装好了。
步骤2:准备源Excel文件
把你的汇总源文件命名为data0227.xlsx,和接下来要保存的代码文件放在同一个文件夹里(比如桌面新建一个“水果汇总”文件夹),确保Excel里的列名是「序号」「名称 1」「数量 1」「名称 2」「数量 2」「名称 3」「数量 3」(如果组数不是3,改代码里的GROUP_COUNT就行)。
步骤3:复制代码并运行
- 在文件夹里右键→新建→文本文档,重命名为
水果汇总.py(后缀要从.txt改成.py,看不到后缀就先在电脑设置里显示扩展名); - 双击打开这个
.py文件,把下面的完整代码复制粘贴进去,保存并关闭; - 回到文件夹,双击
水果汇总.py,等待几秒,文件夹里会自动生成汇总结果.xlsx,就是我们要的汇总表!
三、完整代码(直接复制用)
import pandas as pdimport refrom openpyxl import Workbookfrom openpyxl.styles import Font, PatternFill, Alignment, Border, Sidefrom collections import defaultdictdf = pd.read_excel('data0215.xlsx')# ── 解析函数 ────────────────────────────────────────────────────def parse_name_qty(name_str, total_qty): """ 解析名称字符串和总数量,返回 {水果名: 数量} 字典。 - 单名称(如 '苹果')→ 全部数量归该名称 - 多名称(如 '橙子1 柠檬2')→ 按比例分配 """ name_str = str(name_str).strip() # 匹配 "汉字+数字" 对 pairs = re.findall(r'([\u4e00-\u9fa5]+)(\d+)', name_str) if not pairs: # 纯名称,无内嵌比例数字 return {name_str: total_qty} total_ratio = sum(int(r) for _, r in pairs) result = {} for name, ratio in pairs: result[name] = total_qty * int(ratio) / total_ratio return result# ── 汇总逻辑 ─────────────────────────────────────────────────────GROUP_COUNT = 3 # 名称/数量列的组数records = []for _, row in df.iterrows(): seq = row['序号'] totals = defaultdict(float) for i in range(1, GROUP_COUNT + 1): name_col = f'名称 {i}' qty_col = f'数量 {i}' if name_col not in row or pd.isna(row[name_col]): continue dist = parse_name_qty(row[name_col], row[qty_col]) for fruit, qty in dist.items(): totals[fruit] += qty record = {'序号': seq} record.update(totals) records.append(record)result_df = pd.DataFrame(records).fillna('')# 固定列顺序(按题意)fruits = ['苹果', '橙子', '柠檬', '香蕉']cols = ['序号'] + [f for f in fruits if f in result_df.columns]result_df = result_df[cols]# 整数化(有值的格子)for col in fruits: if col in result_df.columns: result_df[col] = result_df[col].apply(lambda x: int(x) if x != '' else '')print("汇总结果:")print(result_df.to_string(index=False))# ── 输出到 Excel ─────────────────────────────────────────────────out_path = '汇总结果.xlsx'wb = Workbook()ws = wb.activews.title = '汇总'header_fill = PatternFill('solid', start_color='4472C4')header_font = Font(bold=True, color='FFFFFF', name='Arial')cell_font = Font(name='Arial', size=11)center = Alignment(horizontal='center', vertical='center')thin = Side(style='thin', color='BFBFBF')border = Border(left=thin, right=thin, top=thin, bottom=thin)# 写表头for col_idx, col_name in enumerate(result_df.columns, 1): cell = ws.cell(row=1, column=col_idx, value=col_name) cell.fill = header_fill cell.font = header_font cell.alignment = center cell.border = border# 写数据alt_fill = PatternFill('solid', start_color='EBF3FB')for row_idx, row in enumerate(result_df.itertuples(index=False), 2): fill = alt_fill if row_idx % 2 == 0 else PatternFill() for col_idx, value in enumerate(row, 1): cell = ws.cell(row=row_idx, column=col_idx, value=value if value != '' else None) cell.font = cell_font cell.alignment = center cell.border = border cell.fill = fill# 列宽ws.column_dimensions['A'].width = 8for col_letter in ['B', 'C', 'D', 'E']: ws.column_dimensions[col_letter].width = 10ws.row_dimensions[1].height = 20wb.save(out_path)print(f"\n已保存至:{out_path}")
四、小白能看懂的核心解析
不用懂全部代码,只要知道这几个关键地方能改,就能适配你的需求:
- 修改组数:代码里
GROUP_COUNT = 3,如果你的Excel里有4组「名称+数量」,就改成4; - 修改水果列表:
fruits = ['苹果', '橙子', '柠檬', '香蕉'],换成你要汇总的水果/物品名; - 修改源文件名:
df = pd.read_excel('data0215.xlsx'),改成你的源Excel文件名; - 修改样式:比如表头颜色
start_color='4472C4'(蓝色),可以换成其他颜色代码(比如红色FF0000)。
五、常见问题解决
- 运行报错“找不到文件”:检查源Excel文件名是否和代码里的一致,且和代码文件在同一个文件夹;
- 报错“没有pandas”:重新执行
pip install pandas openpyxl,确保网络正常; - 数量汇总不对:检查源Excel里的列名是不是「名称 1」「数量 1」(注意空格),名称里的比例格式是不是“水果+数字”(比如“橙子1”不是“橙子 1”)。
以后遇到类似的Excel汇总需求,再也不用手动算啦!把重复的工作交给Python,省时又准确~
🔮 获取和交流
需要本章或其他文章的源码和数据的同学,关注+三连,评论“6666“,加下面微信,发你!也可以拉你进群交流学习,加群备注:IT小本本学习
为了能随时获取最新动态,大家可以动动小手将公众号添加到“星标⭐”哦,点赞 + 关注,用时不迷路!!!!
关注公众号:IT小本本 👇