OfficeCLI,一款不错的Office Tools For Agents
是不是被excel各种格式和一些固定报表给烦死?
WPS /Office用起来是不是在excel过程中好多公式也不熟悉?
WPS AI和各种报表工具生成的公式总是不太顺心?
这两天给财务部做Agents培训时,经常碰到各种问题,除了沟通不畅以外,更多的是各种报表问题,表头错位、字体不统一、SUM 公式报错。
按他们老办法,得一行行调列宽、一个个改字体、再手动检查公式引用。没有半小时搞不定。这种活每个月至少干两次,每次都是复制粘贴改格式,手累心更累。
实际上用 OfficeCLI,一个用命令行操作 Excel 的开源工具,凡是能用鼠标点几下的,用命令行解决 Excel 操作更便捷。
鼠标不是不好,就是太慢。重复 100 次的操作,命令行一次搞定。

先看清,再动手
OfficeCLI 的设计思路很简单:分三层,别一上来就用大炮打蚊子。
L1:view / get — 先看结构。拿到文件别急着改,先看里面有什么。officecli view file.xlsx outline 列出所有 sheet,get /Sheet1/A1 --json 看具体单元格的值和格式。90% 的问题在这一层就能搞清楚 —— 公式引用错了吗?sheet 名写对了吗?数据类型是文本还是数字?
L2:set / add / batch — 日常操作。这是主力层。写单元格、加公式、插图表、建透视表、导 CSV、批量修改,全部在这一层。命令很直白:set 改属性,add 加元素,batch 一次提交几十条操作。
L3:raw-set — 降级兜底。需要操作底层 XML 命名空间、自定义 Office 扩展属性时才会用到。我写了三个月 Excel 脚本,一次 L3 都没碰过。我的同事老陈倒是用过一次,要改一个自定义的文档属性,L2 也搞不定。对我来说,知道有这层就行,真遇到再说。
一个完整的例子:
# 创建文件
officecli create report.xlsx
# 写表头,加粗 + 14pt 字体
officecli set report.xlsx /Sheet1/A1 --prop value="Revenue" --prop bold=true --prop font.size=14pt
# 写数据,带货币格式
officecli set report.xlsx /Sheet1/B2 --prop value=42000 --prop numFmt='$#,##0'
# 写合计公式
officecli set report.xlsx /Sheet1/B5 --prop formula="SUM(B2:B4)"
# 调整列宽,不然数字显示不全
officecli set report.xlsx "/Sheet1/col[B]" --prop width=15
# 验证结果
officecli get report.xlsx /Sheet1/B5 --json
六行命令,创建、写入、格式化、公式、验证全部搞定。你告诉我用鼠标需要点多少下?这六行我可以复制到任意项目里复用,鼠标操作可没法复制粘贴。
每周至少用一次的 5 个场景

场景 1:批量创建报表
月初要给 10 个团队各发一份 KPI 报表。以前我手动新建 10 个 sheet,调格式、改文件名。现在写一个 JSON 描述所有操作,一行 batch 命令全部生成:
officecli batch report.xlsx --input updates.json
JSON 里写清楚每个 sheet 叫什么名字、表头是什么、公式怎么算。648 行数据 30 秒加载完,零失败。我喝咖啡的时间报表已经躺在邮箱里了。
场景 2:公式计算
Excel 公式写错是最烦的。#REF!、#DIV/0!、#VALUE!,报错信息永远不知道在哪。用 OfficeCLI 写公式后,立刻 get --json 验证返回值:
officecli set report.xlsx /Sheet1/B2 --prop formula="SUM(B1:B10)"
officecli get report.xlsx /Sheet1/B2 --json
# 返回:{ "value": 135000 }
公式对不对,数据准不准,终端里一眼看到。不用在 Excel 里来回切换单元格找报错。我以前写 VLOOKUP 写错好几次,现在写错了也能秒发现。
场景 3:数据透视表
数据透视表是我最怕的鼠标操作。选数据源、拖字段、放行列、调汇总方式,点错一步全重来。OfficeCLI 一行命令:
officecli add report.xlsx /Sheet1 --type pivottable \
--prop source="Sheet1!A1:D100" \
--prop rows="Region" \
--prop values="Revenue"
source 指定数据范围,rows 告诉它按什么分组,values 告诉它汇总什么。不用拖拽,不用怕点错。改参数重跑就行。说实话我第一次用的时候还不太确定 source 和 rows 到底怎么对应,跑了两遍才搞对。
场景 4:条件格式
100 行销售数据,高亮标出低于目标的。手动设置红绿色阶?先选中区域、再点条件格式、再选色阶、再调阈值... 手酸。命令行一句话搞定:
officecli format report.xlsx /Sheet1 --type colorScale \
--prop range="B2:B100" \
--prop minColor="#FF0000" \
--prop maxColor="#00FF00"
低于目标的红,高于目标的绿。异常数据一眼就能揪出来。我有一次把 minColor 和 maxColor 写反了,结果业绩最差的人显示绿色,最好的反而红色。发到群里被笑了半天。
场景 5:CSV 导入
从系统导出 CSV,复制粘贴到 Excel 里,身份证号变科学计数法、日期格式乱套、中文乱码。我有一次把一份客户名单贴进去,所有手机号前面都少了 0,整列变成 1.38E+10 的科学计数法。当场崩溃。OfficeCLI 的 import 命令原生处理:
officecli import report.xlsx /Sheet1 --input data.csv --header
--header 自动把第一行变成表头,带 AutoFilter 和冻结首行。6480 个单元格,30 秒。格式不乱,编码不丢。上次那份客户名单,我用 import 重新跑了一遍,手机号全对。
以前两小时,现在五分钟。我直接拿去摸鱼了。不是夸张,是真的省时间。上个月我把整个部门的月报流程改成 OfficeCLI 脚本,原来三个人各干各的格式,现在一个人跑脚本,剩下两个人... 也没闲下来,只是不用点鼠标了。
踩坑实录:这些坑我踩过不止一次

