Python Vibe Coding实操|基于Pandas完成销售Excel报表自动化生成(实验一)
前言
什么是Vibe Coding:不是完全靠手写代码,也不是直接把全部需求丢给AI一键生成完事;而是用自然语言描述业务需求,借助AI编码工具辅助开发,人主导需求拆解、边界定义、代码审查、异常处理与结果验证,重点考察需求拆解、风险识别、结果校验的综合能力。
本次完成考题一:Excel销售报表生成脚本,原始输入文件为sales_raw.xlsx,完成脏数据清洗、多维度聚合统计,输出多Sheet的report.xlsx,处理空文件、无有效数据、字段缺失等异常场景。
开发环境:Python3.10+,依赖库:pandas、openpyxl
一、需求澄清清单(交给AI前先梳理清楚需求)
这是Vibe Coding非常关键的一步,不要直接把考题复制粘贴丢给AI,自己先把目标、输入输出、边界条件、验收标准整理出来,再交给AI,减少AI幻觉。
1.业务目标
读取原始销售Excel文件,完成数据清洗、多维度聚合统计,生成多工作表的结果报表,禁止修改原始输入文件,各种异常输入不能直接程序崩溃,要有友好提示。
2.输入
文件:sales_raw.xlsx 原始字段:日期、销售员、产品、数量、单价、地区 原始数据问题:存在空值、重复行、数量为负数/0的脏数据。
3.输出
输出文件:report.xlsx,包含4个工作表
- 明细清洗后:清洗完成之后的有效原始明细
- 按销售员:按销售员维度汇总销售额(销售额=数量 × 单价)
- 按地区:按地区维度汇总销售额
- 总览:月度整体销售总额
4.边界&异常条件
- 关键字段为空,直接丢弃该行;
- 数量≤0,判定异常,剔除该行;
- 全字段重复行,执行去重;
- 文件不存在、空Excel文件;
- 清洗完成后没有任何有效数据,脚本给出提示,不直接崩溃;
- 文件写入占用(PermissionError文件被Excel打开占用)捕获异常提示用户关闭文件;
- 绝对不能修改原始sales_raw.xlsx。
5.验收标准
- 脚本一键运行即可生成report.xlsx;
- 统计结果可以人工核对,数值准确;
- 异常输入场景输出可读提示,程序不会直接抛堆栈报错退出;
- 输出4个sheet全部存在。
二、工程目录结构
project/ ├── sales_raw.xlsx # 原始输入销售数据 ├── sales_report.py # 主脚本 ├── report.xlsx # 程序运行后生成输出文件 └── requirements.txt # 依赖声明requirements.txt
pandas>=2.0 openpyxl>=3.1三、核心代码实现 sales_report.py
说明:代码由AI辅助生成,人工做了review,补充异常捕获、边界判断,修复文件权限占用报错问题。
import pandas as pd import os INPUT_FILE = "sales_raw.xlsx" OUTPUT_FILE = "report.xlsx" def main(): # ==========1.读取原始文件,捕获文件不存在异常========== if not os.path.exists(INPUT_FILE): print(f"【错误】输入文件 {INPUT_FILE} 不存在,请检查!") return try: df_raw = pd.read_excel(INPUT_FILE, engine="openpyxl") except Exception as e: print(f"【错误】读取文件失败: {str(e)}") return print(f"原始数据总行数:{len(df_raw)}") # ==========2.数据清洗环节========== # 关键字段:日期、销售员、产品、数量、单价、地区,关键字段为空直接丢弃 key_cols = ["日期", "销售员", "产品", "数量", "单价", "地区"] df_clean = df_raw.dropna(subset=key_cols).copy() # 剔除数量<=0的异常行 df_clean = df_clean[df_clean["数量"] > 0] # 全字段去重 df_clean = df_clean.drop_duplicates() print(f"清洗后有效数据行数:{len(df_clean)}") # 判断清洗后是否完全没有有效数据 if len(df_clean) == 0: print("【警告】经过清洗之后无任何有效销售数据,停止生成报表!") return # 计算每行销售额 df_clean["销售额"] = df_clean["数量"] * df_clean["单价"] # ==========3.多维度统计计算========== # 按销售员汇总 df_salesman = df_clean.groupby("销售员", as_index=False).agg({ "销售额": "sum" }).sort_values("销售额", ascending=False) # 按地区汇总 df_area = df_clean.groupby("地区", as_index=False).agg({ "销售额": "sum" }).sort_values("销售额", ascending=False) # 总览,月度总额 total_sale = df_clean["销售额"].sum() df_total = pd.DataFrame({ "月度销售总额": [total_sale] }) # ==========4.写入多sheet的Excel报表,处理文件占用权限异常========== try: with pd.ExcelWriter(OUTPUT_FILE, engine="openpyxl") as writer: df_clean.to_excel(writer, sheet_name="明细清洗后", index=False) df_salesman.to_excel(writer, sheet_name="按销售员", index=False) df_area.to_excel(writer, sheet_name="按地区", index=False) df_total.to_excel(writer, sheet_name="总览", index=False) print(f"✅报表生成成功!输出文件:{OUTPUT_FILE}") except PermissionError: print(f"【错误】写入失败!{OUTPUT_FILE} 文件正在被Excel/WPS打开,请关闭该Excel文件后重新运行脚本!") except Exception as e: print(f"【错误】写入报表发生异常:{str(e)}") if __name__ == "__main__": main()四、运行说明
- 将sales_raw.xlsx放到脚本同一目录;
- 安装依赖
pip install -r requirements.txt- 运行脚本
python sales_report.py⚠️注意:运行脚本前,务必关闭report.xlsx,否则会出现PermissionError权限拒绝报错,代码内部已经捕获该异常给出提示。
运行成功之后,目录生成report.xlsx,包含4个工作表。
五、程序运行结果
六、测试用例设计(正常用例 + 边界异常用例)
| 用例类型 | 测试场景 | 预期结果 |
|---|---|---|
| 正常用例 | sales_raw.xlsx包含正常销售数据,夹杂脏数据(空值、重复、负数数量) | 成功生成4个sheet报表;脏数据被过滤,销售额统计结果正确 |
| 边界异常用例1 | 原始文件全部都是脏数据,清洗完成之后0行有效数据 | 控制台输出警告,不会生成报表,程序正常退出,不抛异常堆栈 |
| 边界异常用例2 | report.xlsx被WPS/Excel打开状态运行脚本 | 捕获PermissionError,打印友好提示,不会直接崩溃 |
| 边界异常用例3 | sales_raw.xlsx文件丢失 | 控制台提示输入文件不存在,程序安全退出 |
七、AI协作过程记录(Vibe Coding核心)
1.交给AI的提示词(第一轮)
我没有直接粘贴全部考题,而是使用前面整理的需求澄清清单给到AI,要求输出pandas脚本,重点要求:不要修改原文件,处理空文件、清洗后无有效数据异常,输出4个sheet。
2.AI生成初稿存在的问题(人工Code Review发现)
- 初稿没有捕获PermissionError,当Excel打开输出文件时直接抛出Errno13堆栈;
- 没有判断清洗之后数据行数为0的场景,空数据也会生成空白报表;
- 缺少控制台友好中文提示,全部是程序原生报错;
- groupby聚合没有做排序,报表阅读性差。
3.人工干预修改点
- 增加文件是否存在前置判断;
- 捕获写入时的PermissionError,输出提示用户关闭Excel;
- 添加清洗后行数判断,无有效数据直接终止;
- 对统计结果按销售额降序排序;
- 打印日志,方便调试看原始行数、清洗后行数。
关键:AI负责写pandas读写、groupby聚合这类机械代码;人负责定义异常边界、校验逻辑、审查风险,不能完全放任AI生成直接运行。
八、复盘总结
1.哪些交给AI完成
- pandas读取Excel、多sheet写入模板代码;
- groupby分组聚合的语法;
- DataFrame去重、dropna缺失值清洗的基础代码。
2.哪些必须自己拍板、人工审查
- 梳理完整需求澄清清单,定义异常边界;
- 判断关键字段是哪些,确认哪些行应该被过滤;
- 识别风险:文件被占用的权限异常、空数据场景,AI很容易漏掉这类边界;
- 验证统计结果:拿少量手工数据,核对脚本输出销售额是否和手算一致;
- 禁止修改原始文件,确认代码没有写回输入文件。
3.遇到的风险和坑
- PermissionError:13权限拒绝,最容易踩坑,AI经常忘记处理Excel文件被占用的场景;
- 如果不做行数校验,全脏数据的时候会生成一份无意义报表,误导使用者;
- 区分哪些字段是关键字段,不能无脑全部字段dropna,会错误丢掉有效业务数据。
4.Vibe Coding感悟
Vibe Coding不等于AI全自动写代码,人是总指挥。如果直接把一大段考题丢给AI,AI经常会忽略边界条件、异常处理。先把需求拆解、输入输出、异常场景写清楚,再分段交给AI生成;每一小段代码运行验证,人工review风险点,最后做整体测试,才能得到健壮可用的程序。
九、拓展思考
- 当前代码可以继续优化:写入Excel采用临时文件原子替换,防止脚本中途崩溃生成损坏的report.xlsx;
- 可以增加日志模块,把运行日志输出保存到日志文件,而不是仅仅打印控制台。