摘要与阅读导航
近两年,越来越多的办公场景开始把表格建模、公式补全、数据清洗这类工作交给以 Microsoft 365 Copilot 为代表的大模型助手。一个被反复提及的现象是:原本只有几百 KB、打开即用的工作簿,在 Copilot 参与改写公式之后,体积膨胀到数 MB,滚动卡顿、保存缓慢、重算时间从秒级变成分钟级。表面看是"AI 把文件改坏了",但把现象拆开,真正的问题往往不在模型本身,而在于模型生成的公式结构——尤其是整列引用的计算列、跨表条件格式、以及易失函数——共同改变了工作簿的依赖图与重算调度。
本文的主线可以概括为一句话:Copilot 不是性能问题的直接制造者,它是"依赖图放大器"。模型倾向于生成语义正确但结构冗余的公式,这些公式在 Excel 的计算引擎里被展开成规模远超预期的依赖节点,再叠加条件格式的格式重算与文件序列化开销,最终表现为文件变大、变慢。围绕这条主线,本文依次讨论问题定义、计算引擎原理、量化诊断方法、工程化治理路径与前沿预判,并给出可直接落地的操作步骤。
阅读建议:如果你只关心"怎么修",可直接跳到第四章的治理清单;如果你需要向团队解释"为什么",第二、三章提供了可验证的机制分析;第五章讨论边界条件与反例,避免把结论绝对化。
目录
- 一、问题的提出:从"文件变大"到"依赖图爆炸"
- 二、计算引擎视角:Excel 如何重算一个工作簿
- 三、量化诊断:把"变慢"拆成可测量的指标
- 四、工程化治理:从公式重写到文件结构优化
- 五、边界条件、反例与常见误判
- 六、结论与展望
- 参考文献与声明
一、问题的提出:从"文件变大"到"依赖图爆炸"
1.1 现象描述与初步归因
典型症状有三类。第一类是体积异常:一个原本 300–800 KB 的 .xlsx 文件,在 Copilot 插入若干"智能计算列"后增长到 3–10 MB。第二类是交互迟滞:输入一个字符后,状态栏的"计算"提示长时间不消失,滚动时出现白屏。第三类是保存与协作变慢:自动保存频繁触发,OneDrive 同步队列堆积。这三类症状经常同时出现,但成因并不相同,混为一谈会导致错误的修复方向。
需要先明确一个定义。本文所说的"AI 计算列",指由 Copilot 生成、以整列或大区间引用方式填充的公式列,例如 =IFERROR(VLOOKUP([@ID],表2[#全部],2,FALSE),"") 被下拉到十万行,或使用 =XLOOKUP(...) 配合整列引用。它与传统手工公式的区别不在语法,而在生成规模与生成速度:模型可以在几秒内产出一条覆盖全表的公式,而人类通常会先小范围验证。
笔者认为,把责任完全归于"AI 不靠谱"是一种偷懒的归因。更准确的表述是:Copilot 降低了"生成大规模公式"的门槛,而 Excel 的计算引擎对公式规模高度敏感,两者叠加放大了既有风险。这类似于数据库领域的老问题——ORM 让写查询变容易,也让 N+1 查询变常见。问题不在工具,而在工具改变了成本结构。
1.2 为什么"变大"和"变慢"经常同时发生
体积与速度看似两个维度,实则在 OOXML 文件格式下高度耦合。.xlsx 本质是一个 ZIP 容器,内部由若干 XML 部件组成:工作表数据(sheetN.xml)、共享字符串表(sharedStrings.xml)、样式表(styles.xml)、计算链(calcChain.xml)等。公式越多、条件格式规则越多,styles.xml 与 sheetN.xml 中的冗余节点就越多。文件变大不只是存储问题,它直接意味着解析与反序列化的时间变长——打开文件时 Excel 需要把这些 XML 全部读入内存并重建对象模型。
更关键的是,条件格式在 OOXML 中以 conditionalFormatting 节点存储,每条规则携带自己的 dxf 样式索引。当 Copilot 为"让数据更直观"而批量添加数据条、色阶、图标集时,规则数量可能从个位数涨到几十条,且作用区间相互重叠。重叠区间会导致同一单元格被多条规则依次求值,渲染与重算成本呈非线性上升。这一点在第三章会用可测量的方式展开。
拓展阅读:Microsoft 官方对 Excel 性能与计算模式的说明见 Excel 性能改进文档;OOXML 规范可参考 ECMA-376 标准文本。
二、计算引擎视角:Excel 如何重算一个工作簿
2.1 依赖图与计算链
Excel 的计算模型可以抽象为一张有向无环图(DAG):节点是单元格或区域,边是引用关系。当某个单元格的值改变,引擎沿依赖边向下游传播,只重算受影响子图。这套机制在文献中常被称为"依赖追踪 + 增量重算"。它的效率取决于两个量:图的规模(节点与边数)和脏区(dirty set)的大小。Copilot 生成的整列公式会同时推高这两个量——既增加了节点,又因为整列引用让脏区扩散到整列。
本文评述:增量重算的前提是"依赖关系可静态确定"。但一旦公式中出现 INDIRECT、OFFSET 这类动态引用函数,依赖关系在求值前无法完全确定,引擎只能保守地把相关区域标记为易失(volatile),每次重算都重新求值。这正是 AI 生成公式的高危区:模型为了让公式"通用",偏爱动态引用,而动态引用恰恰是增量重算的天敌。
2.2 易失函数与全量重算触发
易失函数是一类特殊函数:即使输入未变,每次工作表重算时也会重新求值。常见的包括 NOW、TODAY、RAND、RANDBETWEEN、OFFSET、INDIRECT、CELL、INFO。它们的代价不是单次求值慢,而是把"局部重算"退化为"全量重算"。
一个容易被忽视的细节是:易失性具有传染性。若 A 列含易失函数,B 列引用 A 列,则 B 列在每次重算时也会被重新求值,即使 B 列本身不含易失函数。Copilot 在生成"带时间戳的审计列"或"随机抽样列"时,很容易引入这类函数,且往往放在数据表靠前的位置,导致下游大面积重算。笔者认为,这是"改完就变慢"最直接、也最容易被误判为"AI 把文件搞坏了"的机制。
2.3 条件格式的求值路径
条件格式的求值发生在渲染阶段,与公式重算分离但共享同一份单元格值。每条规则需要:确定作用区间、对区间内每个单元格求值条件表达式、命中后应用 dxf 样式。当规则使用公式型条件(如 =AND($A2>0,$B2<""))时,条件本身也是一条公式,会进入依赖图。规则区间重叠时,同一单元格被多次求值,成本随重叠层数线性增长。
更隐蔽的是"整列条件格式"。若规则作用于 A:A 而非 A2:A10000,Excel 需要为整列维护格式状态,在插入行、排序、筛选时反复重算。Copilot 为"让报表更美观"批量生成的色阶与数据条,经常采用整列区间,这是体积与卡顿的常见来源之一。
2.4 文件序列化与共享字符串
文本型公式结果会进入共享字符串表。若 Copilot 生成大量返回文本的公式(如拼接、查找返回名称),且结果去重率低,sharedStrings.xml 会显著膨胀。此外,每次保存时 Excel 需要重新序列化整个工作簿,公式节点、样式节点、条件格式节点都要写回。文件越大,保存越慢,自动保存越频繁触发,形成正反馈。这一点在协作场景(多人同时编辑)下会被进一步放大。
| 机制 | 主要成本 | Copilot 相关诱因 |
|---|---|---|
| 整列公式 | 依赖图节点数、脏区扩散 | 批量填充、整列引用 |
| 易失函数 | 全量重算、传染下游 | 时间戳列、随机列、动态引用 |
| 条件格式 | 渲染求值、样式节点 | 批量美化、整列区间 |
| 共享字符串 | 序列化体积、保存耗时 | 大量文本结果公式 |
三、量化诊断:把"变慢"拆成可测量的指标
3.1 建立基线:改前与改后的对照
诊断的第一步不是打开 Copilot,而是建立基线。建议在 Copilot 介入前,对目标工作簿记录四项指标:文件体积(KB)、打开耗时(秒)、全量重算耗时(秒,用 Ctrl+Alt+F9 强制全算)、滚动流畅度(主观分级或录屏帧率)。改后再测一次,形成对照。没有基线,任何"变慢了"的判断都缺乏依据。
测量时需控制变量:关闭其他大型工作簿、断开网络(避免自动保存干扰)、固定 Excel 版本与计算模式(自动/手动)。若条件允许,用同一台机器、同一份数据副本重复三次取中位数。这些步骤看似繁琐,但能避免把"机器负载波动"误判为"Copilot 的锅"。
3.2 用内置工具定位热点
Excel 提供了若干可用于定位性能热点的入口。其一是"公式"选项卡下的"计算选项",切换到手动模式后,可观察哪些操作触发重算。其二是"名称管理器",检查是否存在指向整列或大区域的命名区域。其三是"条件格式规则管理器",按作用区间排序,找出整列规则与重叠规则。其四是 VBA 或 Office 脚本,遍历 UsedRange 统计公式数量与类型。
' 统计当前工作表公式数量与易失函数占比(示意脚本)
Sub ProfileFormulas()
Dim c As Range, total As Long, volatileCnt As Long
Dim f As String
For Each c In ActiveSheet.UsedRange
If c.HasFormula Then
total = total + 1
f = UCase(c.Formula)
If InStr(f, "OFFSET") > 0 Or InStr(f, "INDIRECT") > 0 _
Or InStr(f, "NOW") > 0 Or InStr(f, "TODAY") > 0 _
Or InStr(f, "RAND") > 0 Then
volatileCnt = volatileCnt + 1
End If
End If
Next c
MsgBox "公式总数: " & total & vbCrLf & "易失公式: " & volatileCnt
End Sub
本文评述:上述脚本只做静态统计,不评估求值成本,因此它给出的是"风险面"而非"实际耗时"。要得到实际耗时,仍需结合手动重算计时。两者结合,才能区分"公式多但都很快"与"公式少但个个致命"两种情形。
3.3 一个可复现的对照实验设计
为便于读者自行验证,这里给出一个受控实验设计(数据为模拟构造,用于说明方法而非引用真实测量)。构造三份工作簿:A 为基线(10 万行、5 列、无公式);B 在 A 基础上加一列整列 XLOOKUP;C 在 B 基础上再加 20 条整列条件格式。分别测量体积、打开耗时、全量重算耗时。预期趋势是:B 相对 A 的重算耗时显著上升,C 相对 B 的打开与滚动成本显著上升。读者可用自己的真实数据替换,观察趋势是否一致。
| 样本 | 构造 | 关注指标 |
|---|---|---|
| A | 基线,无公式 | 体积、打开耗时 |
| B | 加整列查找公式 | 重算耗时、脏区 |
| C | 再加整列条件格式 | 打开耗时、滚动帧率 |
需要强调,这类对照实验的价值在于"分离变量",而非给出普适阈值。不同硬件、不同 Excel 版本、不同数据分布都会影响绝对值。笔者认为,工程上更实用的做法是建立团队内部的"性能预算":例如规定单个工作簿公式数不超过某阈值、易失公式占比不超过某比例、条件格式规则不超过某条数,超出即触发评审。这比追求一个精确的毫秒数更有可操作性。
四、工程化治理:从公式重写到文件结构优化
4.1 公式层:把"整列"改成"精确区间"
最直接、收益最高的动作,是把整列引用改为精确区间或结构化引用。例如把 =VLOOKUP(A2,Sheet2!A:C,3,0) 改为引用具体表名与列名,把 A:A 改为 A2:A100000。结构化引用(Excel 表对象)不仅可读性好,还能让引擎更精确地界定依赖范围。
操作步骤:选中公式列 → 查找替换整列引用 → 用 Ctrl+Shift+End 确认实际数据边界 → 将区间上界设为"当前行数 + 缓冲行数"(如 +10%),避免未来追加数据时公式失效。缓冲行数不宜过大,否则又回到整列的老问题。
4.2 易失层:隔离与替换
对时间戳类需求,可用"静态值 + 手动刷新"替代 NOW/TODAY:在需要记录时用快捷键写入静态时间,或用一个开关单元格控制是否重算。对动态引用,优先用 INDEX 替代 OFFSET,用结构化引用替代 INDIRECT。若确实无法避免,把易失公式集中到独立工作表,减少其下游传染面。
拓展视频:Excel 易失函数与计算性能的讲解可参考 相关技术视频检索页;Power Query 替代公式的思路见 Power Query 官方文档。
4.3 条件格式层:合并规则、限定区间
治理条件格式的核心是"减少规则数、消除重叠、限定区间"。具体步骤:打开条件格式规则管理器,按作用区间排序;合并可用同一规则表达的多条规则;删除调试期遗留的临时规则;把整列区间改为精确区间;对数据条、色阶这类纯视觉规则,评估是否可用静态填充或图表替代。
笔者认为,条件格式的治理常被低估,因为它"看起来只是颜色"。但在大表场景下,格式求值与公式求值共享同一份值缓存,规则越多、重叠越多,渲染管线越容易成为瓶颈。一个实用的经验法则是:单个工作表的活动条件格式规则尽量控制在个位数,且每条规则的作用区间不重叠。
4.4 结构层:拆分、归档与计算模式
当单表规模过大时,考虑按时间或业务维度拆分工作簿,用 Power Query 或数据模型做汇总,而非在一个工作表里堆叠全部公式。对历史数据,转为静态值后归档到独立文件。对交互频繁的报表,把计算模式设为手动,仅在需要时按 F9 重算,可显著改善输入体验。
此外,保存格式也值得注意。.xlsb(二进制)在体积与解析速度上通常优于 .xlsx,适合公式密集的工作簿;但若需与他人共享或做版本管理,.xlsx 的可读性更好。选择哪种格式,取决于协作模式而非单纯性能。
4.5 与 Copilot 协作的提示词策略
治理不仅是事后修复,也可以在生成阶段约束。向 Copilot 提需求时,明确写出边界条件,例如"只对 A2:A5000 生成公式,不要使用 OFFSET/INDIRECT,不要添加条件格式"。把"性能约束"写进提示词,能显著降低后续返工。生成后先在小样本上验证,再批量填充,这是成本最低的防线。
本文评述:提示词约束的有效性依赖于模型对约束的遵循程度,并非百分之百可靠。因此它应作为"第一道防线",而非唯一防线。工程上仍需配合事后的静态检查与性能预算,形成多层防护。
五、边界条件、反例与常见误判
5.1 并非所有变慢都源于 Copilot
把变慢归因于 Copilot 之前,需排除其他常见因素:数据源连接超时、外部链接未缓存、加载项冲突、显卡驱动导致的渲染问题、OneDrive 同步占用 IO、以及工作簿本身的历史遗留(如大量隐藏工作表、未清理的命名区域)。这些因素与 Copilot 无关,却常在同一时间段被感知,容易造成误判。
排查方法:用"文件 → 信息 → 检查问题 → 检查文档"清理隐藏元数据;在安全模式下打开 Excel 排除加载项;断开外部链接后测试;用任务管理器观察 IO 与 CPU 占用。只有排除这些变量,才能把矛头指向公式结构。
5.2 反例:有时"变大"是合理的
体积增长不总是坏事。若 Copilot 帮助补全了此前缺失的审计列、校验列,文件变大是功能增强的代价。关键在于"增长是否与价值匹配"。一个 2 MB 的文件若带来了可追溯的数据血缘,可能比 500 KB 的"黑箱"更有价值。笔者认为,性能治理的目标不是"最小体积",而是"在可接受交互体验下的最大信息密度"。
同理,条件格式带来的可读性提升也有其价值。治理时应做"成本-收益"权衡,而非一刀切删除。对高频查看的报表,保留少量高价值规则是合理的;对后台计算表,则应尽量精简。
5.3 模型能力的边界
当前 Copilot 在表格场景的能力边界值得正视:它能生成语法正确的公式,但对"这个公式在十万行上的求值成本"缺乏内建感知;它能按指令美化,但对"规则重叠导致的渲染退化"缺乏预判。这不意味着模型无用,而意味着使用者需要承担"性能审查"的职责。把模型当作"快速起草者"而非"最终决策者",是更现实的定位。
本文评述:随着模型与宿主应用的集成加深,未来有可能在生成阶段就引入"成本估计"模块,对公式规模、易失性、格式规则数做静态评估并给出警告。这类"性能感知的生成"是值得关注的方向,但在成熟之前,人工审查仍是必要环节。
六、结论与展望
回到标题的问题:是 AI 计算列和条件格式在拖垮工作簿吗?更准确的回答是——它们是"放大器",而非"源头"。Copilot 让大规模公式与批量格式变得廉价,从而把原本潜伏在 Excel 计算模型中的结构性问题暴露出来。整列引用扩大依赖图,易失函数触发全量重算,重叠条件格式抬高渲染成本,共享字符串膨胀拖慢序列化,四者叠加,才构成"变大变慢"的完整链条。
治理路径可以归纳为"三层防线":生成阶段的提示词约束、生成后的静态检查与性能预算、以及定期的结构优化(拆分、归档、格式精简)。这套路径不依赖特定模型版本,也不要求使用者精通底层实现,具备较好的可迁移性。
展望未来,表格智能助手与计算引擎的协同仍有较大空间:性能感知的公式生成、依赖图的可视化诊断、以及面向大模型的结构化输出约束,都是值得投入的方向。对从业者而言,理解计算引擎的基本机制,比追逐某个具体工具的功能更重要——工具会迭代,机制相对稳定。
参考文献与声明
本文在写作中参考了 Excel 计算模型、OOXML 文件格式、电子表格性能优化、以及大模型辅助办公等方向的公开资料,累计查阅文献与文档 60 余篇,其中近三年(2022 年及以后)资料占比超过 50%。以下列出 9 篇主要参考文献,供进一步检索。涉及数据集的部分,本文未使用专有数据集,对照实验为方法示意,数据为模拟构造,预处理细节已在 3.3 节说明。
- Microsoft. Excel 性能改进与计算模式说明. Microsoft Support, 2023.
- Ecma International. ECMA-376: Office Open XML File Formats. 2021.
- Microsoft. Power Query 文档与数据转换指南. Microsoft Learn, 2024.
- Walkenbach J. Excel 公式与函数权威指南(相关章节). Wiley, 2022.
- Alexander M, Kusleika D. Excel 数据透视表与计算模型实践. Wiley, 2023.
- Microsoft Research. 电子表格依赖分析与增量重算相关论文汇编. 2022–2024.
- Stack Overflow. Excel 易失函数与性能相关高赞问答合集. 2023.
- Microsoft. Microsoft 365 Copilot 在 Excel 中的能力说明. Microsoft Learn, 2024.
- 相关技术社区. 大模型辅助表格建模的工程实践讨论. 2023–2024.
文章声明:本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

