2.6 office-recalculate:让公式结果可信
一句话定位
刷新电子表格公式缓存,并校验计算结果。官方描述:“Refresh spreadsheet formula caches and verify calculated values.”
两个动词,两个动作:先重算,再校验。它是表格类任务交付前的最后一道关。
为什么单靠 office-xlsx 不够
Excel 文件里同时存两样东西:公式本身和上次算出来的值。前者是规则,后者是缓存。
这个设计的出发点是性能:打开一个几万行的工作簿,不需要把每个公式重新算一遍,直接读缓存。但程序化修改表格时,写入了新公式或改了被引用的单元格,缓存不会自动更新。用户一打开,看到的是旧值——公式栏显示新公式,单元格显示旧数字,极其容易误判。
误判的后果分两种。轻度的:你以为改完了,其实显示的是旧结果,拿去汇报才发现数字不对。重度的:旧值看着合理,没人发现异常,错误数据直接进入决策。第二种更危险,因为它不报错。
office-recalculate 就是专门补这一刀的:驱动计算引擎真正跑一遍,把缓存刷新成当前公式的真实结果,然后校验。office-xlsx 负责把操作做对,这个技能负责让显示出来的值对。
什么时候必须用它
| 场景 | 是否必须 |
|---|---|
| 新建公式(SUM / VLOOKUP / IF) | 必须 |
| 修改了被引用的单元格 | 必须 |
| 增删行列导致引用偏移 | 必须 |
| 从其他程序生成 xlsx | 必须 |
| 只改文本、不动数字 | 不必 |
规律很明显:判断标准是“动没动公式或它依赖的数据”,而不是“改没改文件”。 只要动了其中任何一样,缓存就有过期风险。
逐个说一遍。新建公式不用说,公式刚写进去,缓存里根本没有对应值。修改被引用单元格是最典型的:汇总行的 SUM 没动,但明细改了,缓存还是旧明细算出来的结果。增删行列会让引用整体移位,公式文本可能被自动修正,但缓存不会。从其他程序生成的 xlsx 更要注意——写入方有没有算缓存,你并不知道,默认当它没算。
一条记忆口诀:动公式或动被引用数据,就要重算。
拿不准的时候,重算一遍的成本远低于交付一份值不对的表格。
典型任务
任务一:交付前重算。
用 office-recalculate 技能刷新 report.xlsx 的所有公式,
然后抽查汇总行与上月数字是否一致,报告不一致的行。
任务二:定位“公式对但值不对”。
用 office-recalculate 技能重算 report.xlsx 后,
对比重算前后的值,列出所有发生变化的单元格。
第二种用法其实是个诊断技巧:重算前后 diff 出来的单元格,就是原本缓存过期的地方。
这个技巧的价值在于定位。拿到一份“值不对”的表格,逐格手查不现实;重算前后对一遍,发生过变化的格子全部浮出来,再顺着公式找依赖链,问题范围立刻缩小。diff 结果为空,说明缓存本来就是新的,问题在别处——这本身就是有价值的排除法结论。
顺手还能发现意外:某些你以为没动公式的区域发生了变化,说明有隐藏的依赖关系你没意识到,这往往是重构表格时最想抓住的信息。
校验校验的是什么
这个技能的收尾动作是“验证计算结果”,具体包括:
| 校验项 | 说明 |
|---|---|
| 公式能否求值 | 有没有 #REF!、#NAME? 这类错误 |
| 结果是否合理 | 与邻近周期、汇总行交叉比对 |
| 依赖是否完整 | 跨表引用是否都能解析 |
三项分别对应三类失败。第一类最明显,错误值直接摆在那。第二类最阴险——公式能算,结果也是数字,但数字不对,只能靠交叉比对发现:汇总行和明细加起来对不对得上,本月和上月比突不突兀。第三类要注意:跨表引用断裂在 Excel 里经常是静默的,只有真正求值才会暴露,所以重算和依赖校验必须一起做。
大表分批重算
几十万行的表全量重算很慢,可以先只重算关键区域:汇总行、报表区、对外呈现的部分。内部明细区的缓存过期,影响的只是打开文件时的初始显示,用户点到那一屏时 Excel 自己会重算。
| 表规模 | 策略 |
|---|---|
| 常规表 | 全量重算,一次到位 |
| 大表 | 先重算关键区域,明细区按需 |
注意“对外呈现的部分”必须覆盖——交付物上看得到的值,一个都不能是旧的。
与其他技能的配合
| 前序 | 本技能 | 后序 |
|---|---|---|
office-xlsx 改公式、改数据 |
刷新缓存并校验 | office-render 看排版,或直接导出 PDF |
三步固定下来:office-xlsx 改 → office-recalculate 算 → office-render 看。详见 2.3 节与 2.5 节。
实践建议
建议一:把它写进交付清单。 表格类交付固定三步,写进清单的好处是不依赖每次都想起来。
建议二:diff 法定位问题。 不确定哪里过期,就重算前后对比。发生过变化的单元格就是过期处。
建议三:大表分批。 先重算关键区域,不要一上来就全量跑。
建议四:重算放在导出 PDF 之前。 表格的最终交付物经常是 PDF,顺序反了,旧值就固化在 PDF 里了。
建议五:别信“公式是对的所以值没问题”。 公式对只说明规则对,缓存旧不旧是另一回事,这正是本技能存在的理由。
小结
- Excel 存公式也存缓存值,程序改表后缓存会过期。
- 判断标准是动没动公式或被引用数据,口诀:动公式或动被引用数据,就要重算。
- 重算前后 diff 是定位“值不对”的利器,diff 出来的格子就是缓存过期处。
- 校验三项:公式能否求值、结果是否合理、依赖是否完整;跨表引用断裂是静默的。
- 大表先重算关键区域;表格交付三步:改 → 算 → 看。
延伸阅读
- 官方 Office 技能族说明:dsh-skill-office 包
- 上游技能:2.3 office-xlsx
- 视觉把关:2.5 office-export-pdf 与 office-render
- 技能机制基础:1.1 skill 是什么
