Excel 数据分析报表
规矩(每次都要遵守)
- 不改原文件。 脚本只读原表,报表、Word 报告、脱敏副本一律另存为新文件(原文件名后面加「_分析报表」「_分析报告」「_脱敏」,重名自动加 (2)(3))。不要用任何别的办法去改用户的原表。
- 先体检,再分析。 第一次拿到表,先跑
check,把体检清单用大白话告诉用户(表头在第几行、发现了哪些问题、打算怎么处理),再出报表。重复行要不要去掉、哪列才是金额这类事,问用户再定。 - 结论只说数字里的事实。 不猜原因、不下判断、不给经营建议。需要原因的地方照脚本写「原因待分析」。数字一律以脚本输出为准,不要心算、不要自己改。
- 隐私。 全部在本机处理,不联网、不上传。体检发现身份证号、手机号时,提醒用户:报表要发给别人就加
--mask,或者用mask单独导出脱敏副本。 - 组件缺了只提示,不自动装。 脚本会告诉用户要运行哪条安装命令,由用户自己决定装不装。
- 跟用户说话不提命令参数和程序里的名字,只说「按月份汇总」「去掉重复行」这类话。
- 先定统计口径。 汇总前说明统计对象、日期范围、金额字段、分组字段,以及原表合计行、空值、异常值和重复记录分别如何处理;脚本猜列时先展示识别结果,关键口径有歧义就先问清。
- 异常不等于错误。 不静默删除或“修正”异常值。把数据问题、计算结果和原因解释分开;标明实际覆盖的行数、日期范围和缺失字段。无法由当前数据证明的原因或因果关系明确标为未知。
- 审批报表保留复核线索。 用户要求对账或用于审批时,说明输入文件和工作表、使用字段、筛选条件、排除行数及原因;如果用户提供控制总额,单列差额。只有脚本结果或源表能支持的数字才能进入汇总;差异未解释前标为待复核。
用法
脚本:python {baseDir}/scripts/excel_report.py <子命令> <文件路径> [选项],路径有空格要加引号。
| 子命令 | 做什么 | 会不会动原文件 |
|---|---|---|
check 文件 |
看表结构(每列是数字/日期/文字)+ 数据体检 + 猜是哪类表 | 只读 |
report 文件 |
生成报表 xlsx(可加 Word 报告) | 只读,另存新文件 |
mask 文件 |
导出脱敏副本(身份证留前 6 后 4,手机号留前 3 后 4) | 只读,另存新文件 |
report 常用选项:
| 选项 | 意思 |
|---|---|
--scene 销售/考勤/费用/成绩/问卷 |
用场景模板;不写自动判断 |
--by 列1,列2 |
按哪 1~2 列分组(写了就是自定义汇总,相当于透视表) |
--value 列 |
汇总哪一列数字;不写就数行数 |
--agg 求和,平均,计数,最大,最小 |
算法,可写多个,第一个是主指标;默认求和 |
--period 日/周/月/季度/年 |
日期列按什么粒度归并,默认按月 |
--top N |
只列前 N 名(合计仍含全部) |
--col 含义=列名 |
自动认错列时手动指定,如 --col 金额=实收、--col 日期=下单时间、--col 上班=签到 |
--dedup |
先去掉完全重复的行 |
--mask |
报表的原始数据页把身份证号、手机号打星号 |
--docx |
另外生成 Word 分析报告(结论 + 表格 + 图) |
--sheet 名称 |
指定工作表;不写用第一个有数据的 |
--out 路径 |
报表保存位置(不能和原文件同名) |
--outlier sigma |
异常值改用 3 倍标准差(默认四分位法) |
考勤:--work-start 9:00 --work-end 18:00 --grace 5 |
上下班时间、迟到宽限分钟 |
费用:--limit 500 或 --limit 差旅=3000,餐饮=200 |
报销标准;表里有「标准/限额」列时自动用 |
成绩:--full 150 --pass-score 90 --excellent 120 |
满分、及格线、优秀线(默认 100 / 60% / 85%) |
--col 能用的含义:日期、地区、产品、金额、数量、单价、姓名、部门、类别、上班、下班、状态、班级、科目、分数、标准、学号。
大白话 → 怎么做
| 用户说 | 怎么做 |
|---|---|
| 「帮我看看这个表有没有问题」 | check 文件,把体检清单念给用户 |
| 「按月份和地区汇总销售额,做成报表」 | report 文件 --by 日期,地区 --value 销售额(日期列自动按月;列名按 check 的结果填) |
| 「做个销售报表」「看看哪个产品卖得最好」 | report 文件 --scene 销售(按月、按地区、产品 TOP10、月份×地区) |
| 「按季度看」「按周看」 | 加 --period 季度 / --period 周 |
| 「各部门平均工资是多少,最高最低也要」 | report 文件 --by 部门 --value 工资 --agg 平均,最大,最小 |
| 「每个销售员签了几单」 | report 文件 --by 销售员(不写 value 就是数行数) |
| 「只要前 5 名」 | 加 --top 5 |
| 「统计一下这个月谁迟到早退了」 | report 文件 --scene 考勤;公司 9:30 上班就加 --work-start 9:30 |
| 「报销按部门和类别汇总,单笔超过 500 的标出来」 | report 文件 --scene 费用 --limit 500 |
| 「差旅标准 3000、餐饮 200,看谁超了」 | report 文件 --scene 费用 --limit 差旅=3000,餐饮=200 |
| 「算一下各科平均分、及格率,排个名」 | report 文件 --scene 成绩;满分 150 就加 --full 150 |
| 「把问卷结果统计一下」 | report 文件 --scene 问卷(选择题频数和占比,多选、打分题都认;填空题跳过) |
| 「顺便出个 Word 报告,我要发给领导」 | 加 --docx;表里有手机号/身份证号就再加 --mask |
| 「里面有重复的,去掉再算」 | 加 --dedup |
| 「把身份证号和手机号打码,我要发出去」 | mask 文件;要指定列就加 --cols 列1,列2 |
| 「金额那列认错了,应该用实收」 | 加 --col 金额=实收 |
| 「为什么三月份下降了?」 | 只说数字(下降多少、哪个地区/产品降得多),原因请用户结合实际情况判断,不要编 |
报表里有什么
- 原始数据:原表原样复制(含标题行和合计行),不做任何改动;加
--mask时只把身份证号、手机号中间位换成星号。 - 数据体检:每一项问题、涉及的列、行号、处理方式。表里自带的合计行不参与计算(避免重复相加);数字存成文本照常当数字算;数字列里的文字、认不出的日期跳过并注明;异常值照常计算、只做标记。
- 汇总:每张表带标题,表头加粗,千分位、百分比格式,合计行加粗;每列最大值标绿、最小值标红。时间维度按时间排序并算环比(和上一期比)、同比(和去年同期比,数据里有去年才算);其他维度从大到小排并给排名。
- 图表:Excel 原生柱状图、折线图、饼图(数据跟汇总页联动)。
- 结论:规则生成,如「2026-03 的销售额最高,为 107,399,环比增长 …」;变化大的地方写「原因待分析」。
- Word 报告(可选):主要结论、数据体检、各汇总表;装了画图组件就配图,没装就只有表格和文字。
需要的组件
- 必须:Python 3.8+、openpyxl(读写 Excel)。缺了脚本会提示
pip install openpyxl。 - 可选:pandas(数据多时分组更快,没有就用 Python 自带功能,结果一样);python-docx(Word 报告);matplotlib(Word 报告里的图)。缺了只提示,不影响 Excel 报表。
不做什么
- 不修改、不覆盖、不删除用户的原文件;不写回原表、不在原表里加 sheet。
- 不联网、不上传数据,不调用任何在线服务。
- 不编造原因、不做预测、不给经营或投资建议;结论里只有表格里能算出来的数字。
- 不自动安装任何组件。
- 不读老版本 .xls 和 WPS 的 .et 格式(请用户另存为 .xlsx);不破解有密码的文件。
- 不处理需要联表的多文件合并(一次只分析一个工作表)。
- 不把数据相关性当作经营原因,不把未解释的对账差异标为已核平。