2.3 office-xlsx:Excel 与公式校验
一句话定位
读取、创建、编辑并校验 Excel 工作簿、数据与公式。官方描述:“Read, create, edit, and validate Excel workbooks, data, and formulas.”
比 Word 技能多了一个关键词:公式。这一个词把表格类任务的难度抬高了不止一个档次,因为程序改表格和人在 Excel 里改表格,行为完全不同。
痛点一:公式值是缓存的,可能是旧的
这是自动化处理表格最隐蔽的坑,值得把机理讲透。
Excel 文件里同时存两样东西:公式本身和上次算出来的值。前者是规则(怎么算),后者是缓存(上次算到多少)。Excel 这么设计是为了性能——打开一个几万行的工作簿时,不需要把每个公式重新算一遍,直接读缓存。
问题出在程序化修改上:程序写入了新公式、或者改了被引用的单元格,但缓存不会自动更新。用户一打开,看到的是旧数字——公式栏显示新公式,单元格显示旧数字。公式和值对不上,极其容易误判:你以为改完了,其实显示的是上个月的结果。
这个坑专门有一个技能来补:office-recalculate 驱动计算引擎真正跑一遍,把缓存刷新成当前公式的真实结果。本技能负责把造成缓存过期的操作做对,重算交给它,两者配合使用。
痛点二:数据类型被静默转换
一列“001”读进来变成 1,前导零直接消失;身份证号十八位,超出普通数字精度,尾数被抹掉;邮编、编号、电话同理。日期也会中招:2026/10/22 在某些解析器里变成一串序列号。
这个坑的阴险之处在于静默:没有报错,没有警告,数据看着还挺整齐,直到你对账时才发现对不上。Excel 的默认行为就是把像数字的文本当数字处理,程序读文件时同样如此。
对策只有一个:涉及编号类数据,在任务描述里预先声明格式。写清“订单号按文本、保留前导零”,比事后补救省事得多。
痛点三:跨表引用一改就断
=Sheet2!B7 这种跨表引用,在增删行列之后,指向的可能已经不是原来那个单元格。Sheet2 里插了一行,B7 变成 B8,公式却还指着 B7——数字全错,但不报错。
引用断裂比公式写错更难发现:错误值是合理的数字,只是不是你想要的数字。这类问题只有真正求值、和预期交叉比对时才暴露。
多 sheet 的工作簿尤其要小心。sheet 越多、互相引用越密,一次结构调整的影响面越大。动结构之前,先在提示词里写清每个 sheet 放什么、谁引用谁。
校验校验的是什么
office-xlsx 的校验覆盖三块,和 office-recalculate 的校验正好互补:
| 校验块 | 查什么 |
|---|---|
| 数据 | 类型对不对、前导零丢没丢、编号精度 |
| 公式 | 有没有 #REF!、#VALUE!、#DIV/0! 这类错误值 |
| 结构 | 跨表引用能否解析、增删行列后锚点有没有移位 |
本技能校验到“公式文本没问题”为止;缓存里的值对不对,由 office-recalculate 负责。两层校验分开,是因为修改动作和计算动作本来就是两个时刻。
常见错误值速查:
| 错误值 | 含义 |
|---|---|
#REF! |
引用断了,指向的单元格已不存在 |
#VALUE! |
参数类型不对,比如把文本当数字加 |
#DIV/0! |
除数为零 |
#NAME? |
函数名拼错或不存在 |
#N/A |
查找类函数没找到目标 |
看见错误值别急着改公式:先顺着依赖链看它引用区域的数据,很多时候根因在被引用的单元格里。
处理流程
office-xlsx 的流程正是围绕这三点设计的:
读取或创建工作簿
└─ 执行数据与结构操作
└─ 校验数据、公式与结构
└─ 动了公式或被引用数据?
├─ 是 → 联动 office-recalculate 刷新缓存
└─ 否 → 收尾
一条记忆口诀:动公式或动被引用数据,就要重算。
典型任务
任务一:CSV 转规范工作簿。
用 office-xlsx 技能把 sales.csv 转成 xlsx,要求:
1. 订单号列设为文本格式,保留前导零
2. 金额列保留两位小数并设千分位
3. 加汇总行,用 SUM 公式而不是写死数字
4. 完成后校验公式与数据类型
注意第一条:不声明文本格式,订单号的前导零活不过转换。
任务二:数据体检。
用 office-xlsx 技能检查 report.xlsx:
找出所有 #REF!、#VALUE!、#DIV/0! 错误单元格,
列出位置与公式原文,不要修改。
体检类任务的提示词要带“不要修改”——先看清问题再决定动不动手。
任务三:按规则批量改。
用 office-xlsx 技能把“状态”列的取值规范成
待处理/进行中/已完成/已取消 四类,
把不在集合内的值单独列出来给我确认,不要猜。
“不要猜”这三个字在数据清洗里值一整轮返工:集合外的异常值往往是真实业务信号,猜一个归类,错一处就是一处错账。
任务四:按模板建表。
用 office-xlsx 技能创建一份月度台账:明细 sheet 存流水,
汇总 sheet 用 SUMIF 按品类汇总,交叉校验 sheet 比对两个 sheet 的总计。
交叉校验 sheet 是个便宜的自检手段:总计对不上,问题当场暴露,不用等交付后被人发现。
与 office-recalculate 的分工
两者的分工要记牢:
| 技能 | 负责什么 | 不管什么 |
|---|---|---|
office-xlsx |
内容、结构、数据、公式的创建与编辑 | 不驱动计算引擎 |
office-recalculate |
刷新公式缓存并校验计算结果 | 不做内容编辑 |
改完公式后如果发现“公式是对的但值不对”,下一步就是调 office-recalculate。表格类交付可以固定成三步:office-xlsx 改 → office-recalculate 算 → office-render 看。详见 2.6 节。
什么时候不该用它
看一眼几行的数字、做个简单统计,直接让模型读文件回答更快,不必生成 xlsx。office-xlsx 用在产出物本身必须是表格的场景:要发给人填、要带公式、要长期维护的台账。
实践建议
建议一:涉及数字就先声明格式。 在任务描述里写清“订单号按文本、金额保留两位”,比事后补救省事。
建议二:让模型列出改动清单。 批量操作必须附变更清单,否则你无法判断它有没有动不该动的地方。
建议三:公式不要写死值。 明确要求“用公式而不是常量”,这是表格类任务质量的分水岭。写死值的表格,改一个数字就要全文重生成。
建议四:交付前默认过一次重算。 只要这次任务动过公式或被引用的数据,就把 office-recalculate 加进流程,不要等发现值不对再补。
建议五:多 sheet 表格先画结构图。 在提示词里写清每个 sheet 放什么、谁引用谁,比让模型自己猜引用关系稳得多。
建议六:编号类数据全部按文本处理。 订单号、身份证、邮编、电话,宁可都设成文本,也不要赌一次转换的运气。
小结
office-xlsx覆盖工作簿的读取、创建、编辑、校验,重点在公式。- 公式缓存过期是头号隐蔽坑,需配合
office-recalculate。 - 数据类型静默转换、跨表引用断裂是另外两个高频坑,都要在任务描述里预先声明。
- 口诀:动公式或动被引用数据,就要重算。
- 表格交付三步:改 → 算 → 看。
延伸阅读
- 官方 Office 技能族说明:dsh-skill-office 包
- 配套技能:2.6 office-recalculate
- 视觉把关:2.5 office-export-pdf 与 office-render
- 通用表格技能对照:4.1 Anthropic 文档三件套
