当电子表格听懂了人话:一个 AI Agent 背后的工程实践

21 阅读6分钟

你是不是也这样用过 Excel?

月初,销售数据下来了。你需要把低于目标的行标红,按区域做一张数据透视表,再画一条月度趋势图。

于是你打开了浏览器:Excel 条件格式怎么设置数据透视表字段拖不动折线图横轴日期显示不对……三个搜索页开着,Excel 里反复试错,半小时过去了,图表还是歪的。

这不是你的问题。

电子表格是世界上最强大的数据处理工具之一,但它的能力与用户之间隔着一道墙——交互方式的墙。数据透视表、条件格式、复杂公式、切片器,这些功能本身并不复杂,但你需要知道它们叫什么、在哪个菜单、参数怎么填。大多数人止步于此,只用了 Excel 不到 10% 的能力。

如果只需要说一句话呢?

"帮我用数据透视表分析不同区域的销售状况"

几秒钟后,格式应用了,透视表建好了,图表出现在指定位置。

这不是设想。这是我们基于 SpreadJS 构建的 AI Agent 正在做的事。

在这里插入图片描述

从"找功能"到"说需求"

SpreadJS 是葡萄城(GrapeCity)开发的纯前端电子表格组件,它几乎完整实现了 Excel 的功能集——单元格、公式、图表、透视表、条件格式、形状、切片器、数据验证……开发者可以把它嵌入任何 Web 应用。

能力不是问题。问题是怎么让这些能力真正被人用起来。

我们给出的答案是:在 SpreadJS 之上架一层 AI Agent,让用户通过自然语言来驱动所有操作。

实际效果是这样的:用户在一个聊天框里描述需求,Agent 理解意图后,自动调用对应的工具完成操作——设置单元格格式、创建图表、添加透视表、筛选排序,甚至执行一段 JavaScript 代码来处理复杂逻辑。所有操作即时反映在左侧的电子表格中。

这不是一个简单的指令映射。"帮我按销售额从高到低排序"和"把卖得最好的放前面",Agent 都能理解并执行同一个排序操作。自然语言的模糊性由 LLM 来消解,精确的操作由工具系统来保证。

在这里插入图片描述

91 个工具,怎么不让 AI 迷路?

这是整个项目中最有意思的工程问题。

SpreadJS 的 API 能力非常丰富,我们为 Agent 定义了 91 个操作工具——读数据、写数据、建图表、加透视表、设条件格式、管理批注、插入形状……如果把这 91 个工具一次性全交给 LLM,结果很糟糕:模型会在工具选择上频繁出错,调用不该调的工具,甚至虚构不存在的参数。

这在业界是一个已知的挑战:工具越多,LLM 的准确率越低。

我们的方案是渐进式工具暴露——一个轻量的模块状态机:

  • 默认模式下,Agent 只能看到 47 个基础工具和"网关工具"(如"管理格式""管理图表")。
  • 当用户的需求涉及某个领域(比如图表),Agent 调用对应的网关工具,进入模块模式
  • 进入模块后,工具列表刷新为"基础工具 + 该模块的专属工具 + 退出模块"。比如进入图表模块后,才会看到"添加图表""修改图表""删除图表"。

这就像一个合理的软件菜单结构——你不需要在首页看到所有功能。对 LLM 来说,每次只需在 40 个左右的工具中做选择,准确率显著提升。

AI 写的代码,能放心执行吗?

除了预定义的工具,Agent 还有一个强大的能力:直接编写并执行 JavaScript 代码来操作工作簿

比如用户说"把 B 列的日期全部往前移一天",Agent 可以生成一段 for 循环直接修改单元格。这让 Agent 拥有了处理几乎所有操作的能力,不受预定义工具的限制。

但"AI 生成代码直接执行"听起来就很危险。我们做了三层保护:

  1. 副本预跑:代码先在一个隐藏的工作簿副本上执行,成功后才应用到真实数据上。
  2. 快照回滚:每次执行前自动保存工作簿快照,一旦出错,立即恢复。
  3. 运行时隔离:执行期间挂起界面渲染、事件触发和公式计算,避免副作用。

用户不会看到任何"正在回滚"的提示——要么成功,要么像什么都没发生。

不绑定单一模型

Agent 底层兼容多个 LLM 提供商:DeepSeek、Google Gemini,以及所有 OpenAI 兼容接口(GLM、Qwen、Kimi 等)。

这不是为了"全都要",而是出于实际考虑:

  • 简单操作(排序、筛选)用轻量模型就够了,成本低、速度快。
  • 复杂操作(生成图表代码、多步骤分析)需要更强的模型。
  • 企业部署时,数据合规要求可能限定特定模型或私有化部署。

通过环境变量切换模型,Agent 的行为保持一致——因为工具定义和执行逻辑是固定的,模型只负责理解意图和选择工具。

Agent 是入口,SpreadJS 才是地基

回到这篇文章真正想说的事。

AI Agent 让电子表格的操作方式变得更自然,但 Agent 能做到这些,根本原因在于 SpreadJS 本身提供了足够完整、足够细粒度的 API 能力。91 个工具的每一个,背后都是 SpreadJS 对 Excel 功能的忠实实现:

  • add_chart 能创建图表,是因为 SpreadJS 实现了完整的图表引擎。
  • add_pivot_table 能建透视表,是因为 SpreadJS 有自己的数据聚合引擎。
  • add_validation 能设数据验证,是因为 SpreadJS 支持完整的单元格类型系统。

如果你是开发者,正在寻找一个能在 Web 应用中嵌入的电子表格组件,SpreadJS 值得认真看看。它不只是"能显示表格"——它是一个接近完整 Excel 功能的纯前端引擎,从公式计算到打印导出,从单元格合并到协同编辑。

AI Agent 是我们展示 SpreadJS 能力的一种方式。但即使不用 Agent,SpreadJS 本身就是一个成熟的产品。

写在最后

电子表格诞生已经 40 年了,它的交互方式几乎没有本质变化:选中区域、找到菜单、点击按钮、填写参数。

我们做的不是"用 AI 重新发明电子表格",而是给已有的强大能力开一扇新的门。门后面还是那个表格、那些功能,只是走进去的方式从"找菜单"变成了"说一句话"。

如果你对 SpreadJS 或这个 Agent 项目感兴趣,欢迎体验和交流。