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。
  • 数据类型静默转换、跨表引用断裂是另外两个高频坑,都要在任务描述里预先声明。
  • 口诀:动公式或动被引用数据,就要重算。
  • 表格交付三步:改 → 算 → 看。

延伸阅读