Univer:把 Office 运行时嵌进自己的产品
今天早上落进卡片库的一条新闻:OpenAI 公布了一组类 Office 的办公功能,覆盖文档、表格、演示,直接撞上微软的腹地。办公套件这层楼今年多了一个新住户。对做产品的人,这件事还有另一条更实用的读法——把表格能力放进自己的系统,不必再从零写网格、选区、公式和撤销栈,这条路有开源实现,Univer。
Univer 的定位写得很直接:The Office Harness for AI Agents,一套 Office SDK。DreamNum 团队开源,Apache-2.0,TypeScript,21,895 stars、1,850 forks。仓库建在 2022 年 9 月,最新版本 v1.0.3 发布于 2026 年 9 月 29 日,今天挂在 GitHub Trending 上,单日加了 895 星。
它不是文件查看器,是运行时
多数人对「在线表格」的想象是一张能填字的网格。Univer 把自己定义成框架:表格、文档、演示共用同一套架构,能力全部做成插件包——@univerjs/sheets 管表格模型,engine-formula 管公式,engine-render 是渲染引擎,sheets-ui、sheets-numfmt、sheets-filter 各自负责一层。要什么装什么,不要的可以不进包。
两个工程决定让它和「抄一个 Excel 界面」拉开距离。
第一,渲染走 Canvas,公式走独立引擎。大工作簿在 Canvas 上滚动,DOM 不会炸;公式引擎和渲染层解耦,服务端可以不渲染界面直接算值。
第二,同构。同一套代码在浏览器和 Node.js 里跑,区别只是装不装 UI 插件。README 给的 headless 门槛是 Node.js >= 18.17.0,服务端批量算工作簿、跑校验,不需要起无头浏览器。
对外入口是一层 Facade API:FUniver、FWorkbook、FRange,浏览器和 Node 用同一个面。上手的路径给了两条:Preset 模式用 presets/ 里的打包集合,十几行代码起一个可用表格;Plugin 模式自己挑包,控制体积和加载顺序。
智能体那一层是今年的重心
README 的副标题从在线表格换成了「AI 智能体的 Office 载体」,措辞变化对应三条具体的 agent 工作流:
- 程序化编辑:智能体通过结构化 API 读改单元格、区域、公式,不靠模拟点击
- 产物校验:内容检查、渲染截图、布局诊断,改完能自己验
- worktree 协作:智能体在隔离草稿里改,人来看差异,决定合并哪些
配套仓库也摆出来了:univer-mcp 用自然语言驱动表格,univer-cli 是给智能体的本地命令行工作区,univer-workspace 是完整参考实现——网页上的指标、图表、控件绑定到单元格,读写双向;还有 univer-sdk-skills,给做集成的智能体读的技能包。
这一层比 UI 值钱的地方在于:表格从「人看的界面」变成「人和智能体共用的数据结构」。界面是给人用的,数据结构是给系统用的。
我们的表格卡在哪
车研库的数据层现在有 1,000 件零件、260 台车型、2,195 条 PR 码;白物集这边是 211 篇文章、545 张知识卡片。规模不大,但每一张表都走过同一套流程:从 ETKA 图板和配置页截图里识别出内容,落成 markdown 表格,粘进文件,再用 Node 脚本写进库。
零件那一步最典型。ETKA 导出的 parts_{model}.json 按十个车型分开,脚本逐个匹配车型 slug 写进 parts 表,里面塞着两类规则:先清掉 category 里的旧原始数据,以及跳过已有同名 OE 的精修件。这两条规则说明库里是分层的——ETKA 原始条目和精修条目共存,脚本要负责在导入时保住精修的那一份。
问题出在表格只是中转形态。识别出来的那张表,粘一次、跑一次脚本就消失了;数据进库之后,想改一个零件描述、并掉两条重复的 OE 号,只能打开 SQL 写语句。整条链路里没有一处能让人看着表格改一个单元格,再把它存回去。
Univer 能补的正是这一段。把表格引擎嵌进后台,做一个导入前的校对台:脚本落库之前,先让人在表里过一遍,改完再提交。更值钱的是 headless 那一侧——把 PR 码的组合规则写成公式列,导入前在服务端算一遍,让机器先把明显矛盾的行挑出来。再往前一步是智能体:今天「截图 → 人工粘贴 → 脚本」里的中间那段,可以换成「智能体填表 → 人工初审 → 落库」,评审界面还是同一张表。
这套东西我们还没上生产,原因很具体:当下卡住数据的不是编辑体验,是校对规则本身。2,195 条 PR 码里有相当一部分跨车型语义并不相同,这种判断机器替不了。
开源的边界,要先看清
Univer 把 OSS 和 Pro 摆在同一张对照表里,界线画在功能名上。
开源版有工作簿与工作表模型、选区和区域操作、公式、数字格式、筛选、排序、数据验证、条件格式、超链接、批注、查找替换、表格、绘图集成、可扩展 UI。
Pro 才有的部分值得单独读一遍:实时协作、编辑历史、导入导出、打印、图表、透视表、迷你图、大纲、形状、单元格内图形、数据连接器、服务端计算。
翻成人话:你要的是「网页里有一个能编辑的表格」,开源够用;你要的是「打开 xlsx、导出 xlsx、多人同时改」,那是商业层。README 没有把 Pro 的能力混进开源描述,这种把边界写在明处的做法,比很多项目诚实。
兼容性也有硬门槛:渲染目标 Chrome 88,起步支持 Edge 88、Firefox 90、Safari 14.1、Electron 12;视图层是 React 18,兼容 React 19;依赖 Intl.Segmenter,老环境要加 polyfill;构建推荐 Vite、esbuild 或 Webpack 5。
适合谁,不适合谁
适合:要把表格或文档编辑嵌进自己产品的 SaaS 和内部工具;要在服务端批量算工作簿、跑公式校验;要给智能体一层结构化的 Office 操作面。
不适合:只想展示一份静态表格——一张 HTML 表或一段 CSV 更省事;要开箱即用的 xlsx 导入导出,开源包里没有,得自己写解析或者上 Pro;纯内容站没有表格编辑需求,比如白物集那条线,就套不上;团队要实时协作,绕不开 Pro。
快速上手
Preset 模式最短路径:
pnpm add @univerjs/presets @univerjs/preset-sheets-core
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'
import UniverPresetSheetsCoreEnUS from '@univerjs/preset-sheets-core/locales/en-US'
import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'
import '@univerjs/preset-sheets-core/lib/index.css'
const { univerAPI } = createUniver({
locale: LocaleType.EN_US,
locales: {
[LocaleType.EN_US]: mergeLocales(UniverPresetSheetsCoreEnUS),
},
presets: [
UniverSheetsCorePreset({ container: 'app' }),
],
})
univerAPI.createWorkbook({})
页面里留一个容器:
<div id="app" style="height: 100vh"></div>
内置 19 种语言,LocaleType 里有 ZH_CN、ZH_TW、ZH_HK。要看全部能力,跑仓库自带的 examples 工作台(pnpm install && pnpm dev);要换更小的组合,切到 Plugin 模式自己挑包。开发这个仓库本身要求 Node.js >= 22.18、pnpm >= 11。
最后一个问题
智能体能改表格之后,责任落点变得含糊。人改了一格,签字的是人;智能体改了一格,谁签?univer-workspace 给的答案是隔离草稿加人工 review——机器出草稿,人决定合并。放到我们的场景里这个答案还不够用:2,195 条 PR 码里最难的那几条,是逐条比对原始资料定下来的,没有公式能验它。机器填表越快,「哪一格必须由人确认」这条规则就要写得越清楚。