
季度末把销售明细表整理成复盘报告再顺手出一版能直接上会的汇报 PPT这件事听起来像是两个独立任务实际上是一条完整的数据加工链路。我过去几个季度都是靠 WorkBuddy 配合 Excel 和 Python 把这条链路跑通的从最初手动复制粘贴到凌晨到现在基本能在半小时内交付一份带结论、带图表、带讲稿逻辑的汇报材料。这篇内容就把我实际用的方法完整拆开包括 WorkBuddy 在其中的定位、Excel 数据怎么预处理、LLM 怎么参与分析和文案生成、PPT 怎么自动化产出以及我踩过的那些坑。适合手里有销售数据、需要定期做复盘汇报的运营、销售支持、数据分析岗也适合想用 LLM 工具提升办公效率但不知道从哪下手的人。1. 先搞清楚 WorkBuddy 在这条链路里到底干什么很多人第一次接触 WorkBuddy会把它当成一个更聪明的 Excel 插件或者自动写 PPT 的工具这个理解偏了。WorkBuddy 本质上是一个任务编排层它把 Excel 数据处理、LLM 推理、文档生成这几件事串起来你给它一个目标它帮你调度中间步骤。理解这一点很关键因为它决定了你应该把哪些工作交给它、哪些工作自己先做好。1.1 WorkBuddy 与 CodeBuddy 的分工差异热词里经常出现 workbuddy 和 codebuddy 一起被搜这两个定位不一样。CodeBuddy 更偏向代码生成和编程辅助你给它一段需求它帮你写函数、调 bugWorkBuddy 偏向业务流程自动化它关心的是把这份季度销售表变成复盘报告这种端到端的任务。做销售复盘这件事核心不是写多复杂的代码而是把数据清洗、指标计算、趋势判断、文案组织、PPT 排版这几步串起来所以 WorkBuddy 更合适。我实际用下来的感受是CodeBuddy 适合处理这一步怎么写的问题比如用 Python 读取 Excel 并统计每个销售大区的环比增长率WorkBuddy 适合处理整件事怎么跑完的问题比如读取本季度销售表生成复盘报告再输出一版 PPT。两者可以配合但不要混用场景。1.2 为什么不用纯手工 纯 LLM 对话有人会问我直接把 Excel 内容复制给 LLM让它写复盘报告不就行了短期可以长期不行。原因有三个数据量问题季度销售表动辄几千行直接粘贴给 LLM 会超出上下文窗口而且 token 消耗巨大。一致性问题每次对话 LLM 的输出格式都不一样你没法保证这一季度和下一季度的报告结构统一。可复现问题手工对话的过程没法沉淀成模板下个季度还得重来一遍。WorkBuddy 的价值就在于把这条链路固化下来数据用 Python 处理分析用 LLM 推理输出用模板渲染每一步都可复现、可调整。1.3 这条链路的整体架构我实际跑的流程大致是这样的数据层Excel 原始销售表包含订单日期、销售大区、产品线、销售额、销售量、客户类型等字段。处理层Python 脚本做数据清洗、指标计算、透视汇总输出结构化的中间数据JSON 或 CSV。分析层把中间数据喂给 LLM让它生成趋势判断、异常归因、下季度建议等文字内容。输出层用模板引擎把数据和文字组装成复盘报告Markdown 或 Word再渲染成 PPT。WorkBuddy 在这四层之间做调度你只需要定义好每一步的输入输出格式它负责串起来。下面几节我按这个顺序展开讲。2. Excel 销售表的预处理别急着喂给 LLM这一步是最容易被忽略的但恰恰决定了后面所有环节的质量。我见过太多人直接把原始销售表丢给工具结果出来的报告数据对不上、口径混乱。Excel 预处理的核心目标是把人看的表变成机器能稳定处理的表。2.1 原始销售表常见的五个脏数据问题我处理过的季度销售表几乎每次都会遇到这几类问题问题类型具体表现处理方式日期格式不统一有的写 2024/1/5有的写 2024-01-05有的写 1月5日统一转为 ISO 格式 YYYY-MM-DD大区名称不一致华东、华东区、东区混用建立映射表统一命名金额带单位12.5万、125,000、125000元混用剥离单位统一为数值空值处理部分行销售额为空根据业务规则判断是补零还是剔除重复订单同一订单号出现多次按订单号去重保留最新状态这些问题如果不在预处理阶段解决后面 LLM 分析出来的结论就是错的。比如华东和华东区被当成两个大区环比数据直接失真。2.2 用 Python 做标准化清洗的实操我习惯用 pandas 做这一步核心代码大概是这样import pandas as pd import re # 读取原始表 df pd.read_excel(季度销售表.xlsx, sheet_name明细) # 日期标准化 df[订单日期] pd.to_datetime(df[订单日期], errorscoerce) df df.dropna(subset[订单日期]) # 大区名称映射 region_map { 华东区: 华东, 东区: 华东, 华南区: 华南, 南区: 华南, 华北区: 华北, 北区: 华北, } df[销售大区] df[销售大区].replace(region_map) # 金额清洗 def clean_amount(val): if pd.isna(val): return 0 s str(val).replace(,, ).replace(元, ) if 万 in s: return float(s.replace(万, )) * 10000 return float(s) df[销售额] df[销售额].apply(clean_amount) # 去重 df df.drop_duplicates(subset[订单号], keeplast) # 输出清洗后的数据 df.to_csv(cleaned_sales.csv, indexFalse, encodingutf-8-sig)这段代码看起来简单但每一步都有讲究。errorscoerce是为了把无法解析的日期变成 NaT 而不是直接报错方便后续排查encodingutf-8-sig是为了让 Excel 打开 CSV 时中文不乱码这个细节很多人踩过坑。2.3 指标计算复盘报告真正需要哪些数清洗完数据之后不要急着把所有字段都喂给 LLM。复盘报告真正需要的指标其实就那几类总量指标季度总销售额、总订单数、平均客单价对比指标环比上季度增长率、同比去年同期增长率结构指标各大区销售占比、各产品线销售占比趋势指标按月销售额走势、按周订单量走势异常指标环比下降超过 20% 的大区或产品线我一般会把这些指标算好输出成一个结构化的 JSON类似这样summary { total_sales: df[销售额].sum(), total_orders: len(df), avg_order_value: df[销售额].mean(), by_region: df.groupby(销售大区)[销售额].sum().to_dict(), by_product: df.groupby(产品线)[销售额].sum().to_dict(), monthly_trend: df.groupby(df[订单日期].dt.to_period(M))[销售额].sum().to_dict(), }这样 LLM 拿到的是已经算好的结论性数据它只需要做解读和归因不需要再做计算。这一点很重要因为 LLM 做算术不可靠但做文字归纳很擅长。把计算和推理分开是整条链路稳定的关键。提示指标口径一定要在预处理阶段定死并且写进报告的方法说明里。我吃过亏有一次环比增长率用了不同的分母口径被领导当场问住。3. 让 LLM 参与分析提示词怎么写才不出废话数据准备好之后下一步是把结构化数据交给 LLM让它生成复盘报告的文字部分。这一步的难点不在于 LLM 能力够不够而在于你怎么问。问得不好它给你一堆本季度销售表现良好同比增长显著这种正确的废话。3.1 复盘报告的文字结构拆解一份能上会的复盘报告文字部分通常包含这几块整体表现概述一句话说清楚这个季度卖得怎么样分维度拆解按大区、产品线、客户类型分别说异常点归因哪些指标偏离预期可能的原因是什么下季度建议基于本季度数据给出可执行的行动建议这四块里第一块和第四块最考验 LLM 的归纳能力第二块和第三块最考验数据的完整性。我的做法是把这四块拆成四次独立的 LLM 调用而不是一次性让它写完整篇报告。这样做的好处是每次调用的上下文更聚焦输出质量更稳定。3.2 提示词模板的实际写法以整体表现概述为例我用的提示词大概是这样你是一名销售运营分析师。以下是某公司 2024 年 Q3 的销售数据摘要 - 季度总销售额{total_sales} 元 - 环比上季度{qoq_growth}% - 同比去年同期{yoy_growth}% - 订单总数{total_orders} - 平均客单价{avg_order_value} 元 请用 3 句话总结本季度整体表现要求 1. 第一句说总量和增长情况 2. 第二句说增长或下滑的主要驱动因素 3. 第三句给出一个需要关注的信号 不要使用表现良好稳步增长这类空泛表述要具体到数字和维度。这个提示词的关键在于最后那句约束。不加这句LLM 大概率会写本季度销售表现良好各项指标稳步增长加了之后它会写本季度总销售额 1250 万元环比增长 8.3%增长主要来自华东大区新客户贡献但华南大区连续两个季度下滑需要关注。3.3 异常归因怎么问才有价值异常归因是最容易出废话的部分。LLM 不知道你的业务背景它只能根据数据猜原因。我的做法是在提示词里把可能的归因方向列出来让它从里面选并给出数据支撑以下是本季度环比下降超过 15% 的维度 {abnormal_data} 请针对每个异常维度从以下可能原因中选择最可能的 1-2 个并说明数据依据 - 季节性波动 - 大客户流失 - 产品竞争力下降 - 区域市场政策变化 - 销售团队人员变动 - 促销活动结束 如果数据不足以判断请明确说数据不足建议补充 XX 信息不要编造原因。这个不要编造原因的约束非常重要。LLM 在没有足够信息时倾向于编一个听起来合理的解释这在复盘报告里是致命的。明确告诉它可以说不知道反而能提高输出可信度。3.4 用 LLM 生成下季度建议的边界下季度建议这块我的原则是LLM 只做基于数据的推断不做业务决策。比如它可以建议华南大区连续下滑建议下季度重点复盘该区域客户结构但不应该建议下季度砍掉华南大区的市场预算。前者是数据驱动的观察后者是需要业务判断的决策。我在提示词里会明确写请基于本季度数据给出 3 条下季度行动建议。要求 1. 每条建议必须对应一个具体的数据发现 2. 建议要可执行不要写加强管理提升效率这类空话 3. 不要涉及预算调整、人员裁撤等需要管理层决策的事项这样出来的建议基本可以直接放进报告里不需要大改。4. 从复盘报告到汇报 PPT自动化产出的关键细节文字报告有了下一步是把它变成 PPT。这一步很多人觉得必须手工做其实用 Python 配合模板完全可以自动化。我用的是 python-pptx 库配合一套预先设计好的母版。4.1 为什么不用 LLM 直接生成 PPT热词里有人搜deepseek 生成的内容想做成 PPT 用什么工具我的建议是LLM 负责生成内容PPT 生成交给专门的库或工具。原因很简单LLM 生成 PPT 的排版不可控它可能给你一个文字溢出、图表错位的文件你还得手工修反而更慢。正确的分工是LLM 输出结构化的内容标题、要点、数据Python 负责把这些内容填进设计好的模板。这样每次生成的 PPT 版式一致只需要微调内容。4.2 PPT 模板的页面结构设计一份季度复盘 PPT我通常设计这几页页码页面类型内容来源1封面季度名称、汇报人、日期2核心结论LLM 生成的 3 句话概述3整体数据总量指标 环比同比4大区拆解各大区销售额柱状图 文字说明5产品线拆解各产品线占比饼图 文字说明6异常分析异常维度列表 归因7下季度建议3 条建议8附录数据口径说明这个结构不是固定的但核心逻辑是结论先行、数据支撑、建议收尾。汇报场景下领导最关心的是第 2 页和第 7 页中间的拆解页是支撑材料。4.3 用 python-pptx 填充内容的实操核心代码逻辑大概是这样from pptx import Presentation from pptx.util import Inches, Pt from pptx.chart.data import CategoryChartData from pptx.enum.chart import XL_CHART_TYPE prs Presentation(复盘模板.pptx) # 填充封面 slide prs.slides[0] slide.shapes.title.text 2024年Q3销售复盘 slide.placeholders[1].text 汇报人张三\n日期2024-10-15 # 填充核心结论页 slide prs.slides[1] slide.placeholders[1].text summary_text # LLM 生成的概述 # 填充大区拆解页插入柱状图 slide prs.slides[3] chart_data CategoryChartData() chart_data.categories list(region_sales.keys()) chart_data.add_series(销售额, list(region_sales.values())) slide.shapes.add_chart( XL_CHART_TYPE.COLUMN_CLUSTERED, Inches(1), Inches(2), Inches(8), Inches(4), chart_data ) prs.save(Q3销售复盘.pptx)这里有个细节模板文件里的占位符索引placeholders[1]取决于你模板的设计不是固定的。我建议先在模板里把每一页的占位符命名好然后用名称而不是索引来定位代码更稳定。4.4 图表数据与文字结论的一致性校验自动化生成 PPT 最容易出的问题是图表显示的数据和文字里写的数字对不上。比如图表里华东大区是 320 万文字里写成了 350 万。这种错误在汇报现场被发现非常尴尬。我的做法是在生成 PPT 之前加一道校验def validate_consistency(text, data_dict): 检查文字中提到的数字是否与数据一致 numbers_in_text re.findall(r\d\.?\d*万, text) for num_str in numbers_in_text: num float(num_str.replace(万, )) * 10000 if not any(abs(num - v) / v 0.01 for v in data_dict.values()): print(f警告文字中的 {num_str} 在数据中找不到匹配)这个校验不能保证 100% 准确但能拦住大部分明显的错误。跑一遍校验再交付心里踏实很多。5. 整条链路跑通后我踩过的坑前面讲的都是应该怎么做这一节讲我实际做的时候遇到的问题。这些坑在官方文档里基本不会写但每一个都让我多花了不少时间。5.1 Excel 加载项被禁用导致工具调不起来热词里有人搜excel 加载项被禁用我遇到过一模一样的问题。WorkBuddy 如果依赖 Excel 加载项来读取数据而你的 Excel 因为安全策略禁用了加载项整个流程就跑不起来。排查思路是这样的先看 Excel 的文件 - 选项 - 加载项里相关加载项是不是在禁用的应用程序加载项列表里。如果是把它移回启用列表重启 Excel。如果重启后又被禁用说明是组策略或者注册表层面的限制需要找 IT 处理。我的建议是不要把整条链路的关键依赖放在 Excel 加载项上。我现在都是先用 Python 把 Excel 数据读出来存成 CSV后续所有处理都基于 CSV这样即使 Excel 加载项出问题也不影响主流程。5.2 LLM 输出的数字和实际数据对不上这是最危险的一类问题。LLM 在生成文字时有时会顺手改一下数字比如把 8.3% 写成 8.5%或者把 1250 万写成 1200 万。这种错误很隐蔽因为读起来很顺。我的应对方法是所有出现在报告里的数字都必须来自我预先算好的数据字典LLM 只负责把数字填进句子里不负责生成数字。具体做法是在提示词里把数字用占位符标出来比如本季度总销售额 {total_sales} 元环比增长 {qoq_growth}%LLM 输出后再用实际值替换。5.3 PPT 图片导出后模糊的问题热词里有人搜ppt 图片无损导出这个问题我也遇到过。用 python-pptx 插入的图表如果直接截图放进报告分辨率会掉。正确做法是让 python-pptx 直接生成矢量图表或者用 matplotlib 生成高分辨率 PNGdpi 设为 300 以上再插入。我现在的做法是PPT 里的图表用 python-pptx 原生图表这样在 PPT 里可以编辑如果需要导出成图片发给别人用 matplotlib 单独生成一份 300dpi 的版本。5.4 季度口径不一致导致环比数据失真这个问题最隐蔽。比如 Q2 的数据是按自然季度4-6 月统计的Q3 的数据是按财年季度7-9 月统计的两者一对比环比增长率就没有意义了。我的做法是在预处理阶段就明确标注数据的时间口径并且在报告的方法说明里写清楚。如果发现口径不一致要么统一口径重新算要么在报告里明确说明本季度数据口径与上季度不同环比数据仅供参考。5.5 WorkBuddy 任务链中断后的恢复WorkBuddy 跑长任务时如果中间某一步失败比如 LLM 调用超时整个链路会中断。如果每次都从头跑很浪费时间。我的做法是把每一步的中间结果都落盘保存比如清洗后的 CSV、算好的指标 JSON、LLM 生成的文字。这样如果第 4 步失败我可以从第 4 步重新跑不用重头来。这个习惯看起来麻烦但实际省的时间远超预期。6. 把这套流程沉淀成可复用的季度模板跑通一次不算本事每个季度都能稳定跑通才算。我现在的做法是把整条链路做成一个可配置的模板每个季度只需要替换输入数据和调整几个参数。6.1 配置文件的设计我把所有可变的参数抽到一个 YAML 配置文件里quarter: 2024Q3 input_file: data/2024Q3_sales.xlsx output_dir: output/2024Q3 region_mapping: 华东区: 华东 东区: 华东 华南区: 华南 metrics: - total_sales - qoq_growth - yoy_growth - by_region - by_product llm: model: your-model temperature: 0.3 ppt_template: templates/quarterly_review.pptx这样下个季度只需要改quarter和input_file两个字段其他都不用动。temperature设成 0.3 是为了让 LLM 输出更稳定复盘报告不需要创意需要的是准确和一致。6.2 每一步的输入输出契约为了让链路稳定我给每一步都定义了明确的输入输出格式清洗步骤输入原始 Excel输出标准化 CSV字段名和类型固定指标步骤输入标准化 CSV输出指标 JSON键名固定分析步骤输入指标 JSON输出文字 JSON包含 overview、breakdown、anomaly、suggestion 四个键渲染步骤输入文字 JSON 和模板输出 PPT 文件只要每一步的输出符合契约下一步就能正常处理。任何一步出问题都能快速定位是哪一步的契约被破坏了。6.3 季度之间的对比积累这套流程跑几个季度之后会积累出一批历史数据。这时候可以做一些跨季度的分析比如华东大区连续四个季度的走势、产品线 A 的季节性规律。这些分析在单季度复盘里看不出来但拉长时间线就很有价值。我现在的做法是每季度跑完之后把核心指标追加到一个历史数据表里年底做年度复盘时直接调用。这个习惯让年度复盘的工作量大幅下降因为大部分数据已经现成了。6.4 什么情况下应该放弃自动化最后说一个反直觉的建议不是所有季度都适合跑自动化。如果某个季度发生了重大业务变化比如公司重组、产品线大调整数据结构可能和之前完全不同这时候硬套模板反而会出问题。我的判断标准是如果本季度数据字段和上季度差异超过 30%就手工处理不要强行套模板。自动化是为了提效不是为了自动化而自动化。该手工的时候手工该自动的时候自动这才是务实的做法。这套流程我跑了四个季度从最初的两天工作量压缩到现在半天以内而且报告质量比手工做的更稳定。核心经验就一条把计算和推理分开把数据和文案分开把每一步的中间结果落盘。做到这三点整条链路就稳了。