故事从每个月的第一天说起。
上午9点,运营晓彤打开邮箱,收到三封邮件:
销售部发来“10月订单明细.xlsx”,3000行,客户ID、产品名称、金额、下单日期。
财务部发来“10月回款记录.xlsx”,2800行,客户ID、回款金额、到账日期。
产品部发来“产品清单.xlsx”,200行,产品ID、产品名称、单价、分类。
晓彤的任务:下午5点前交一份“销售月度报表”,包含三个部分:
每个客户的订单总额和回款比例(需要跨表匹配)。
清洗掉格式错误的数据(比如日期列有的是“2024.10.1”,有的是“10/1/24”,有的是“2024-10-01”)。
自动生成一张各产品类别的销售额柱状图,插进PPT。
她深吸一口气,开始干活。
先用VLOOKUP把回款匹配到订单表,发现客户ID格式不一致——订单表里是“C_001234”,回款表里是“1234”。手动改格式花了40分钟。
日期列更崩溃,有200多行格式不对,筛选、替换、分列,折腾了一个小时。
最后做图表,选中数据、插入柱状图、调颜色、改标题、导出图片……又过了半小时。
抬头一看,下午3点了,连午饭都是对着屏幕扒拉的。
“每个月都来一次,比大姨妈还准时。”她苦笑着说。
后来,我们给她做了一个办公Agent——专门干Excel脏活累活的那种。现在她每个月只花15分钟:打开Agent,上传三个文件,喝杯咖啡,回来就收到一份已经处理好、带图表的报表。
这篇文章,我就把那个Agent怎么做跨表匹配、格式清洗、自动图表生成的完整思路掰开来讲。不绕弯子,直接上能用的代码逻辑和避坑指南。
一、先让Agent理解:“我要什么”
晓彤的需求其实很固定,但说给机器听时,需要把它拆成步骤。
我们给Agent的指令模板长这样(自然语言即可):
输入:
- 订单表:列名 [客户ID, 产品名称, 金额, 下单日期]
- 回款表:列名 [客户ID, 回款金额, 到账日期]
- 产品表:列名 [产品ID, 产品名称, 分类, 单价]
任务:
- 将订单表和回款表按客户ID匹配,计算每个客户的订单总额、回款总额、回款比例。
- 清洗所有日期列:统一转成 YYYY-MM-DD 格式,无效值标记为“错误日期”。
- 根据产品分类,生成各分类销售额的柱状图,保存为PNG。
输出:一个清洗后的合并表 + 一张柱状图
Agent拿到这个指令后,不会直接“理解”,而是调用一系列工具函数。这些函数我们提前写好,Agent只负责按顺序调用。
二、跨表匹配:不用VLOOKUP,用“模糊+精确”两步法
跨表匹配最大的坑:两个表的关联键格式不一致。
晓彤那个例子,订单表客户ID是“C_001234”,回款表是“1234”。VLOOKUP抓瞎,只能手动给几百行加前缀或截断。
我们的Agent用了两步策略:
第一步:自动探测格式差异
Agent先读取两个表的客户ID列,抽样分析格式特征:
订单表:值类似 C_001234、C005678(带C前缀,后面跟数字)
回款表:值类似 1234、5678(纯数字)
Agent判定:两者差异在于“前缀C”和“前导零”。于是自动生成一个清洗规则:去掉订单表的C,再把字符串转整数去前导零。
第二步:先精确匹配,再模糊匹配
匹配的过程中总有漏网之鱼。比如订单表有“C_01234”,回款表有“1234”没问题,但回款表如果有“1234-旧系统”这种带后缀的,精确匹配就会失败。
Agent的匹配逻辑:
精确匹配:清洗后的ID完全相同。
模糊匹配:对未匹配上的行,用Levenshtein距离(编辑距离)计算相似度,相似度>0.85就自动匹配,并标记“模糊匹配”。
人工兜底:仍然匹配不上的行,Agent将其单独输出为一个“待处理”表,让晓彤最后看一眼(通常只有不到1%)。
结果是:3000条订单与2800条回款,匹配成功率达到97%,剩下的几十条是真正的数据错误(比如回款表多了个空格,或者订单表有重复ID)。
避坑提醒:不要用Agent去做100%的全自动匹配。设计一个“低置信度”门槛,把拿不准的交给人。否则你会花更多时间调试。
三、格式清洗:比Excel的“分列”聪明100倍
清洗是Excel苦力活中最恶心的一环。常见脏数据有:
日期格式五花八门:2024.10.1、10/1/24、2024-10-01、1-Oct-24
数字里混着单位:2,000(千分位逗号)、¥300(货币符号)、1.2k(英文缩写)
空白和空格:单元格里有看不见的 或全角空格
不同系统的编码:繁体、简体混用,甚至乱码
我们的Agent内置了一个“清洗工具箱”,每个工具对应一种常见问题。
3.1 日期统一
Agent调用date_normalize函数,原理是用dateutil.parser(Python)或类似的解析器,尝试常见格式。实在解析不了的,扔给大模型做一次猜测(比如“Oct 1, 2024”这种)。
伪代码逻辑
def normalize_date(cell):
if pd.isna(cell): return "错误日期"
for fmt in ["%Y-%m-%d", "%Y.%m.%d", "%d/%m/%Y", "%m/%d/%y", "%d-%b-%y"]:
try:
return datetime.strptime(str(cell), fmt).strftime("%Y-%m-%d")
except:
continue
# 交给LLM兜底
return llm_guess_date(cell)
实测可以覆盖98%的日期格式。
3.2 数字清洗
对于金额列,Agent自动去掉货币符号、千分位逗号、单位(比如“k”转1000)。规则也是先抽样探测。
例如发现“金额”列有$1,200、1,200、1.2k三种写法,Agent会:
去掉$和逗号 → 1200
识别1.2k → 1200
统一转成浮点数。
3.3 空白和不可见字符
Agent扫描全表,找到所有看起来空但实际有内容的单元格(比如长度>0但只包含空格、制表符、零宽空格),清空或替换为NaN。
效果:晓彤原来花1小时的清洗工作,Agent在30秒内完成。而且清洗日志里会记录每一处改动,方便她复核。
四、自动图表生成:不仅画图,还选对图
Excel里插入图表不难,难的是选对图表类型和把图表做得像人做的。
Agent不会自作主张,它遵循一套简单的决策树:
需要对比几类数值 → 柱状图
需要看占比(百分比)→ 饼图或环形图(如果超过5个类别,改用条形图)
需要看趋势随时间变化 → 折线图
需要看相关性 → 散点图
在晓彤的场景里:各产品类别的销售额对比,显然用柱状图最合适。
4.1 数据聚合
Agent先根据产品表把订单里的产品映射到分类(比如“电子产品”、“办公耗材”),然后按分类汇总销售额。
这一步用pandas的groupby和merge,几行代码的事。
4.2 生成图表
我们用了matplotlib + seaborn,封装成一个函数auto_chart(data, x_col, y_col, chart_type='bar')。输出保存为PNG,同时返回图片的base64编码,方便直接嵌入飞书文档或邮件。
为了让图表“像人做的”,Agent还会自动:
添加标题(从上下文推断,比如“各产品类别销售额(2024年10月)”)
设置x轴标签旋转(如果文字太长)
在柱子上方显示数值标签
选择配色(用公司品牌色)
4.3 一个真实输出示例
Agent最后生成的图表长这样(文字描述一下):横轴是“电子产品”、“办公耗材”、“家具设备”三个类别,纵轴是销售额(万元)。电子产品的柱子最高,旁边标了“48.2万”。
晓彤只需要把这张图拖进PPT,不需要再用Excel格式刷调半天。
五、把这些串起来:一条Agent调用链
下面是一次完整执行的简化日志,你可以看到Agent是怎么按顺序干活的:
[14:00:01] 收到指令:处理三个Excel文件,生成匹配表和柱状图
[14:00:02] 读取订单表(3000行)、回款表(2800行)、产品表(200行)
[14:00:03] 探测到客户ID格式不一致,自动清洗:订单表去掉前缀"C_",回款表转整数
[14:00:05] 执行跨表匹配:精确匹配成功2730行,模糊匹配成功142行,剩余28行待人工
[14:00:06] 清洗日期列:发现3种格式,统一转为YYYY-MM-DD,纠正错误日期17处
[14:00:07] 清洗金额列:去除货币符号和千分位逗号,转换"1.2k"为1200
[14:00:08] 按产品分类聚合销售额,生成柱状图
[14:00:09] 输出文件:cleaned_report.xlsx, sales_chart.png
[14:00:10] 发送消息给晓彤:“处理完成。待人工处理的28条记录已单独导出,请检查。”
耗时9秒。晓彤收到后,花5分钟看了那28条异常记录(大多是回款表里客户ID写错的),修正后重新跑了一次,完美。
六、三个核心坑(以及怎么用代码绕过去)
坑1:大文件内存爆炸
Excel文件超过10万行时,用pandas.read_excel直接加载可能占几个GB内存。我们的Agent做了两件事:
分块读取:对超大文件,按1万行一块处理,逐块清洗后写回。
类型优化:自动将object类型的列转为category(分类),内存占用降低70%。
坑2:清洗规则不是一次就准
第一次跑的时候,Agent把“10/1/24”解析成了2010年1月24日(因为默认月日顺序错了)。后来我们加了一个地域推断:根据文件创建者的时区或数字格式偏好,猜测是“月/日/年”还是“日/月/年”。同时允许用户在界面上手动纠正一条规则,Agent会记住并应用到下次。
坑3:图表总被嫌弃“不好看”
业务方总想改配色、字体、图例位置。我们的解决方案不是让Agent自动猜审美,而是允许用户上传一个“图表模板”(比如一个空白的Excel,带好喜欢的颜色和样式),Agent生成图表时优先复用模板里的设置。这样既保持了自动化,又把风格决定权握在人手里。
七、如果你也想让Agent替你干Excel的脏活
不一定需要大模型。很多清洗和匹配工作,用pandas + openpyxl + 几条规则就能完成。大模型只用在三个地方:
日期/数字格式的智能猜测(当规则解析失败时)
生成自然语言的清洗日志(便于人理解修改了什么)
处理极不规范的表格(比如合并单元格、多行标题)
剩下的,用代码就可以。
晓彤现在每个月第一天的早上,会先打开Agent对话框,发送三样东西:三个Excel文件,一行字“帮我生成月度报表”。然后她去泡咖啡。等她回来,报表已经躺在文件夹里,图表也备好了。
她说:“以前我觉得Excel熟练就算本事,现在觉得,能把这种本事教给机器才是本事。”
Excel苦力活的终点,不是更熟练地使用VLOOKUP,而是再也不用手动VLOOKUP。 如果你也受够了每个月翻来覆去地跨表匹配、清洗格式、做图表,不妨从这个月开始,给自己写一个最简单的脚本——比如先搞定“日期统一格式”这一件事。你会发现,从那里起步,Agent离你并不远。