OfficeCLI

iOfficeAIApache-2.0活跃维护

专为 AI Agent 打造的 Office 命令行工具,无需安装 Office 即可读写和自动化处理 Word、Excel、PowerPoint 文件,单二进制开箱即用。

OfficeCLI is the first and best Office suite purpose-built for AI agents to read, edit, and automate Word, Excel, and PowerPoint files. Free, open-source, single binary, no Office installation required.

v1.0.160发布于 2026-10-30 07:27 UTC33,188star +64 / 7 天2,270fork同步于 2026-11-10 11:21 UTC

怎么上手

由 README 提炼,执行前请确认
curl -fsSL https://raw.githubusercontent.com/iOfficeAI/OfficeCLI/main/install.sh | bash
officecli create deck.pptx
硬件要求按 README 说明

README 未说明显存或 GPU 要求;以单文件二进制分发,内嵌 .NET 运行时,支持 macOS(Apple Silicon/Intel)、Linux(x64/ARM64)、Windows(x64/ARM64)。截图功能需通过无头浏览器渲染 HTML。

支持 Apple Silicon
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

面向 AI Agent 的 Office 套件,用命令行读写和自动化 Word、Excel、PPT

专为 AI Agent 打造的 Office 命令行工具,无需安装 Office 即可读写和自动化处理 Word、Excel、PowerPoint 文件,单二进制开箱即用。

核心能力

  • 用单条命令创建、读取、修改 docx/xlsx/pptx 元素
  • 内置 HTML 渲染引擎,可输出 HTML 或逐页 PNG 供 Agent 查看
  • watch 启动本地预览服务,每次改动即时刷新浏览器
  • 内置 350+ Excel 函数,写入公式即自动求值
  • merge 用 JSON 数据填充模板占位符,批量生成文档

容易踩的坑

