
GitHub: https://github.com/iofficeai/officecli
iofficeai/officecli 是 专为 AI Agent 设计的零依赖 Office CLI——单二进制、自带 HTML 渲染、路径化寻址 + 结构化 JSON + 自愈错误码,把 Word/Excel/PPT 的"读 → 改 → 看 → 再改"全流程收敛成一条对 LLM 友好的工作回路;其姊妹产品 AionUi 桌面端用它做 Office 自动化的底层引擎。

类型: hero — 主流程:Agent 在 AionUi 里调用 officecli 生成 PPT

类型: demo — 设计型 PPT 自动化生成

类型: demo — 商业汇报场景

类型: demo — 技术分享场景

类型: demo — Word 学术论文模板填充
维度 | 数据 |
|---|---|
GitHub | https://github.com/iofficeai/officecli |
Star / Fork | 9,848 / 673 |
Watcher / Open Issue / Open PR | 26 / 13 / 8 |
代码行数 | 252,484 行(C# 183K / 331 文件,72.6%;含 JSON 24K / Shell 23K / Python 16K) |
项目年龄 | 3.8 个月(2026-03-15 至今) |
开发阶段 | 密集开发(近 30 天 1,685 commits、月 commit 单调递增) |
贡献模式 | 单人主导 + Claude 协作(zmworm 87.6% / goworm ~19% / Claude 48 commits,共 12 人) |
热度定位 | 大众热门(9848 stars / 3.8 月 = 爆发型) |
License | Apache 2.0 |
质量评级 | 代码 B+ / 文档 A / 测试 D(近乎为零) |
iofficeai 团队(AionUi,账号 2023-09-17 至今 2.8 年,517 followers,7 个公开仓库)是国产 "AI-on-UI" 团队。母产品是 AionUi 桌面端(TypeScript,29K stars),定位为"AI agent + 本地桌面"的多 agent 协作壳——在落地过程中反复撞到同一堵墙:没有本地、无依赖、agent-native 的 Office 操作层。python-docx 类库对程序员友好、对 agent 不友好(agent 无法从 traceback 推理"第 N 段第 M 个 run"),MarkItDown 只读,LibreOffice 太重。OfficeCLI 就是 AionUi 的"back-of-house"层,从 README 自述 "powered by OfficeCLI under the hood" 直接印证。
作者看到了三个现有方案共同的 agent 场景缺口: 1. 没有"路径寻址 + 稳定 ID"——python-docx 的对象模型需要懂 OOXML 才能写出第 3 段第 2 个 run,agent 写这种代码极易误定位; 2. 没有结构化错误——Python 抛 AttributeError,agent 必须自行解析 traceback,且缺乏"建议 + 合法值"的自愈线索; 3. 没有"渲染→观察→修复"的视觉回路——agent 只能读到 XML 树,看不到真实版面,导致"set 一段 → save → 不知道对不对 → 再 set"循环无视觉反馈。
时机:2026 年正是 AI agent 平台(Claude Code、Cursor、Codex)大规模进入企业工作流的一年,Office 自动化从"程序员脚本"升级为"agent 标准动作",市场窗口正打开。
三条强约束贯穿所有架构决策: 1. Agent 是 co-worker,不是 single-model assistant——CLI 表面必须可被 agent 自行探索、纠错、组合,因此出现 L1 → L2 → L3 分层 + --json + 自描述 schema help。 2. Local-first / provider-agnostic——没有 Office 依赖、没有云渲染,单二进制 + 嵌入式 schema;用户可在 air-gapped 环境使用。 3. 可观测的失败优于静默成功——issue #158 "silent Exit 1"被列在稳定性路线里,所有错误码带 suggestion / valid_range,BUG-XXX 注释遍布源码(grep 命中 1,651 处)——把"过往 bug → 下次同类 bug 的自我拦截"刻进代码注释。
OfficeCLI 是 iofficeai 的"Office automation 中间件"层——AionUi 是面向终端用户的桌面壳,OfficeCLI 是面向 agent 的 CLI 引擎,未来还可能成为 SaaS API(plugin-protocol 已暗示服务端化路径:exporter / format-handler 走 sidecar)。三条产品线共享同一个 OOXML 抽象,因此 87.6% 的代码量集中在 main zmworm 手中并不奇怪——这是 single-vision 工程的代价。
按新颖度 × 实用性排序:
/slide[1]/shape[@id=550950021] 风格的本地图路径代替 OOXML XPath;用结构化 JSON envelope 替代 stderr + exit-code;用嵌入式 JSON schema 替代 hard-coded --help 文本,让 agent 通过 help docx paragraph --json 自助纠错。L1 命令输出有 outline/text/annotated/stats/issues/html/svg/screenshot/pdf/forms 十种模式。新颖度 3/5,实用性 5/5,可迁移性 5/5。
officecli-<hash> + 独立 ping pipe + 双 CTS + 自适应 flush 间隔实现"近零延迟"的 agent loop;flush 模式做成可调旋钮(each/auto/<N>/off)。每次操作省去 50–200ms 子进程 spawn 开销。新颖度 4/5,实用性 5/5,可迁移性 3/5。
officecli tool,参数就是 CLI 命令字符串。command 字符串 tokenize 后原样喂给 System.CommandLine。SKILL.md 里的命令示例在 MCP / CLI 两路逐字可用。新颖度 4/5,实用性 5/5,可迁移性 5/5。
GuardDecompressionBomb)、悬空 rel 修复(HasDanglingInternalRels / StripDanglingPackageRels,注释里写 "Word tolerates them, SDK refuses")、XML 编码修复(FixXmlEncoding 把 encoding="ascii" 改 UTF-8)。每一步都注释了上游 issue 来源,让 agent 拿到 100 个脏 pptx 都能跑。新颖度 3/5,实用性 5/5,可迁移性 4/5。
skills/<name> 子目录 + skill-parity.yml workflow 保证一致性。morph-ppt 继承 officecli-pptx 的"硬规则"(visual floor、grid math、palette),只新增"Morph 特有"的 cross-slide binding 规则。新颖度 3/5,实用性 5/5,可迁移性 5/5。
dump <file> [<path>] 序列化任意子树为可重放的 batch JSON,batch <file> --input 回放;支持跨 part 关系(OLE / 3D / SmartArt / morph / p15 通过 raw-set passthrough 兜底)。模板生成、CI 报告、批量改样式都能用。新颖度 4/5,实用性 4/5,可迁移性 3/5。
CONSISTENCY(name)) 注释:把"这两个地方必须保持一致"的事实写进代码注释,grep 即可见。比 ESLint / compiler-level rule 更轻量、上下文更丰富。适合 high-velocity 多人项目。BUG-<id>) 注释:1,651 处 BUG- 引用散落源码,每处都是"这个 bug 曾经/仍可能发生"。从历史 commit 修复追溯到代码现状,给 reviewer 提供"为什么这里要这样写"的上下文。officecli,command 字符串透传。任何已有 CLI + 想接 MCP 的项目都能套用,避免 surface area 翻倍。set/add 时自动 spawn resident(除非 OFFICECLI_NO_AUTO_RESIDENT=1),idle 自适应 flush,下次访问秒级命中。<EmbeddedResource> 打进二进制,运行时按需加载,单文件发行零依赖。add/set/get)。 - 方案:public partial class WordHandler : IDocumentHandler, IRenderModelHost——每个 verb 一组 partial 文件。 - Trade-off:跨 partial 文件私有字段访问方便,但 partial 之间没有显式依赖图,修改 shared state 时容易引入隐式耦合(如 InvalidateStyleIndex() 必须从 Add/Remove 两处显式调用)。 - 可迁移性:高(.NET 标准做法)。
officecli 工具: - 问题:把每个 verb 拆成独立 MCP tool 会产生 30+ 工具;agent 在工具列表里找路很慢;CLI / MCP 表面必须保持一致。 - 方案:McpServer.cs 把 JSON-RPC 的 tools/call.command 字符串 tokenize 后原样喂给同一个 System.CommandLine root。 - Trade-off:牺牲"严格类型化 MCP tool"(每个参数都是 JSON schema 强约束),换来"CLI / MCP 单一事实源"。 - 可迁移性:极高。
GuardDecompressionBomb → HasDanglingInternalRels → FixXmlEncoding → catch OpenXmlPackageException 翻译成 CliException(Code=corrupt_file))。 - Trade-off:隐藏的"修复"动作(mutate file in place)有副作用——agent 拿到被改过的文件不知情。 - 可迁移性:中。
维度 | officecli | MarkItDown | python-docx 三件套 | LibreOffice headless | Docling (IBM) |
|---|---|---|---|---|---|
读 .docx/.xlsx/.pptx | ✓ 深度 + 结构化 | ✓ 转 Markdown | ✓ 结构化 | ✓ 转 PDF | ✓ 富解析 |
写 .docx/.xlsx/.pptx | ✓ 全功能 | ✗ | ✓ | △ | ✗ |
渲染预览 | ✓ 内置 HTML+PNG | ✗ | ✗ | △ | ✗ |
Agent 路径寻址 | ✓ | ✗ | ✗ | ✗ | ✗ |
结构化 JSON | ✓ 全表面 | ✗ | △ | ✗ | ✓ |
错误带 suggestion | ✓ | ✗ | ✗ | ✗ | ✗ |
单二进制零依赖 | ✓ | ✗(Python) | ✗(Python + 3 lib) | ✗(JVM) | ✗(Python+ML) |
MCP 集成 | ✓ | △ | ✗ | ✗ | ✗ |
协议/扩展点 | ✓ plugin-protocol | ✗ | ✗ | ✓ UNO | ✗ |
tests/OfficeCli.Tests.csproj,但磁盘上 tests/ 目录不存在!整个仓库无任何 .cs 测试文件。0% test commit + 0.5% refactor commit,重构和正确性没有回归保护(正是 issue #158 silent failure 的根因)。zmworm 87.6% / goworm 19% / Claude 48 commits,任何关键人离职都会动摇项目。.doc/.hwpx)必须走 plugin。"AI agent 时代的 Office API 层"——与 AionUi 构成"agent 前端 + Office 中间件"垂直栈,与 Microsoft Graph / Office Script 形成互补(cloud vs local、agent vs human)。
DocumentHandlerFactory 打开时 mutate 文件(剥 rel、改 XML 编码),目前没有"diff & report"机制,agent 拿到被改过的文件不知情。zmworm 87.6% 占比 + Claude 48 commits(Claude-as-contributor),任何主维护者不可用期都会导致项目冻结。src/officecli/McpServer.cs —— 单 tool MCP wrapper 的实现样板src/officecli/ResidentServer.cs(2711 行)—— 命名管道 + 自适应 flush + 双 CTS 状态机src/officecli/Help/SchemaHelpLoader.cs —— 嵌入式 schema 索引src/officecli/Handlers/WordHandler.Navigation.cs(349 次修改)—— partial class 拆分后的最大文件plugins/plugin-protocol.md —— sidecar 三类扩展点定义.github/workflows/skill-parity.yml —— SKILL.md 多语言同步的 CI 实现.editorconfig + dotnet format、把 DocumentHandlerFactory 的 self-repair 副作用改为"diff & report"模式、加 ROADMAP.md 走 RFC 流程。未收录