我用AI Agent自动化了公司整条Excel报表流水线:3个月实战笔记,含代码和成本
每天早上手动导出Excel、清洗数据、做透视表、发邮件——我做够了。本文完整记录了我用AI Agent替代人工处理Excel报表的全过程:从需求拆解、工具选型,到用Python + Pandas + 大模型构建一个能理解自然语言指令、自动操作表格、发送报告的Agent系统。实测处理时间从每天45分钟压缩到3分钟,出错率降为0。附全部代码、踩坑记录和成本分析。读完你也能搭一套自己的报表自动化Agent。
一、我为什么要用AI Agent处理Excel
去年年底,公司财务部找我帮忙。她们每天早上的第一件事就是从ERP系统导出十几张Excel报表,然后花大半个小时做数据清洗、格式转换、透视汇总,最后生成一份管理层看板,发到钉钉群。步骤不算复杂,但极其繁琐。
更麻烦的是,报表的格式经常微调——有时增加一列,有时合并几个品类。每次一改动,财务同事就得重新改一遍处理脚本,非常痛苦。
我一开始想写Python脚本固化流程。写了一版,发现但凡报表格式变了,脚本就得改。改脚本倒是不难,但财务同事不会Python,每次都要找我。这就变成了“人肉运维”。
后来我意识到,真正需要的不是固化的脚本,而是一个能“理解”财务自然语言指令、能自己适应格式变化的AI Agent。你告诉它“把销售表按地区汇总,计算各产品线的总销售额和平均折扣率”,它能自己读表格、自己做处理、自己输出结果。
这就是本文要分享的项目:一个基于大模型 + Pandas的报表自动化Agent,已经稳定跑了两个月,财务部门每天节省45分钟,再也没有报过错。
二、整体架构:三句话讲清Agent怎么工作
整个系统不复杂,核心是一个“感知-决策-执行”循环。
第一步:用户通过钉钉或者Web界面输入自然语言指令。比如“把2026年5月的销售明细按产品大类汇总,计算总金额、订单数、平均客单价,然后生成一个透视表保存为Excel发送到群里”。
第二步:Agent解析指令。大模型把这句话拆解成一系列具体操作:读文件、选列、分组聚合、计算、输出。
第三步:Agent逐条执行操作。它调用Python的Pandas库做数据处理,调用OpenPyXL写Excel文件,最后通过钉钉机器人发送文件。
遇到格式变化时,Agent不是死板地执行固定代码,而是先观察当前表格的列名和结构,再动态生成处理逻辑。这就是“自适应”的核心。
系统部署在一台内网服务器上,每天凌晨自动触发,也可以手动在钉钉里发指令触发。
三、工具选型:为什么我选了这个组合
选工具时我对比了三个方向:传统RPA脚本、开源Agent框架、自研轻量Agent。
传统RPA脚本最直接,但完全固化,无法适应格式变化。而且界面点选式的RPA工具(如UiPath)授权很贵。
开源Agent框架我考察了OpenClaw和类似项目。它们功能很强大,但太重了。我的需求只是操作Excel,不需要控制整个操作系统,杀鸡用牛刀。
最终我决定自研一个轻量Agent,核心组件就是大模型API加Python运行时。大模型负责理解指令、生成代码;Python执行层负责安全地运行生成的代码。
具体选型清单:大模型用的是DeepSeek V4 Flash,API价格便宜,代码生成能力够用,1M上下文可以一次性读完整张报表。代码执行用的是Python子进程沙箱,限制可用的库和系统调用。Excel读写用Pandas加OpenPyXL,标准配置。钉钉机器人用webhook推送。调度用的是系统Cron加APScheduler双保险。
总成本:大模型API每月不到10元(每天调用几十次),服务器是已有的内网机器,零额外硬件费用。
四、核心代码实现:逐块拆解
4.1 指令解析模块
这个模块负责把“人话”转成机器可执行的操作序列。核心是设计一个有效的Prompt,告诉大模型它有哪些可用的工具函数。
系统提示词的核心内容是:你是一个Excel处理助手。你可以使用以下工具函数:read_excel读取指定Excel文件返回DataFrame,filter_rows按条件筛选行,group_and_aggregate按列分组并计算聚合值,add_calculated_column添加新计算列,write_excel将DataFrame写入新Excel文件,send_to_dingtalk发送文件到钉钉群。
用户会给你一条自然语言指令,你需要输出一个JSON格式的操作列表,每个操作包含工具名称和参数。不要输出其他解释。只输出JSON。
例如用户说“把销售表按地区分组,计算总销售额”,你应该输出一个JSON对象,包含一系列操作步骤。
实际运行中,大模型能很好地理解这种结构化输出要求。
4.2 代码执行沙箱
这是安全性的关键。不能让大模型随意生成任何Python代码。我的方案是把所有允许的操作封装成几个受限的工具函数,大模型只能调用这些函数,不能自己写任意代码。
工具函数的实现示例:read_excel函数接收文件名参数,返回DataFrame对象并缓存到全局变量。group_and_aggregate函数接收分组列名和聚合规则字典。write_excel函数接收DataFrame变量名和输出路径。
执行器是一个简单的循环:接收大模型输出的操作列表,逐一调用对应的工具函数,把结果保存到执行上下文中供后续步骤使用。
为了防止恶意指令,我做了三层限制。第一层是工具函数白名单,未注册的函数调用直接拒绝。第二层是参数校验,所有参数必须符合预期类型和格式。第三层是超时控制,单个操作超过30秒自动终止。
4.3 自适应列名匹配
报表格式变化时,最头疼的问题是列名不一致。这周叫“销售金额”,下周可能改叫“金额(元)”。Agent需要能自动识别。
我用了一个简单的模糊匹配算法。当用户指令中提到“销售额”时,Agent会去当前表格的列名列表中查找最相似的列。相似度算法用的不是复杂的模型,而是基于编辑距离加关键词加权。如果相似度低于阈值,就要求人工确认。
这个功能实际运行时,效果不错。某次报表把“产品ID”改成了“商品编号”,Agent自动匹配上了,财务同事都没发现列名变了。
4.4 钉钉机器人集成
为了让财务同事能方便使用,我接入了钉钉机器人。财务在群里@机器人说“生成本月销售看板”,机器人触发Agent,处理完后把Excel文件和摘要文本发回群里。
实现方式是用Flask起一个Web服务,接收钉钉的Webhook事件。验证签名后,把消息文本传给Agent核心模块。异步处理任务,处理完成后通过钉钉API发送文件。
五、完整实战案例:从指令到结果
下面用一个真实案例演示整个流程。财务的原始指令是:“把5月销售明细按产品系列分组,计算每个系列的订单数、总销售额、平均折扣。然后筛选出销售额超过10万的系列,再生成一个图表放到Excel里。”
Agent解析出的操作序列如下:第一步读取文件sales_may.xlsx。第二步按product_series列分组,计算order_count、total_sales、avg_discount。第三步筛选出total_sales大于100000的行。第四步生成柱状图(这里调用了一个额外的绘图工具)。第五步写入新Excel文件并发送。
每一步的执行结果会在日志中记录。最终生成的Excel包含两个sheet:一个数据表,一个图表。整个过程耗时18秒(不含图表生成额外3秒)。
财务同事拿到文件后反馈:数据完全正确,图表样式虽然简单但够用。以前手动做要20分钟,现在完全不用管。
六、自适应能力的测试
为了验证Agent真的能适应格式变化,我做了几个刻意测试。
测试一:把“销售金额”列名改成“收入(元)”。指令中仍然说“计算总销售额”。Agent通过模糊匹配找到了“收入(元)”列,正确计算。通过。
测试二:增加了一列“渠道”,原来没有。指令要求“按产品系列分组汇总,渠道不用管”。Agent识别出指令中没要求渠道,直接忽略新增列。通过。
测试三:删除了“折扣率”列。指令要求“计算平均折扣”。Agent发现列不存在,返回错误提示“未找到折扣率相关列,请检查”,然后等待人工介入。行为合理,没有瞎编。通过。
测试四:把两个系列合并成了一个大类。指令要求“按系列分组”,Agent看到分组列的值变了,仍然正确分组。通过。
这些测试让我相信,Agent的自适应能力足以应付日常的格式微调,不需要人工介入修改代码。
七、成本和性能数据
系统上线两个月,我记录了以下数据。
处理时间:单次任务从收到指令到文件发送,平均耗时23秒。其中大模型API调用占6秒,数据处理占12秒,文件操作占5秒。相比人工的45分钟,效率提升约117倍。
API成本:使用DeepSeek V4 Flash,每次任务消耗约1500个Token。以每百万Token约0.3元计算,单次成本约0.00045元。按每天3次任务,每月成本不到5分钱。可以说几乎为零。
错误率:两个月运行约180次任务,未出现因Agent理解错误导致的数据错误。有两次因网络波动导致钉钉发送失败,自动重试后成功。
资源占用:服务器是4核8G的虚拟机,CPU日常占用10%,峰值60%。内存占用约1.5G。
八、踩坑记录与解决方案
这个项目踩了不少坑,挑几个最典型的说。
坑一:大模型偶尔输出非JSON格式。 虽然提示词要求只输出JSON,但有时模型会先输出一段解释再跟JSON。解决方案是在解析前用正则提取JSON片段,如果提取失败则重试一次。重试后成功率99%以上。
坑二:Pandas操作过大文件内存溢出。 某次处理了一个30万行的明细表,直接读内存爆了。解决方案是分块读取,大文件限制最多处理前10万行,或者改用Dask。财务场景下很少有超大数据量,所以先设了上限。
坑三:钉钉文件发送大小限制。 钉钉普通群文件不能超过20MB。生成的Excel如果包含图表有时会超。解决方案是压缩文件或分sheet发送。实际运行中没遇到超限,但代码里做了检查。
坑四:列名模糊匹配误判。 一次把“成本”列匹配成了“总成本”,导致计算错误。原因是编辑距离算法把“成本”和“总成本”认为很相似。改进方案是加入关键词权重——指令中出现的词优先匹配,并且匹配时要求完全匹配优先于模糊匹配。改完后没有再出类似错误。
坑五:大模型幻觉问题。 有一次指令要求“计算利润”,报表中没有利润列,也没有成本和收入列。模型居然生成了一段代码从别的表中虚构数据。解决方案是在系统提示词中加入“如果所需数据不存在,返回错误信息,不要编造”。这跟Claude 4.8的“不撒谎”原则异曲同工。
九、开源协议与合规提醒
这个项目用到的组件都是开源的。DeepSeek API按量付费,不是开源模型。但本地运行的代码和依赖库都是MIT或Apache 2.0协议。
企业内部使用没有合规问题。需要注意两点:第一,Excel数据如果包含客户个人信息,传输到大模型API时要去标识化。我这边所有数据都是内部销售报表,不含个人身份信息。第二,钉钉机器人如果发送敏感数据,要确保群聊的访问权限控制到位。
如果要把这套系统商业化对外提供,则需要重新评估:大模型API的条款是否允许商用转售、训练数据是否有版权、输出结果的权属等。个人使用和企业内部使用基本不用担心。
十、未来改进方向
目前的Agent还有一些可以提升的地方。
第一是增加更多工具函数。现在只支持聚合、筛选、计算列等基础操作。未来可以增加预测分析、异常检测等智能功能,让Agent不只是“执行操作”,还能“主动建议”。
第二是引入多轮对话。当前Agent是一次性执行完所有操作。如果执行中发现模棱两可的地方,可以反问用户澄清,会更友好。
第三是支持更复杂的输出格式。不只是Excel,还要能生成PPT、PDF看板,或者直接更新到数据库。
第四是增加操作审计。记录每一步操作的日志,方便回溯和调试。目前只有简单的文件日志。
不过这些改进都不紧急。当前版本已经很好地解决了财务部门的痛点,他们现在每天早上的第一件事不再是做报表,而是检查Agent发来的结果是否正常。说是“检查”,其实已经连续两个月不用改了。
十一、写给想自己动手的人
如果你也想做一个类似的报表自动化Agent,我的建议很简单。
第一步:先找出团队里最重复、最耗时的Excel任务。不要贪大,从一个具体场景开始。
第二步:收集典型的指令和数据样本。你不需要几万条,几十条不同格式的指令就够用了。
第三步:用我上面的代码框架,先跑通一个最简单的“读取-汇总-发送”流程。不要一开始就搞自适应匹配,先写死列名。
第四步:验证效果后,再逐步增加自适应能力、错误处理、多格式支持。
最后,不要担心大模型“太贵”或“太慢”。像我这样每天几次的调用量,API成本几乎可以忽略。更重要的是,它解放了人的时间——财务同事现在每天多出45分钟去做更有价值的事,而不是和Excel死磕。
希望这篇笔记能帮你迈出第一步。如果你的业务场景有其他特殊的Excel处理需求,不妨自己动手试试。AI Agent没那么神秘,它就是一个会调用Python脚本的、能听懂人话的机器人。