view screenshot 依赖无头浏览器把 HTML 转成 PNG,环境里没有浏览器可能失败;watch 默认占用 26315 端口;后台会自动检查更新,可用 OFFICECLI_SKIP_UPDATE=1 或 officecli config autoUpdate false 关闭。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v1.0.160
  1. v1.0.160最新正式版2026-10-30 · 2026-10-30 07:27 UTC
  2. v1.0.1592026-10-27 · 2026-10-27 06:48 UTC
    查看更新说明
  3. v1.0.1582026-10-20 · 2026-10-20 08:10 UTC
    查看更新说明
  4. v1.0.1572026-10-12 · 2026-10-12 13:01 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/iOfficeAI/OfficeCLI/compare/v1.0.156...v1.0.157

  5. v1.0.1562026-10-09 · 2026-10-09 17:14 UTC
    查看更新说明

    What's Changed

    New Contributors

    Full Changelog: https://github.com/iOfficeAI/OfficeCLI/compare/v1.0.155...v1.0.156

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    OfficeCLI

    OfficeCLI is the world's first and the best Office suite designed for AI agents.

    Give any AI agent full control over Word, Excel, and PowerPoint — in one line of code.

    Open-source. Single binary. No Office installation. No dependencies. Works everywhere.

    OfficeCLI's built-in HTML rendering engine reproduces documents with high fidelity — and that's what gives AI eyes. It renders .docx / .xlsx / .pptx to HTML or PNG, closing the render → look → fix loop.

    GitHub Release License

    English | 中文 | 日本語 | 한국어

    For AI Agents — Get Started in One Line

    Paste this into your AI agent's chat — it will read the skill file and install everything automatically:

    curl -fsSL https://officecli.ai/SKILL.md
    

    That's it. The skill file teaches the agent how to install the binary and use all commands.

    For Humans

    Option A — GUI: Install AionUi — a desktop app that lets you create and edit Office documents through natural language, powered by OfficeCLI under the hood. Just describe what you want, and AionUi handles the rest.

    Option B — CLI: Download the binary for your platform from GitHub Releases, then run:

    officecli install
    

    This copies the binary to your PATH and installs the officecli skill into every AI coding agent it detects — Claude Code, Cursor, Windsurf, GitHub Copilot, and more. Your agent can immediately create, read, and edit Office documents on your behalf, no extra configuration needed.

    For Developers — See It Live in 30 Seconds

    # 1. Install (macOS / Linux) — or: brew install officecli / npm install -g @officecli/officecli
    curl -fsSL https://raw.githubusercontent.com/iOfficeAI/OfficeCLI/main/install.sh | bash
    # Windows (PowerShell): irm https://raw.githubusercontent.com/iOfficeAI/OfficeCLI/main/install.ps1 | iex
    
    # 2. Create a blank PowerPoint
    officecli create deck.pptx
    
    # 3. Start live preview — opens http://localhost:26315 in your browser
    officecli watch deck.pptx
    
    # 4. Open another terminal, add a slide — watch the browser update instantly
    officecli add deck.pptx / --type slide --prop title="Hello, World!"
    

    That's it. Every add, set, or remove command you run will refresh the preview in real time. Keep experimenting — the browser is your live feedback loop.

    Quick Start

    # Create a presentation and add content
    officecli create deck.pptx
    officecli add deck.pptx / --type slide --prop title="Q4 Report" --prop background=1A1A2E
    officecli add deck.pptx '/slide[1]' --type shape \
      --prop text="Revenue grew 25%" --prop x=2cm --prop y=5cm \
      --prop font=Arial --prop size=24 --prop color=FFFFFF
    
    # View as outline
    officecli view deck.pptx outline
    # → Slide 1: Q4 Report
    # →   Shape 1 [TextBox]: Revenue grew 25%
    
    # View as HTML — opens a rendered preview in your browser, no server needed
    officecli view deck.pptx html
    
    # Get structured JSON for any element
    officecli get deck.pptx '/slide[1]/shape[1]' --json
    
    # Save and close — flushes the resident session to disk
    officecli close deck.pptx
    
    {
      "tag": "shape",
      "path": "/slide[1]/shape[1]",
      "attributes": {
        "name": "TextBox 1",
        "text": "Revenue grew 25%",
        "x": "720000",
        "y": "1800000"
      }
    }
    

    Why OfficeCLI?

    What used to take 50 lines of Python and 3 separate libraries:

    from pptx import Presentation
    from pptx.util import Inches, Pt
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[0])
    title = slide.shapes.title
    title.text = "Q4 Report"
    # ... 45 more lines ...
    prs.save('deck.pptx')
    

    Now takes one command:

    officecli add deck.pptx / --type slide --prop title="Q4 Report"
    

    What OfficeCLI can do:

    • Create documents from scratch -- blank or with content
    • Read text, structure, styles, formulas -- in plain text or structured JSON
    • Analyze formatting issues, style inconsistencies, and structural problems
    • Modify any element -- text, fonts, colors, layout, formulas, charts, images
    • Reorganize content -- add, remove, move, copy elements across documents
    FormatReadModifyCreate
    Word (.docx)✅✅✅
    Excel (.xlsx)✅✅✅
    PowerPoint (.pptx)✅✅✅

    Word — full i18n & RTL support (per-script font slots, per-script BCP-47 lang tags lang.latin/ea/cs, complex-script bold/italic/size, direction=rtl cascading through paragraph/run/section/table/style/header/footer/docDefaults, rtlGutter + pgBorders shorthand, locale-aware page numbering for Hindi/Arabic/Thai/CJK; create --locale ar-SA auto-enables RTL), paragraphs (framePr, tabs shorthand, char-based indents), runs (underline.color, position half-pts), tables (virtual column ops add/remove/move/copyfrom, hMerge), styles, textbox / shape (textbox: rotation, textDirection eaVert/vert270, gradient, shadow, opacity), headers/footers, images (PNG/JPG/GIF/SVG), equations (LaTeX input), diagrams (mermaid → native editable shapes, or any mermaid type as a full-fidelity PNG), comments, footnotes, watermarks, bookmarks, TOC, charts, hyperlinks, sections, form fields, content controls (SDT), fields (22 zero-param types + MERGEFIELD / REF / PAGEREF / SEQ / STYLEREF / DOCPROPERTY / IF), OLE objects, revisions / tracked changes (revision.type=ins\|del\|format\|moveFrom\|moveTo + revision.action=accept\|reject, per-target /revision[@author=Alice] selector, tracked Find&Replace), page background color, document properties

    Excel — cells (phonetic guide / furigana on add, Excel-UI --shift left\|up on remove / shift=right\|down on add), formulas (350+ built-in functions with auto-evaluation, spilling dynamic arrays with _xlfn. auto-prefix, financial / bond and statistical families, OFFSET/INDIRECT, defined-name formula bodies inlined at parse, formula-ref rewrite on row/col insert), sheets (visible/hidden/veryHidden, print margins, printTitleRows/Cols, RTL sheetView, cascade-aware sheet rename, empty-cell bloat filter on open), boolean and/or selectors (row[Salary>5000 and Region=EMEA]), tables, sort (sheet / range, multi-key, sidecar-aware), conditional formatting, charts (including box-whisker, pareto with auto-sort + cumulative-%, log axis), pivot tables (multi-field, date grouping, showDataAs, sort, grandTotals, subtotals, compact/outline/tabular layout, repeat item labels, blank rows, calculated fields, persistent labelFilter / topN filters, cache CoW + cross-pivot sharing), slicers, named ranges, data validation, images (PNG/JPG/GIF/SVG with dual-representation fallback), sparklines, comments (RTL), autofilter, shapes, OLE objects, CSV/TSV import, $Sheet:A1 cell addressing

    PowerPoint — slides (header/footer/date/slidenum toggles, hidden), shapes (pattern fill, blur effect, hyperlink tooltip + slide-jump links, highlight color on runs, slideMaster/slideLayout typed add/set/remove, arrow alias, effective.X + effective.X.src), images (PNG/JPG/GIF/SVG, fill modes: stretch/contain/cover/tile, brightness/contrast/glow/shadow, rotation, link + tooltip), tables (built-in PowerPoint style catalogue, virtual /col[C] get + swap/copyFrom, row/col Move/CopyFrom, fill/background alias), charts (pieOfPie, barOfPie, per-attr axisLine/gridline setters, series add/remove with theme palette, anchor=x,y,w,h shorthand), animations (15 emphasis + 16 exit template-backed presets, multi-effect chains, motion-path presets, repeat/restart/autoReverse, chart animations + chartBuild), transitions (morph + p14 + 12 p15 PowerPoint 2013+ presets), 3D models (.glb) (combined rotation=ax,ay,az), slide zoom, equations (LaTeX input), diagrams (mermaid flowchart / sequence → native editable shapes, or any mermaid type as a full-fidelity PNG), themes, connectors (from/to accept a full /slide[N]/shape[@name=Foo] path), video/audio (loop, autoStart), groups (link + tooltip; Get/Query/Add/Remove all descend into groups), notes (RTL, lang), comments (RTL, legacy + modern p188 threaded round-trip), SmartArt (round-trip via add-part + raw-set), OLE objects, placeholders (add/set by phType)

    Use Cases

    For Developers:

    • Automate report generation from databases or APIs
    • Batch-process documents (bulk find/replace, style updates)
    • Build document pipelines in CI/CD environments (generate docs from test results)
    • Headless Office automation in Docker/containerized environments

    For AI Agents:

    • Generate presentations from user prompts (see examples above)
    • Extract structured data from documents to JSON
    • Validate and check document quality before delivery

    For Teams:

    • Clone document templates and populate with data
    • Automated document validation in CI/CD pipelines

    Installation

    Ships as a single self-contained binary. The .NET runtime is embedded -- nothing to install, no runtime to manage.

    One-line install:

    # macOS / Linux
    curl -fsSL https://raw.githubusercontent.com/iOfficeAI/OfficeCLI/main/install.sh | bash
    
    # Windows (PowerShell)
    irm https://raw.githubusercontent.com/iOfficeAI/OfficeCLI/main/install.ps1 | iex
    

    Or via a package manager:

    # Homebrew (macOS / Linux)
    brew install officecli
    
    # Scoop (Windows)
    scoop install officecli
    
    # npm (all platforms — fetches the native binary for your platform)
    npm install -g @officecli/officecli
    

    Or download manually from GitHub Releases:

    PlatformBinary
    macOS Apple Siliconofficecli-mac-arm64
    macOS Intelofficecli-mac-x64
    Linux x64officecli-linux-x64
    Linux ARM64officecli-linux-arm64
    Windows x64officecli-win-x64.exe
    Windows ARM64officecli-win-arm64.exe

    Verify installation: officecli --version

    Or self-install from a downloaded binary (or run bare officecli to auto-install):

    officecli install    # explicit
    officecli            # bare invocation also triggers install
    

    Updates are checked automatically in the background. Disable with officecli config autoUpdate false or skip per-invocation with OFFICECLI_SKIP_UPDATE=1. Configuration lives under ~/.officecli/config.json.

    Key Features

    Built-in Engines & Generation Primitives

    OfficeCLI is self-contained. The capabilities below ship inside the binary — no Office required.

    Rendering engine — high-fidelity, built-in

    OfficeCLI's keystone: a from-scratch, high-fidelity HTML rendering engine that lets an AI agent see the rendered document instead of guessing from the DOM. It covers shapes, charts (trendlines, error bars, waterfall, candlestick, sparklines), equations (OMML → LaTeX, rendered with KaTeX), 3D .glb models via Three.js, morph transitions, slide zoom, and shape effects. Per-page PNG screenshots are produced by piping the rendered HTML through a headless browser. Three modes:

    • view html — standalone HTML file, assets inlined. Open in any browser.
    • view screenshot — per-page PNG, ready for multimodal agents to read.
    • watch — local HTTP server with auto-refreshing preview; every add / set / remove updates the browser instantly. Excel watch supports inline cell editing and drag-to-reposition charts.
    officecli view deck.pptx html -o /tmp/deck.html
    officecli view deck.pptx screenshot -o /tmp/deck.png # add --page 1-N for more slides
    officecli watch deck.pptx                            # http://localhost:26315
    

    Without visualization, an agent generating slides is flying blind — it can read the DOM but can't tell if the title overflows or two shapes overlap. Because rendering is built into the binary, the render → look → fix loop works in CI, in Docker, on a server with no display — anywhere the binary runs.

    Formula & pivot engine

    350+ built-in Excel functions evaluated automatically on write — write =SUM(A1:A2), get the cell, the value is already there. No round-trip through Office to recalc. Covers spilling dynamic arrays (FILTER / SORT / UNIQUE / SEQUENCE / LET / LAMBDA / MAP), VLOOKUP / XLOOKUP / INDEX / MATCH, financial & bond math (XIRR / PRICE / YIELD / DURATION / COUPNUM), statistical distributions, tests & regression (NORM.DIST / T.TEST / LINEST), and date & text functions.

    Plus native OOXML pivot tables from a source range with one command — multi-field rows/cols/filters, 10 aggregations, showDataAs modes, date grouping, calculated fields, top-N, layouts. Pivot cache + definition are written to OOXML, so Excel opens the file with the aggregation already populated:

    officecli add sales.xlsx '/Sheet1' --type pivottable \
      --prop source='Data!A1:E10000' --prop rows='Region,Category' \
      --prop cols=Quarter --prop values='Revenue:sum,Units:avg' \
      --prop showDataAs=percentOfTotal
    
    Template merge — generate once, fill many

    merge replaces {{key}} placeholders in any .docx / .xlsx / .pptx with JSON data — across paragraphs, table cells, shapes, headers, footers, and chart titles. Agent designs the layout once (expensive); production code fills it N times (cheap, deterministic, zero token cost). Avoids the failure mode where an agent regenerates each report from scratch and produces N inconsistent layouts.

    officecli merge invoice-template.docx out-001.docx --data '{"client":"Acme","total":"$5,200"}'
    officecli merge q4-template.pptx q4-acme.pptx --data data.json
    
    Round-trip dump — learn from existing docs

    dump serializes any .docx, .pptx, or .xlsx — whole document or any subtree (a single paragraph, table, slide, worksheet, the styles part, numbering, theme, or settings) — into a replayable batch JSON; batch replays it. Given a sample the user wants to imitate, an agent reads the structured spec instead of raw OOXML XML, mutates, and replays. Bridges "I have an existing template" and "generate me 100 variations."

    officecli dump existing.docx -o blueprint.json                  # whole document
    officecli dump existing.docx /body/tbl[1] -o table.json         # any subtree
    officecli dump existing.xlsx /Sheet1 -o sheet.json              # a single worksheet
    officecli batch new.docx --input blueprint.json
    

    Resident Mode & Batch

    For multi-step workflows, resident mode keeps the document in memory. Batch mode applies multiple operations in a single pass.

    # Resident mode — near-zero latency via named pipes
    officecli open report.docx
    officecli set report.docx /body/p[1]/r[1] --prop bold=true
    officecli set report.docx /body/p[2]/r[1] --prop color=FF0000
    officecli close report.docx
    
    # Batch mode — multi-command execution (atomic by default: any failed item rolls back the whole batch)
    echo '[{"command":"set","path":"/slide[1]/shape[1]","props":{"text":"Hello"}},
          {"command":"set","path":"/slide[1]/shape[2]","props":{"fill":"FF0000"}}]' \
      | officecli batch deck.pptx --json
    
    # Inline batch with --commands (no stdin needed)
    officecli batch deck.pptx --commands '[{"op":"set","path":"/slide[1]/shape[1]","props":{"text":"Hi"}}]'
    
    # Keep whatever succeeds even if some items fail (pre-1.0.137 behavior)
    officecli batch deck.pptx --input updates.json --best-effort --json
    
    # Stop at the first failing command instead of running the rest (still rolls back everything unless combined with --best-effort)
    officecli batch deck.pptx --input updates.json --stop-on-error --json
    

    Reading the file with another tool? Flush to disk first. officecli's own reads (get/query/view) always see your latest edits, so within officecli you never need to save. But a live resident defers the disk write, so before a non‑officecli program reads the file — python‑docx/openpyxl, Microsoft Word, a renderer, delivery/upload — flush it:

    officecli set report.docx /body/p[1] --prop bold=true
    officecli save report.docx           # flush, keep the resident warm (or `close` to flush + release)
    python my_reader.py report.docx      # now sees the edit
    

    A live resident also auto‑flushes shortly after going idle (adaptive 2–10s, scaled to the document's measured save cost). For a pipeline where another program reads after every command, set OFFICECLI_RESIDENT_FLUSH=each — every mutation is on disk before the command returns, while the resident stays warm. Full flush model (each/auto/fixed/off, save / close, env tuning): wiki → open / close.

    Three-Layer Architecture

    Start simple, go deep only when needed.

    LayerPurposeCommands
    L1: ReadSemantic views of contentview (text, annotated, outline, stats, issues, html, svg, screenshot)
    L2: DOMStructured element operationsget, query, set, add, remove, move, swap
    L3: Raw XMLDirect XPath access — universal fallbackraw, raw-set, add-part, validate
    # L1 — high-level views
    officecli view report.docx annotated
    officecli view budget.xlsx text --cols A,B,C --max-lines 50
    
    # L2 — element-level operations
    officecli query report.docx "run:contains(TODO)"
    officecli add budget.xlsx / --type sheet --prop name="Q2 Report"
    officecli move report.docx /body/p[5] --to /body --index 1
    
    # L3 — raw XML when L2 isn't enough
    officecli raw deck.pptx '/slide[1]'
    officecli raw-set report.docx document \
      --xpath "//w:p[1]" --action append \
      --xml '<w:r><w:t>Injected text</w:t></w:r>'
    

    AI Integration

    MCP Server

    Built-in MCP server — register with one command:

    officecli mcp claude       # Claude Code
    officecli mcp cursor       # Cursor
    officecli mcp vscode       # VS Code / Copilot
    officecli mcp lmstudio     # LM Studio
    officecli mcp opencode     # OpenCode
    officecli mcp list         # Check registration status
    

    Exposes all document operations as tools over JSON-RPC — no shell access needed.

    Direct CLI Integration

    Get OfficeCLI working with your AI agent in two steps:

    1. Install the binary -- one command (see Installation)
    2. Done. OfficeCLI automatically detects your AI tools (Claude Code, GitHub Copilot, Codex) by checking known config directories and installs its skill file. Your agent can immediately create, read, and modify any Office document.

    If auto-install doesn't cover your setup, you can install the skill file manually:

    Feed SKILL.md to your agent directly:

    curl -fsSL https://officecli.ai/SKILL.md
    

    Install as a local skill for Claude Code:

    curl -fsSL https://officecli.ai/SKILL.md -o ~/.claude/skills/officecli.md
    

    Other agents: Include the contents of SKILL.md in your agent's system prompt or tool description.

    Why your agent will thrive on OfficeCLI

    • Deterministic JSON output — every command supports --json with consistent schemas. No regex parsing, no scraping stdout.
    • Path-based addressing — every element has a stable path (/slide[1]/shape[2]). Agents navigate documents without understanding XML namespaces. (OfficeCLI syntax: 1-based indexing, element local names — not XPath.)
    • Progressive complexity (L1 → L2 → L3) — agents start with read-only views, escalate to DOM ops, fall back to raw XML only when needed. Minimizes token usage.
    • Self-healing workflow — validate, view issues, and the structured error codes (not_found, invalid_value, unsupported_property) return suggestions and valid ranges. Agents self-correct without human intervention.
    • Built-in agent-friendly rendering engine — view html / view screenshot / watch emit HTML and PNG natively. No Office required. Agents can see their output and fix layout issues, even inside CI / Docker / headless environments.
    • Built-in formula & pivot engine — 350+ Excel functions auto-evaluated on write (incl. spilling dynamic arrays, financial / bond and statistical families); native OOXML pivot tables from a source range with one command. Agents read computed values and shipped aggregations immediately, without round-tripping through Office.
    • Template merge — agent designs the layout once, downstream code fills {{key}} placeholders N times. Avoids burning tokens regenerating every report from scratch.
    • Round-trip dump — dump turns any .docx, .pptx, or .xlsx into replayable batch JSON. Agents learn from human-authored samples by reading a structured spec, not raw OOXML XML.
    • Built-in help — when unsure about property names or value formats, the agent runs officecli <format> set <element> instead of guessing.
    • Auto-install — OfficeCLI detects your AI tooling (Claude Code, Cursor, VS Code, …) and configures itself. No manual skill-file setup.

    Built-in Help

    Don't guess property names — drill into the help:

    officecli help pptx set              # All settable elements and properties
    officecli help pptx set shape        # Detail for one element type
    officecli help docx query            # Selector reference: attributes, :contains, :has(), etc.
    

    Run officecli --help for the full overview.

    JSON Output Schemas

    All commands support --json. The general response shapes:

    Single element (get --json):

    {"tag": "shape", "path": "/slide[1]/shape[1]", "attributes": {"name": "TextBox 1", "text": "Hello"}}
    

    List of elements (query --json):

    [
      {"tag": "paragraph", "path": "/body/p[1]", "attributes": {"style": "Heading1", "text": "Title"}},
      {"tag": "paragraph", "path": "/body/p[5]", "attributes": {"style": "Heading1", "text": "Summary"}}
    ]
    

    Errors return a non-zero exit code with a structured error object including error code, suggestion, and valid values when available:

    {
      "success": false,
      "error": {
        "error": "Slide 50 not found (total: 8)",
        "code": "not_found",
        "suggestion": "Valid Slide index range: 1-8"
      }
    }
    

    Error codes: not_found, invalid_value, unsupported_property, invalid_path, unsupported_type, missing_property, file_not_found, file_locked, invalid_selector. Property names are auto-corrected -- misspelling a property returns a suggestion with the closest match.

    Error Recovery -- Agents self-correct by inspecting available elements:

    # Agent tries an invalid path
    officecli get report.docx /body/p[99] --json
    # Returns: {"success": false, "error": {"error": "...", "code": "not_found", "suggestion": "..."}}
    
    # Agent self-corrects by checking available elements
    officecli get report.docx /body --depth 1 --json
    # Returns the list of available children, agent picks the right path
    

    Mutation confirmations (set, add, remove, move, create with --json):

    {"success": true, "path": "/slide[1]/shape[1]"}
    

    Exit codes. 0 — the operation landed. 1 — it did not (process or business failure; the envelope carries error). 2 — it ran with caveats: an unsupported_property was dropped, or a validator raised a warning. Exit 2 covers both "landed with a warning" (success: true) and "nothing applied" (success: false, e.g. every property refused), so scripts must read success in the envelope, not the exit code alone; warnings[] lists what was dropped. The MCP server derives isError from the envelope the same way.

    Comparison

    OfficeCLIMicrosoft OfficeLibreOfficepython-docx / openpyxl
    Open source & free✓ (Apache 2.0)✗ (paid license)✓✓
    AI-native CLI + JSON✓✗✗✗
    Zero install (single binary)✓✗✗✗ (Python + pip)
    Call from any language✓ (CLI)✗ (COM/Add-in)✗ (UNO API)Python only
    Path-based element access✓✗✗✗
    Raw XML fallback✓✗✗Partial
    Built-in agent-friendly rendering engine✓✗✗✗
    Headless HTML/PNG output✓✗Partial✗
    Template merge ({{key}}) across formats✓✗✗✗
    Round-trip dump → batch JSON✓✗✗✗
    Live preview (auto-refresh on edit)✓✗✗✗
    Headless / CI✓✗Partial✓
    Cross-platform✓Windows/Mac✓✓
    Word + Excel + PowerPoint✓✓✓Separate libs

    Command Reference

    CommandDescription
    createCreate a blank .docx, .xlsx, or .pptx (type from extension)
    viewView content (modes: outline, text, annotated, stats (--page-count), issues, html, svg, screenshot, pdf (via exporter plugin), forms (via format-handler plugin)). docx supports --render auto|native|html.
    load_skillPrint embedded SKILL.md content for a specialized skill (no install)
    getGet element and children (--depth N, --json)
    queryCSS-like query with boolean and/or, row-by-column-name (row[Salary>5000]), --find flag
    setModify element properties; accepts selectors and Excel-native paths (parity with get/query), --find/--replace flags
    addAdd element (or clone with --from <path>)
    removeRemove an element
    moveMove element (--to <parent>, --index N, --after <path>, --before <path>)
    swapSwap two elements
    validateValidate against OpenXML schema
    view <file> issuesEnumerate document issues (text overflow, missing alt text, formula errors, ...)
    batchMultiple operations applied in a single pass (stdin, --input, or --commands; atomic by default — any failed item rolls back the whole batch — --best-effort to keep partial progress, --stop-on-error to abort early)
    dumpSerialize a .docx, .pptx, or .xlsx into a replayable batch JSON (round-trip via batch); accepts a subtree path
    refreshRecalculate TOC page numbers / PAGE / cross-references (.docx; Word backend on Windows, headless-HTML fallback)
    pluginsList / inspect / lint installed plugins (extend to .doc, .hwpx, .pdf export via dump-reader / exporter / format-handler kinds)
    mergeTemplate merge — replace {{key}} placeholders with JSON data
    watchLive HTML preview in browser with auto-refresh
    mcpStart MCP server for AI tool integration
    rawView raw XML of a document part
    raw-setModify raw XML via XPath
    add-partAdd a new document part (header, chart, etc.)
    openStart resident mode (keep document in memory)
    closeSave and close resident mode
    installInstall binary + skills + MCP (all, claude, cursor, etc.)
    configGet or set configuration
    help <format> <command>Built-in help (e.g. officecli help pptx set shape)

    End-to-End Workflow Example

    A typical self-healing agent workflow: create a presentation, populate it, verify, and fix issues -- all without human intervention.

    # 1. Create
    officecli create report.pptx
    
    # 2. Add content
    officecli add report.pptx / --type slide --prop title="Q4 Results"
    officecli add report.pptx '/slide[1]' --type shape \
      --prop text="Revenue: $4.2M" --prop x=2cm --prop y=5cm --prop size=28
    officecli add report.pptx / --type slide --prop title="Details"
    officecli add report.pptx '/slide[2]' --type shape \
      --prop text="Growth driven by new markets" --prop x=2cm --prop y=5cm
    
    # 3. Verify
    officecli view report.pptx outline
    officecli validate report.pptx
    
    # 4. Fix any issues found
    officecli view report.pptx issues --json
    # Address issues based on output, e.g.:
    officecli set report.pptx '/slide[1]/shape[1]' --prop font=Arial
    

    Units & Colors

    All dimension and color properties accept flexible input formats:

    TypeAccepted formatsExamples
    Dimensionscm, in, pt, px, or raw EMU2cm, 1in, 72pt, 96px, 914400
    ColorsHex, named, RGB, theme#FF0000, FF0000, red, rgb(255,0,0), accent1
    Font sizesBare number or pt-suffixed14, 14pt, 10.5pt
    Spacingpt, cm, in, or multiplier12pt, 0.5cm, 1.5x, 150%

    Common Patterns

    # Replace all Heading1 text in a Word doc
    officecli query report.docx "paragraph[style=Heading1]" --json | ...
    officecli set report.docx /body/p[1]/r[1] --prop text="New Title"
    
    # Export all slide content as JSON
    officecli get deck.pptx / --depth 2 --json
    
    # Bulk-update Excel cells
    officecli batch budget.xlsx --input updates.json --json
    
    # Import CSV data into an Excel sheet
    officecli add budget.xlsx / --type sheet --prop name="Q1 Data"
    officecli import budget.xlsx "/Q1 Data" sales.csv --header
    
    # Template merge for batch reports
    officecli merge invoice-template.docx invoice-001.docx --data '{"client":"Acme","total":"$5,200"}'
    
    # Check document quality before delivery
    officecli validate report.docx && officecli view report.docx issues --json
    

    From Python or Node.js — install one of the thin resident-pipe SDKs (no per-call process spawn):

    # Python — `pip install officecli-sdk`
    import officecli
    with officecli.create("deck.pptx") as doc:          # or officecli.open("deck.pptx")
        doc.send({"command": "add", "parent": "/", "type": "slide"})
        print(doc.send({"command": "get", "path": "/slide[1]"}))
    
    // Node.js — `npm install @officecli/sdk`
    const oc = require("@officecli/sdk");
    const doc = await oc.create("deck.pptx");            // or oc.open("deck.pptx")
    await doc.send({ command: "add", parent: "/", type: "slide" });
    console.log(await doc.send({ command: "get", path: "/slide[1]" }));
    await doc.close();
    

    Both SDKs auto-provision the native CLI when missing (mirror-first, Windows-capable) and announce the install rather than doing it silently.

    Or wrap subprocess directly, one-shot:

    import json, subprocess
    def cli(*args):
        return json.loads(subprocess.check_output(["officecli", *args, "--json"], text=True))
    cli("create", "deck.pptx")
    

    Documentation

    The Wiki has detailed guides for every command, element type, and property:

    Build from Source

    Requires .NET 10 SDK for compilation only. The output is a self-contained, native binary -- .NET is embedded in the binary and is not needed at runtime.

    ./build.sh
    

    License

    Apache License 2.0

    Bug reports and contributions are welcome on GitHub Issues.


    If you find OfficeCLI useful, please give it a star on GitHub — it helps others discover the project.

    OfficeCLI.AI | GitHub