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 出来的格子就是缓存过期处。
  • 校验三项:公式能否求值、结果是否合理、依赖是否完整;跨表引用断裂是静默的。
  • 大表先重算关键区域;表格交付三步:改 → 算 → 看。

延伸阅读