工具好用,但坑也不少。以下每个坑我都至少踩过两次。
坑 1:路径含 不引号包裹
想改 A 列宽度,写了 officecli set file.xlsx /Sheet1/col[A] --prop width=20。bash 报错:bash: [: missing ]。col[A] 里的 [] 是 shell 元字符,被解析成条件表达式了。我当时盯着报错看了五分钟,还以为 OfficeCLI 的语法变了,结果是引号没加。
解决:路径加引号:"/Sheet1/col[A]"。
坑 2:跨 sheet 引用的 被 shell 转义
写跨 sheet 公式时,Sheet1!A1 里的 ! 被 bash 转成 \!,公式变成字面文本,引用失效。get 一看 formula=Sheet1\!A1,就知道坏了。这个坑我踩了两次,第一次以为是 OfficeCLI 的 bug,差点去提 issue。
解决:用 batch heredoc,单引号定界符禁用所有 shell 扩展:
cat <<'EOF' | officecli batch file.xlsx
[{"command":"set","path":"/Summary/B2","props":{"formula":"Revenue!B13"}}]
EOF
get 后确认 formula= 显示 plain !,没有反斜杠,才算对。
坑 3:$ 值被 shell 变量扩展
设货币格式 numFmt='$#,##0',结果 $ 被 shell 当成变量引用,展开成空字符串。格式变成 #,##0,没有美元符号。解决方式很简单,单引号包裹:--prop numFmt='$#,##0'。但第一次发现的时候,我愣是查了半天为什么货币符号不见了。
坑 4:Pareto 图表不支持 labelRotation
想做 Pareto 图,加了 labelRotation 属性。validate 报错:bad endParaRPr,图表损坏。查了文档才知道这是个已知 bug。目前的状态是:Pareto 别碰,改用 column 或 boxWhisker。只设 title/min/max/majorGridlines/visible,别碰 labelRotation。
坑 5:Rich Text / 3D 图表不支持
尝试在同一个单元格里混合格式(部分文字加粗、部分变色),命令成功但效果不对。想插个 3D 饼图,直接被忽略。这两个特性目前不支持,我试了几次之后放弃了。混合格式用纯文本 + 条件格式替代,3D 图表换 2D 平面。不算大问题,提前知道就行。
我的 QA 检查清单
写完脚本不代表完事。Excel 文件结构复杂,一个操作可能意外影响别的部分。我第一次用 batch 批量改 50 个单元格,结果把旁边一列的公式引用全搞乱了,找了二十分钟才发现是范围写错了一格。从那以后我每次都跑这个检查清单:
# 1. 结构检查 — 空 sheet、坏公式、缺失引用
officecli view file.xlsx issues
# 2. 错误排查 — 五种常见公式错误
officecli query file.xlsx 'cell:contains("#REF!")'
officecli query file.xlsx 'cell:contains("#DIV/0!")'
officecli query file.xlsx 'cell:contains("#VALUE!")'
officecli query file.xlsx 'cell:contains("#NAME?")'
officecli query file.xlsx 'cell:contains("#N/A")'
# 3. 校验文件完整性
officecli validate file.xlsx
# 4. 视觉检查 — 打开 HTML 预览看有没有 ### 截断
officecli view file.xlsx html
# 5. 公式抽查 — 随机挑 2-3 个公式,确认 cachedValue 正确
officecli get file.xlsx /Sheet1/B5 --json
第一次 QA 几乎不可能通过。我把它当 bug hunt,不是确认步骤。任何一步失败,修复,然后重跑整个循环。公式计算类的错误,漏出去就是数据事故。上个月有个同事没做验证就发出去,结果合计行的公式引用错了一格,少算了五万块钱。虽然后来补发了,但群里被老板艾特的感觉... 不太好。
OfficeCLI 不是银弹。它替代不了 Excel 桌面软件的精细排版,替代不了 VBA 的复杂交互逻辑。但它把"重复 100 次的鼠标操作"变成了"一行命令"。
对我来说,这就够了。省下时间写代码,比点鼠标有意义多了。
如果你也每个月被 Excel 格式折磨,不妨试试这个工具。安装就一行命令:curl -fsSL https://d.officecli.ai/install.sh | bash,剩下的慢慢摸索。有坑,但坑不算深。
一个 AI 瞎捣鼓的架构师,把团队转型过程中踩过的坑分享给你,欢迎大家评论区讨论。