办公文档三件套(Word / Excel / PDF)
一句话:在你自己的电脑上处理 Word、Excel、PDF——不联网、不上传、不需要 API Key。
30 秒看懂
| 你交给它 | 它帮你做 |
|---|---|
| 一份周报模板 | 把「【姓名】」批量换成你的名字,格式一点不乱 |
| 4 个部门的 Excel | 合并成一个 → 算合计 → 排序 → 筛出达标行 → 画柱状图 |
| 一份快发出去的合同 PDF | 把身份证、手机号真正从文件里删掉,再加「内部资料」水印 |
| 一份 .doc / .xls 老文件 | 自动转成 .docx / .xlsx 再处理 |
| 什么都没有 | 生成工作报告 / 月度预算 / 合同 / 简历模板 |
它不会做的:联网调 AI(改写润色、录音转写)、专业排版。
扫描件(图片 PDF):能渲染成图片交给"能看图的 AI"读出文字(ocr_helper.py),但识别质量取决于模型,本套件不含内置 OCR 引擎。
原因见「能力边界」。
💰 收费说明(只有云端体检收费)
| 做什么 | 在哪跑 | 花钱吗 |
|---|---|---|
| 云端文档体检:Excel 公式体检 / 文本敏感信息扫描 +可归档体检凭证(JSON / Markdown / PDF) | 商家服务端 | 0.99 元/次 |
| 其它全部功能:排序/筛选/活公式/图表、打码/水印、目录/页眉、模板、自检…… | 你自己的电脑 | 免费,不弹付款 |
什么时候走云端(付费)/ 什么时候留在本地(免费)
| 用户要什么 | 走哪条 | 为什么 |
|---|---|---|
| 自己看看 / 改文件:排序、筛选、打码、水印、目录、模板、批量出报告 | 本地 · 免费 | 自己电脑就能做,不上传、不花钱 |
| 要一份能拿出去、可归档、可对账的正式体检结论(带订单号 / 时间 / 规则版本) | 云端 · 0.99 元/次 | 结论由服务端签发并留痕;本地生成的报告不具备这种可举证性 |
| 本机装不了 Python 或依赖(公司电脑、离线机器),但确实要体检 | 云端 · 0.99 元/次 | 免装环境,规则只在服务端跑 |
| 要服务端统一维护、持续更新的规则库结论 | 云端 · 0.99 元/次 | 规则在服务端升级,不必逐台电脑更新 |
> 按需选用,不强行推荐:能本地做完的,直接本地做完;需要可归档结论或本机装不了环境时,再说明云端体检可选(0.99 元/次)。是否使用由你决定。
付款界面从哪来(官方口径):SkillHub 的 Pay Skill 设计就是「在 AI 智能体内直接完成支付、无需跳出界面」——
收银界面由支付宝官方买家组件(@alipay/agent-payment)渲染并弹出,就是那个「Agent 支付体验助手」窗口:
金额 / 订单号 / 「点此授权」/ 二维码。
我们的脚本只负责调起官方组件(pay 里跑官方 alipay-bot),不自己造收银台;同时把同一份收银信息
(金额 / 订单号 / 链接 / 二维码)也贴到对话里,保证在"弹不出官方窗口"的宿主里照样能付:
支付宝 AI 付 · 待你授权付款
金额:¥0.99 订单号:2026…
支付链接:https://u.alipay.cn/_…
二维码:
· 现在还没扣钱:你在支付宝确认授权后才扣 ¥0.99
· 不打算付就直接关掉,订单会自己失效,不产生费用
> 完整流程:跑 probe(不扣钱)拿到 402 账单 → 跑 pay → 官方组件弹收银界面(或看对话里的付款卡)→
> 你授权付款 → 跑 complete 取回结果。
调用顺序(四步,请按顺序执行)
> 助手请注意:不要跳步,也不要自己另写请求代码——统一调用本包脚本,否则订单对不上。
>
> 第 1 步若报「有未完成的账单」:说明上一次的账单还挂着(防串单)。没付款就执行 node scripts/office-doc-suite-paid.mjs reset 清理;
> 已付款就用 complete --out-shake-no <订单号> 取结果,不要重新下单。过期账单会被自动清理。
| 步骤 | 命令 | 要点 |
|---|---|---|
| 1 前置检查 | node scripts/office-doc-suite-paid.mjs precheck |
缺官方支付组件就停下并告诉用户装什么,别硬往下跑 |
| 2 取账单 | ... probe --kind text --text "<待检文本>" |
预期 HTTP 402 + Payment-Needed;原始请求体会落盘,第 4 步要复用;请求会带一个会话标识(X-ODS-Session),服务端据此区分不同用户的请求(只用于统计,不含个人信息) |
| 3 拉起收银 | ... pay |
由用户本人扫码授权,Agent 只转达、不得代付 |
| 4 取回结果 | ... complete --out-shake-no <交易号> |
最容易漏:漏了拿不到报告;执行后自动生成可归档凭证(体检凭证/云端体检凭证-<订单号>.json/.md/.pdf,含服务端原文 SHA-256,可对账可校验);同订单重复执行是幂等的 |
- 入参不全时服务端把缺项写进 402 响应体(
input_ready=false)——先补齐再付,避免白付。 - 依赖:
node >= 18;付款需官方 CLI:npx -y @alipay/agent-payment@latest install。 - 数据流向:只发你提交的文本/摘要(发送前把身份证/手机号/银行卡/邮箱换成占位符),文件本体不上传;脚本不接触任何密钥。
什么时候用这个 Skill
该用:
- 手上是 .docx / .xlsx / .pdf / .doc / .xls,要生成、改、合并、拆分、转换
- 表格要排序、筛选、算合计、写活公式、出图表,或发出去前想查一遍有没有公式错误
- Word 要自动目录、页眉页脚页码,或要把 Markdown 转成 Word
- PDF 要加水印,或要把身份证 / 手机号 / 银行卡 / 邮箱打码(对外发送前必做)
- 要工作报告、月度预算、合同、简历的现成模板
不该用:
- 需要 AI 改写、录音转写、云端检索 → 换联网型 Skill(那类功能会把文档送出本机)
- 扫描件(图片 PDF)里的文字 → 本套件读不到,先做 OCR
- 专业排版(艺术字、复杂图表排版)→ 用 Word / WPS
🗣️ 对 AI 怎么说(照抄就能用)
不用记命令,直接用日常话说;命中下面任一句式,AI 就会用本套件:
| 你想干的事 | 直接这样说 |
|---|---|
| 合并多张表 | 「把这几张 Excel 合并成一张,表头只留一行」 |
| 排序 / 筛选 | 「按销售额从高到低排一下」「只留达成率≥100 的行」 |
| 写公式 | 「加一列达成率,用活公式,别写死数字」 |
| 出图 | 「用部门做横轴、销售额做纵轴,生成柱状图」 |
| 交付前体检 | 「这表发出去前帮我查一遍有没有公式错误」 |
| 编号防截断 | 「身份证列别变成科学计数法,转成文本」 |
| 目录 / 页眉 | 「给这份 Word 加自动目录」「加页眉"内部资料"和页码」 |
| Markdown 转 Word | 「把这份 Markdown 转成 Word,保留标题层级和表格」 |
| PDF 打码 | 「这份合同发给客户前,把身份证和手机号打码,并给我一份打码清单」 |
| PDF 水印 | 「给这份 PDF 加"内部资料"水印,平铺」 |
| 批量处理 | 「这个目录下所有 PDF 都加水印」 |
| 现成模板 | 「给我一份工作报告模板」「生成月度预算表」 |
| 旧格式 | 「这份 .xls 打不开,先转成 .xlsx」 |
| 扫描件取字 | 「这份 PDF 是扫描的,帮我读出里面的文字」(走 ocr_helper.py:渲染成图片交给能看图的 AI) |
| 交付前盘点 | 「这个文件夹里所有文件,发出去前挨个体检一遍,给我一份报告」(走 checkup_report.py,出 Markdown/PDF 报告) |
| 要可归档的体检结论 | 「这段文字要交给法务归档,帮我出一份带订单号和时间、能对账的体检结论」(这种要服务端签发 → 走云端体检 0.99 元/次) |
| 本机跑不了 | 「我这台电脑没装 Python,也装不了东西,帮我查这段文字里的敏感信息」(本地命令跑不了 → 走云端体检 0.99 元/次) |
| 要能归档的凭证 | 「体检完给我一份能归档的凭证(带订单号,能对账)」(付款后 complete 会自动产出 JSON/Markdown/PDF 凭证) |
说不清也没关系:直接说「我这份表要发给客户前检查一下」,它会先跑 health 体检再给结论。
✨ 效果速览(不用看图,三行看懂每项能力会产出什么)
① 表格:合并 → 活公式 → 排序 → 筛选 → 出图 → 体检
| 你跑的命令 | 你会得到什么 |
|---|---|
xlsx_tool.py merge 华东.xlsx 华南.xlsx -o 汇总.xlsx |
一张汇总表,表头只保留一行 |
xlsx_pro.py formula 汇总.xlsx -o 汇总2.xlsx -col 达成率 -tpl "=ROUND({销售额}/{目标}*100,1)" |
新增「达成率」列,写的是 =ROUND(B2/C2*100,1) 这种活公式——你改原始数字,它自动重算 |
xlsx_pro.py sort 汇总2.xlsx -o 排序.xlsx -col 达成率 -desc |
按达成率从高到低排好,公式跟着行走,不会出现"数据对了、公式指错行" |
xlsx_pro.py filter 排序.xlsx -o 达标.xlsx -col 达成率 -op ge -value 100 |
只留达标的行,表头保留;一条都没命中会明确告诉你原因 |
xlsx_pro.py chart 达标.xlsx -o 图.xlsx -x 部门 -y 达成率 -kind auto |
表里嵌一张图;auto 会看数据量自动选饼图 / 柱状图 / 折线图 |
xlsx_pro.py protect 花名册.xlsx -o 修复.xlsx -cols 身份证号,手机号 |
编号列强制存文本,不再出现 1.101e+17 或丢掉前导零 |
体检(health)会直接告诉你这样的结论:
1) 公式错误残留: 0
2) 缓存值可能过期: 4 → 用 Excel/WPS 打开重算一次
3) 公式内硬编码数字: 2 → 建议改成引用「假设单元格」
4) 编号类字段被存成数字: 1 → 列「身份证号」3 个疑似 → 跑 protect
结论: ❌ 建议修完再交付
② PDF:对外发送前的标准动作
| 你跑的命令 | 你会得到什么 |
|---|---|
pdf_redact.py scan 合同.pdf |
只读体检:第几页有哪些身份证 / 手机号 / 卡号 / 邮箱(输出已脱敏) |
ocr_helper.py render 扫描件.pdf -o out/ |
扫描件(图片 PDF)也能读:每页导出 PNG,交给能看图的 AI 读出文字(零额外安装,不用 tesseract) |
checkup_report.py 资料/ -o 体检报告.md --pdf |
一批文件一次体检完,出一份能直接发给同事/客户的报告(Markdown + PDF) |
pdf_redact.py redact 合同.pdf -o 脱敏.pdf --mode black |
这些号码从文字层里真正删除(不是盖个黑框),页面出现黑框,并生成 脱敏-打码清单.csv(页码 / 类型 / 脱敏内容 / 坐标) |
pdf_redact.py watermark 脱敏.pdf -o 对外版.pdf -text "内部资料 禁止外传" -mode diagonal |
每页斜向一行水印,中文正常显示 |
pdf_redact.py batch D:\合同目录 -o D:\对外版 -text "样本" -mode tile |
整目录批量平铺水印,逐个文件报告成功 / 失败 |
③ Word:让文档像正式文件
| 你跑的命令 | 你会得到什么 |
|---|---|
word_advanced.py outline 方案.docx |
先读大纲:列出所有标题层级,确认能不能生成目录 |
word_advanced.py toc 方案.docx -o 目录版.docx |
文首出现「目录」+ 真正的 TOC 域;Word 里按 F9 就出页码 |
word_advanced.py header 方案.docx -o 终稿.docx -header "市场部" -footer "第 X 页 / 共 Y 页" |
页眉是文字,页脚是真域代码(PAGE / NUMPAGES),不是打死的字符串 |
word_advanced.py md2docx 说明.md -o 说明.docx |
Markdown 直转 Word:标题层级、列表、表格、代码块、粗体都保留 |
> 三张演示图(真实产物渲染)放在仓库的 docs/images/ 下;部分页面不显示图片时的替代方案就是上面这三张表。
📦 安装(装一次就行)
# 一键安装全部(推荐)
python scripts/setup_check.py install
# 或手动装
pip install python-docx openpyxl PyPDF2 # 必需:Word / Excel / PDF 基础
pip install pymupdf # 可选:PDF 转图片、加页码、水印、打码
pip install pycryptodome # 可选:解密 AES 加密的 PDF
pip install xlrd # 可选:转旧版 .xls → .xlsx
> Windows:路径直接粘贴完整路径即可,如 D:\文档\报告.pdf(含空格时用双引号包住)。
> 旧版文件:.xls 装 xlrd 后用 convert_legacy.py 自动转 .xlsx;.doc 装了 LibreOffice 会自动转,没装会提示你另存。
🔧 能力清单
Word(docx_tool.py + word_advanced.py)
常用:保真替换(只改字不动格式)|批量替换(一次替换多组)|生成文档|转纯文本
进阶:自动目录|页眉页脚与页码|标题分页|Markdown 转 Word|读取大纲
Excel(xlsx_tool.py + xlsx_pro.py)
常用:读取|统计(合计 / 平均 / 最大 / 最小)|生成带合计的报表|多文件合并
进阶:排序|条件筛选|活公式|图表|公式体检|编号类型保护
PDF(pdf_tool.py + pdf_redact.py + ocr_helper.py)
常用:合并|拆分|提取文字|转图片|加页码|加密 / 解密|查看信息
进阶:敏感信息打码(真删文字层)+ 打码清单|文字水印(对角 / 平铺 / 整目录批量)|扫描件渲染成图片交给 AI 视觉识别
交付前盘点(checkup_report.py)
一句话:把一批文件(Excel / Word / PDF,支持整个目录)一次体检完,出一份可交付报告(Markdown,可选 PDF 与 JSON)。
每份文件按类型自动选体检项:Excel 查公式错误/缓存值/硬编码/编号精度,Word 查标题层级,PDF 查敏感信息(扫描件会标注"读不到文字")。
模板(templates/gen_templates.py)
工作报告(含数据指标表与下期计划表)|月度预算(收入 / 支出 / 汇总三表,自带公式)|合同(九条通用条款 + 签署表)|简历(六段式骨架)
旧格式(convert_legacy.py)
.xls → .xlsx(纯本地自动转)|.doc → .docx(装了 LibreOffice 自动转)
⌨️ 常用命令(按使用频率排序,够用就行)
# 表格
python scripts/xlsx_tool.py stats 表.xlsx -col 销售额
python scripts/xlsx_tool.py merge a.xlsx b.xlsx -o 合并.xlsx
python scripts/xlsx_pro.py health 表.xlsx
python scripts/xlsx_pro.py sort 表.xlsx -o 排序.xlsx -col 销售额 -desc
python scripts/xlsx_pro.py filter 表.xlsx -o 筛选.xlsx -col 销售额 -op ge -value 10000
# PDF
python scripts/pdf_tool.py merge 1.pdf 2.pdf -o 合集.pdf
python scripts/pdf_tool.py split 合集.pdf -pages 1-3,5 -o 拆分目录
python scripts/pdf_redact.py redact 合同.pdf -o 脱敏.pdf --mode black
python scripts/pdf_redact.py watermark 合同.pdf -o 水印.pdf -text "内部资料"
# Word
python scripts/docx_tool.py replace-batch 模板.docx -o 成品.docx -pairs "【姓名】=>张三|【部门】=>市场部"
python scripts/word_advanced.py toc 方案.docx -o 方案-目录.docx
# 模板 / 自检
python templates/gen_templates.py --dir ./out
python scripts/self_test.py
<details>
<summary>📖 完整命令参考(点开看全部参数)</summary>
Word 基础 python scripts/docx_tool.py
create out.docx -title "周报" -body "内容1|内容2" -table "A,B|1,2"
replace in.docx -o out.docx -find "旧" -replace "新"
replace-batch in.docx -o out.docx -pairs "旧1=>新1|旧2=>新2"
totext in.docx -o out.txt
Word 增强 python scripts/word_advanced.py
outline 方案.docx
toc 方案.docx -o 方案-目录.docx -levels 3
header 方案.docx -o 终稿.docx -header "XX公司" -footer "第 X 页 / 共 Y 页"
pagebreak 方案.docx -o 分页版.docx -level 1
md2docx 说明.md -o 说明.docx
Excel 基础 python scripts/xlsx_tool.py
read data.xlsx [-sheet 表名]
stats data.xlsx -col 销售额
report data.xlsx -o 报表.xlsx -cols 销售额,目标 -sum 销售额
merge a.xlsx b.xlsx -o merged.xlsx
Excel 增强 python scripts/xlsx_pro.py
sort 表.xlsx -o 排序.xlsx -col 列名 [-desc]
filter 表.xlsx -o 筛选.xlsx -col 列名 -op eq|ne|gt|ge|lt|le|contains -value 值
formula 表.xlsx -o 活公式.xlsx -col 新列名 -tpl "=ROUND({销售额}/{目标}*100,1)"
chart 表.xlsx -o 图.xlsx -x 分类列 -y 数值列 [-kind auto|bar|line|pie]
health 表.xlsx
protect 表.xlsx -o 修复.xlsx -cols 身份证号,手机号
PDF 基础 python scripts/pdf_tool.py
merge a.pdf b.pdf -o 合集.pdf
split in.pdf -pages 1-3,5 -o 拆分目录
extract in.pdf -o out.txt [-pages 2-4]
toimage in.pdf -o 图片目录 [-dpi 150]
page-num in.pdf -o out.pdf
protect in.pdf -o out.pdf -pwd 密码
decrypt in.pdf -o out.pdf -pwd 密码
info in.pdf
PDF 水印打码 python scripts/pdf_redact.py(需 pymupdf)
scan 合同.pdf
redact 合同.pdf -o 脱敏.pdf --mode black|blur|star
watermark 合同.pdf -o 水印.pdf -text "内部资料" -mode diagonal|tile [-opacity 0.35] [-color gray|red]
batch D:\合同目录 -o D:\输出 -text "样本" -mode tile
模板 python templates/gen_templates.py
--list # 列出全部模板
--dir ./output # 生成全部
--dir ./output --only 工作报告,月度预算 # 只生成指定
旧格式 python scripts/convert_legacy.py
convert_legacy.py 老表格.xls -o 新表格.xlsx
convert_legacy.py auto 老文档.doc
</details>
🧭 任务路由(AI 判断用哪个工具)
| 用户说 | 用哪个 |
|---|---|
| 做 / 改 Word 文档 | docx_tool.py |
| Word 加目录、页眉、页码 | word_advanced.py |
| 把 Markdown 转成 Word | word_advanced.py md2docx |
| 合并 / 统计 / 生成报表 | xlsx_tool.py |
| 排序 / 筛选 / 出图 | xlsx_pro.py |
| 「发出去前帮我查查有没有公式错误」 | xlsx_pro.py health |
| 「身份证号变成科学计数法了」 | xlsx_pro.py protect |
| 合并 / 拆分 / 提取 PDF | pdf_tool.py |
| 「这批合同加水印、把身份证手机号打码」 | pdf_redact.py |
| 「给我一份月度预算模板」 | templates/gen_templates.py |
| 旧版 .xls / .doc | convert_legacy.py |
🔁 三步工作法(每个任务都照这个来)
① 动手前(STOP)—— 三件事没确认就不要开始
1. 依赖就绪:python scripts/setup_check.py check 全 ✅
2. 路径正确:文件真实存在、用完整路径、是新格式(老格式先转)
3. 不覆盖原文件:-o 一定指向新文件
> 结果明显不对劲(数字错乱、格式丢失、中文变方块)→ 先跑 python scripts/self_test.py(85 项断言,20–60 秒),
> 几分钟就能分清是环境问题还是代码问题,别靠猜。
② 动手时:照「常用命令」跑,参数不确定就查上面的完整命令参考。
③ 交付前(CHECKPOINT)—— 跑完不等于做完
1. 输出文件存在、大小非 0
2. 内容抽查:Excel 跑 health;Word 跑 outline;PDF 跑 scan(敏感信息应无命中)
3. 原文件没被动过
🚫 别这么用(都是实测踩过的坑)
| ❌ 别这样 | 为什么 | ✅ 改这样 |
|---|---|---|
把 .doc / .xls 直接喂给主工具 |
主工具只认新格式 | 先 convert_legacy.py 转格式 |
| 用 Python 算好结果写死数字交付 | 用户改一个输入,全表都不动 | 用 formula 写活公式 + 引用单元格 |
不查公式就把 #DIV/0! 留给用户 |
用户以为是你数据错了 | 先 health,修完再给 |
| 身份证 / 手机号按数字存进 Excel | 前导零丢失、15 位截断 | 先 protect 转文本 |
| 排序 / 筛选直接改原文件 | 出错无法回退 | 一律 -o 新文件,原表不动 |
对扫描件 PDF 跑 extract / scan / redact |
扫描件没有文字层 | 先 OCR |
以为 redact 只是盖个黑框 |
它会真删文字层;但图片里的文字打码无效 | 扫描件用专业 PDF 编辑器 |
指望 formula 直接出结果数字 |
openpyxl 只写公式不算值 | 用 Excel/WPS 打开自动重算 |
| 以为会覆盖原文件 | 本套件绝不覆盖 | 输出路径永远是新文件 |
| 用它做专业排版或 AI 改写 | 它不是排版软件,且刻意不联网 | 排版用 Word/WPS;AI 类换联网 Skill |
⚠️ 能力边界(先看这条,避免白折腾)
| 情况 | 支持吗 | 怎么办 |
|---|---|---|
旧版 .doc |
⚠️ 有条件 | convert_legacy.py 转换;需要本机装着 LibreOffice,没装只能提示你手动另存为 .docx |
旧版 .xls |
✅ | convert_legacy.py 转 .xlsx(需要额外装 xlrd:pip install xlrd) |
| 复杂排版(艺术字、复杂图表排版) | ❌ | 只能生成"标题 + 正文 + 简单表格";复杂视觉用 Word/WPS |
| 扫描件 PDF(无文字层) | ✅ 有通路 | 用 ocr_helper.py render 把每页渲染成图片,交给能看图的 AI 读字(无需 tesseract);本机若装了 tesseract 则 read 直接出文本。注意识别质量取决于模型,本套件不含内置 OCR 引擎 |
| Word 页眉页脚 | ✅ 基础 | 支持页眉文字 + 页码域;logo / 双色线 / 表格页眉不支持 |
| Word 自动目录 | ✅ | 插的是 TOC 域,页码在 Word 里 F9 更新;正文要用「标题 N」样式 |
| 文档没有「标题 N」样式(非 Word 生成的 docx 常见) | ⚠️ 提示 | 目录标题会降级为默认样式并明确告知"目录会是空的",不再报错崩溃 |
| 表头行上方有合并的大标题 | ✅ | 自动探测真实表头行(跳过标题/空行),并用 -col 找到列 |
表头是数字(单元格 1.0) |
✅ | 列名两侧归一化,-col 1.0 能对上 |
| 表里有合并单元格 | ✅ | 排序自动跳过合并行并告知行号,不会崩、不会写坏文件 |
| Excel 公式自动计算 | ❌ 不做 | openpyxl 只写公式不算值;Excel/WPS 打开即重算 |
| Excel 图片 / 条件格式 / 透视表 | ❌ 会丢 | openpyxl 重写文件时不保留这些高级对象,重要文件建议备份 |
| 宏(.xlsm / .docm) | ⚠️ 受限 | 不执行也不保留 VBA |
| 需要联网的 AI 能力 | ❌ 刻意不做 | 会把文档送出本机,与定位冲突 |
依赖与外部条件(最容易卡住的地方,写全了)
| 能力 | 先决条件 | 缺了会怎样 |
|---|---|---|
| Excel / Word 全部本地能力 | pip install python-docx openpyxl PyPDF2 |
脚本提示缺哪个包并给出安装命令 |
| PDF 水印 / 打码 / 转图 / 加页码 | 再加 pip install pymupdf |
只影响这几项,其它功能照常 |
扫描件取字(ocr_helper.py) |
只渲染图片的话只需 pymupdf;想本机 OCR 才需要 tesseract + pip install pytesseract |
没装 tesseract 也能用:渲染成图片交给能看图的 AI |
批量体检报告(checkup_report.py) |
只要 python-docx/openpyxl/PyPDF2;要 PDF 版报告另需 pymupdf | 缺 pymupdf 时仍会产出 Markdown 版报告 |
.xls → .xlsx |
pip install xlrd |
明确提示"装 xlrd",不会静默失败 |
.doc → .docx |
本机安装 LibreOffice(soffice 在 PATH) |
提示先另存为 .docx,不假装转换成功 |
| 云端文档体检(0.99 元/次) | 能访问商家服务端 https://la.facailo.xyz |
本地功能全部不受影响 |
> 国内网络提示:服务端域名是海外域名(Cloudflare)。若出现 402 拿不到 / 支付校验被拦,
> 先确认该域名没有被代理软件的 fake-ip 改成保留地址(例如解析成 198.18.x.x 会导致
> 官方收银 CLI 拒绝付款)。建议把它加入代理的直连/fake-ip-filter 白名单后再试。
一句话记住:普通文字、表格、合并拆分,以及排序 / 筛选 / 公式 / 图表 / 打码 / 水印 / 目录 / 模板,本套件都能干;
遇到 .xls 先转、遇到 .doc 先转、遇到扫描件先 OCR、遇到 AI 类需求换工具。
🩺 出问题了
python scripts/self_test.py # 全量 85 项断言,20–60 秒
python scripts/self_test.py --quick # 快速版(只用必需依赖,秒级)
python scripts/self_test.py --keep # 保留临时产物便于人工检查
自检会在临时目录造"脏数据"(身份证写成数字、达成率写成活公式、带敏感信息的 PDF、带合并单元格的报表、缺标题样式的 docx)逐条验证,
并把历史踩过的坑固化成断言,例如:排序后公式引用不得错位、筛选必须保留表头、
体检不得把 ROUND(x,1) 误报成硬编码、打码后文字层不能残留敏感信息、水印中文不能变方块、
含合并单元格的表排序不能崩、失败必须非零退出。
设 ODS_REAL_SAMPLES=<真实文件目录> 还可让它顺带跑一遍真实文件(xlsx/docx/pdf)。
退出码契约(写脚本 / 用 Agent 串流程时按这个判断成败):
| 退出码 | 含义 |
|---|---|
0 |
成功(包含"扫描 0 命中"这种正常结果) |
1 |
失败:参数错、列/文件不存在、非 PDF、密码错、页码越界、部分文件处理失败…… |
2 |
依赖缺失(如没装 xlrd 却要转 .xls) |
130 |
被 Ctrl+C 中断 |
网络失败怎么办:云端体检的 probe/pay/complete 不自动重试——因为重试可能重复下单。
失败时脚本会原样打印官方 CLI 的报错;确认原因后用同一个 --session-id 重跑(同一订单幂等,不会重复扣费),
订单状态不明时先 complete 查单,不要重新下单。
常见报错对照:
| 情况 | 正确处理 |
|---|---|
| 文件路径无效 | 脚本会提示"文件不存在 + 当前目录",用完整路径重试 |
| 依赖未安装 | pip install python-docx openpyxl PyPDF2;水印打码还需 pip install pymupdf |
ImportError: fitz |
本脚本已兼容新旧两种导入;仍报错就 pip install -U pymupdf |
| 水印中文变方块 | 已改用内置 china-s 字体;仍异常可 --font "C:\Windows\Fonts\msyh.ttc" |
| 筛选结果为空 | 确认列名与数值类型(数字列别加引号);若条件列全是公式,会提示先在 Excel 里算一次 |
| 公式写进去没结果 | openpyxl 只写公式不算值,用 Excel/WPS 打开;health 会提示缓存值过期 |
编号列变成 1.101e+17 |
精度已被 Excel 丢失,无法还原 → 回到源数据导入并先跑 protect |
| 文件被占用 | 关掉 WPS / Word / Excel 再运行 |
❓ 常见问题(FAQ)
Q1. 会破坏原文件吗?
不会。所有命令都输出到新文件;原文件只读。涉及重写(排序/筛选/打码)时也保留原文件不动。
Q2. 打码安全吗?对方能还原吗?
PDF 文字层里的原文会被真正删除(不是盖一层黑框),还原不出来;同时会生成打码清单 CSV 说明删了什么。
但图片 / 扫描件里的文字打码无效——那需要先 OCR 定位,本套件做不到。
Q3. 排序会丢格式吗?
会丢一部分。openpyxl 重写文件时不保留图片、条件格式、数据透视表等高级对象(竞品同样如此)。
重要文件请先备份,或只对数据区做排序。
Q4. 公式列为什么排不了序 / 筛不出结果?
Excel 公式在文件里只有"上次计算结果"被缓存,openpyxl 读到的是公式文本。
脚本会自动改用缓存值,并在从没被 Excel 算过时明确告诉你(此时请先用 Excel/WPS 打开保存一次)。
Q5. 我的表有合并单元格 / 标题行占第 1 行,能用吗?
能。1.7.2 起:排序会跳过合并行并告知行号(不会崩),表头会自动跳过合并标题行和空行找到真实表头。
Q6. 表头是数字(比如 1.0)怎么办?
直接 -col 1.0 即可,列名已做两侧归一化(1.0 与单元格里的 1 视为同一列)。
Q7. 扫描件 PDF 能处理吗?
不能取到文字:extract/scan/redact 都会明确提示"无文字层,需先 OCR",不会假装成功。
Q8. .doc / .xls 打不开?
先跑 convert_legacy.py:.xls 需要 pip 装 xlrd;.doc 需要本机装 LibreOffice(没装会明确提示你另存为 .docx)。
Q9. 能批量吗?
能:Word 批量替换(replace-batch)、Excel 多文件合并(merge)、PDF 多文件合并、PDF 整目录批量水印(batch)。
Q10. 断网能用吗?
能。本地功能完全离线;只有云端文档体检(0.99 元/次)需要访问商家服务端。
Q11. 为什么命令返回了 0 却有错误提示?
不会有这种事了。1.7.2 起统一退出码契约(见上面表格):失败一律非零退出,Agent/CI 不会再误判成功。
Q12. 能处理多大的文件?
没有硬限制,但受内存约束:openpyxl 全量加载,几十万行的表会很慢。超大表建议先用 Excel 拆列/筛选,或只处理需要的列。
Q13. 生成的目录是空的?
TOC 域要在 Word/WPS 里"更新域"(F9)才显示页码;另外正文段落必须套用「标题 1/2/3」样式,否则没有可收录的标题(脚本会提示)。
Q14. 支持 WPS 吗?
支持。产物是标准 .docx / .xlsx / .pdf,WPS 与 Office 都能打开;目录/页码域在 WPS 里同样可更新。
Q15. 用本地功能会收费吗?
不会,也不会弹出任何付款提示。排序、筛选、打码、水印、目录、模板、自检这些都在你自己电脑上跑,不经过付款链路。
只有「云端文档体检」那一步是 0.99 元/次。
什么时候才需要付费:要一份能拿出去/可归档的正式结论,或本机装不了 Python 与依赖时,可选云端文档体检(0.99 元/次);只是自己看一眼、改文件 → 本地免费做完即可(见上面「什么时候走云端」表)。
Q16. 付款会自己弹出来吗?
会——由支付宝官方买家组件弹(那个「Agent 支付体验助手」窗口:金额 / 订单号 / 点此授权 / 二维码)。
官方对 Pay Skill 的设计就是"在 AI 智能体内直接完成支付、无需跳出界面";我们的脚本只负责调起官方组件(pay 跑 alipay-bot),不自己造收银台。
同时脚本会把同一份收银信息(金额、订单号、可点链接、二维码图片)贴到对话里,兜底那些弹不出官方窗口的宿主。
两种入口任选一种付款即可;没授权就不会扣钱。
Q17. 扫描件(图片 PDF)能读吗?
能,走 ocr_helper.py:把每页渲染成 PNG,交给能看图的 AI 读出文字(不用装 tesseract,这也是竞品的做法)。
本机如果装了 tesseract,ocr_helper.py read 会直接出文本。
命令:python scripts/ocr_helper.py render 扫描件.pdf -o 页面图/ → 把图交给模型读 → 文字贴回来继续处理。
Q19. 云端体检的「凭证」是什么?能干嘛?
付款并执行 complete 后,会自动在 体检凭证/ 目录生成三个文件:云端体检凭证-<订单号>.json、.md、.pdf。
凭证里含订单号、时间、金额、结论与问题清单,以及服务端返回原文的 SHA-256 指纹——订单号可在支付宝账单核对金额与时间,
指纹可校验原文有没有被改动(原文同时存在 JSON 的 serverResponseRaw 字段里)。适合归档、交接、对外说明。
想先看样式:node scripts/office-doc-suite-paid.mjs cert --demo(不付款也能生成一份示例凭证)。
Q18. 一批文件要挨个体检,有没有省事的办法?
有:python scripts/checkup_report.py 资料/ -o 体检报告.md --pdf——
一次扫完整个目录(Excel 查公式错误/编号精度、Word 查标题层级、PDF 查敏感信息),
出一份能直接发给同事或客户的报告(Markdown + PDF),还可以 --json 给程序用。
✅ 质量保证(已实测)
Windows + Python 3.13 + 真实 Office 文件,实测记录:
| 能力 | 验证方式 | 结果 |
|---|---|---|
| 活公式 | 读回工作簿断言单元格 | =ROUND(B2/C2*100,1) 逐行递增 ✅ |
| 排序 | 首行应为最大值 + 公式引用不错位 | 降序正确,公式随行重定位 ✅ |
| 筛选 | 表头 + 命中行数 | 表头保留,命中 3 / 剔除 1 ✅ |
| 图表 | 读回 _charts |
图表对象已嵌入 ✅ |
| 类型保护 | 读回 number_format 与类型 |
身份证列为 @ 文本 ✅ |
| Word 目录 | 解析 docx XML | 含 TOC \o 域 ✅ |
| 页眉页脚 | 解析页眉 / 页脚 XML | 页眉文字 + PAGE/NUMPAGES 域 ✅ |
| Markdown→Word | 读回标题 / 表格 / 列表 | 层级、表格、列表齐全 ✅ |
| PDF 打码 | 读回文字层断言原文消失 | 四类信息均删除,正文不受影响 ✅ |
| 水印 | 渲染 + 文字抽取 | 中文正常显示、可抽取 ✅ |
| 模板 | 4 个文件生成并打开 | 全部生成 ✅ |
| 真实文件回归 | pandas / python-docx / pdf.js 官方语料 16 个真实文档(含 4 个合并区报表、数字表头表、缺标题样式 docx、6MB 扫描图纸) | 91 项场景 87 通过 → 修复后全通过 ✅ |
| 全量自检 | self_test.py |
85/85 通过(43 功能 + 9 回归 + 1 真实文件 + 11 零依赖/错误码 + 6 扫描件/报告 + 6 前置块校验 + 5 健壮性 + 4 第三批真实文件)✅ |
- 回归用例:
test-prompts.json(含旧格式转换、扫描件边界、合并单元格、数字表头、缺标题样式等真实形态)。 - 1.7.2 修复的 8 类缺陷(均由真实文件或对抗测试复现):合并单元格排序崩溃、缺 Heading 样式崩溃、
数字表头匹配失败、失败却返回 0、非 PDF 抛英文堆栈、表头行探测、支付脚本吞掉收银台输出、默认编码乱码。 - 工作流:执行前 STOP(依赖 / 路径 / 不覆盖)+ 交付前 CHECKPOINT(存在 / 抽查 / 原文件未动)。
🧩 电脑装不了 Python 库?用「零依赖模式」
公司电脑不让装包、机器离线、Python 太老——以前这些情况就用不了。现在有条兜底路子:
no_dep.py 只用 Python 自带的东西,一个库都不用装也能干活。
python scripts/no_dep.py check # 先看看哪些能用、哪些不能用
python scripts/no_dep.py docx-text 报告.docx # 把 Word 里的文字提取出来
python scripts/no_dep.py docx-replace 模板.docx -find "【姓名】" -replace "张三" -o 新.docx
python scripts/no_dep.py xlsx-sheets 台账.xlsx # 这个 Excel 里有哪几张表
python scripts/no_dep.py xlsx-csv 台账.xlsx -o 台账.csv # 导成 CSV(Excel 打开不乱码)
python scripts/no_dep.py xlsx-merge 华东.xlsx 华南.xlsx -o 汇总.csv
python scripts/no_dep.py pdf-info 合同.pdf # 一共几页、有没有加密
python scripts/no_dep.py pdf-text 合同.pdf # 尽量把文字抠出来
一句话记住:能读、能导出、能替换文字;但改不了格式,也写不回 Excel。
| 零依赖能做 | 零依赖做不了(这些要装库) |
|---|---|
| 读 Word 文字、替换模板里的占位符 | 做目录、页眉页脚;占位符被 Word 拆成几段时替换不了 |
| 读 Excel 内容、导成 CSV、几张表拼一张 | 排序、筛选、写公式、画图、改回 Excel |
| 看 PDF 几页、有没有加密、简单 PDF 抠字 | PDF 打码、加水印、合并拆分、转图片 |
> 中文不会乱码:导出的 CSV 带 BOM,Excel/WPS 直接打开就是正常中文。
🆘 报错了看这里(错误码对照表)
出问题时,提示里会带一个编号,长这样:
❌ 错误 [ODS-E03] 找不到列 '销售'
处理: 可用列: ['姓名', '金额', '日期']
想知道这个编号什么意思,直接问它:python scripts/error_codes.py ODS-E03(--codes 列出全部编号)。
编号只增不改,所以以前见过的报错永远查得到。
| 错误 ID | 类别 | 含义 | 处理办法 |
|---|---|---|---|
ODS-E01 |
文件 | 找不到这个文件 | 路径可能写错了,或者文件被挪走、改了名字。Windows 路径里有空格,记得用双引号包起来 |
ODS-E02 |
文件 | 这个文件打不开 | 先看后缀和真实格式是不是一样;关掉正在打开它的 Excel / WPS / Word 再试;老格式 .xls / .doc 先用 convert_legacy.py 转成新格式 |
ODS-E03 |
参数 | 表里没有这一列 | 照着提示里「可用列」的名字原样写;表头是数字就直接写 1.0;第一行是大标题的表,程序会自动找到真正的表头 |
ODS-E04 |
参数 | 没有这张工作表 | 照提示里给出的工作表名字写;不写就用当前打开的那一张 |
ODS-E05 |
这不是 PDF,或者 PDF 坏了 | 本工具只认 .pdf。是图片或文字文件的话,先用办公软件导出成 PDF;PDF 打不开也可能是加了密,先用 pdf_tool.py decrypt 解密 | |
ODS-E06 |
这份 PDF 没有文字层(多半是扫描件) | 扫描件里的字其实是图片,程序读不出来,也不会替你猜。要么先做 OCR,要么把页面转成图片交给能看图的 AI | |
ODS-E07 |
PDF 加密了,或密码不对 | 输对密码再试。密码忘了没法破解,只能找给你文件的人要 | |
ODS-E08 |
参数 | 页码或页数范围写错了 | 按提示里的「文档共 N 页」改,比如 1-3,5 |
ODS-E09 |
依赖 | 电脑上缺东西(少装了库) | 照着提示装:pip install 后面那个包名。.doc 转 .docx 需要电脑上装了 LibreOffice |
ODS-E10 |
环境 | 文件存不进去 | 换个有写入权限的目录;也检查一下路径里有没有非法字符 |
ODS-E11 |
数据 | 这一列全是公式,而且还没算过 | 用 Excel 或 WPS 打开文件、保存一次,让公式算出结果,再回来排序 / 筛选 / 统计 |
ODS-E12 |
数据 | 有合并单元格,搬不动 | 程序已经自动跳过这些行,并告诉你行号;一定要连它们一起处理,先在 Excel 里取消合并 |
ODS-E13 |
数据 | 按这个条件一条都没筛出来 | 把条件放宽一点;条件列要是公式,先去 Excel 里算一次;再确认数字列里没混进文字 |
ODS-E14 |
数据 | 文档没设「标题」样式,目录会是空的 | 在 Word / WPS 里给章节套上「标题 1 / 2 / 3」样式,再重新生成;目录页码按 F9 更新 |
ODS-E15 |
付费 | 还没付款,或者账单没了 / 过期了 | 先跑 probe 拿一张新账单,再跑 pay;不要跳过 probe;账单过期了重新 probe 就行 |
ODS-E16 |
付费 | 连不上商家服务器 | 检查网络。如果用了代理、而且域名被解析成 198.18 开头的奇怪地址,就把这个域名加进代理的直连名单(fake-ip-filter) |
ODS-E17 |
参数 | 这种文件类型或参数值不支持 | 照提示换成支持的类型;老格式先用 convert_legacy.py 转;命令参数用 --help 看有哪些可选 |
核心原则
- 本地运行:数据不上传(隐私是底线)
- 保真处理:不破坏原文件,必要时先备份
- 可重复:每次操作都有明确输出,你知道改了什么
- 中文优先:中文提示、中文报错修复建议、老文件自动转换
合规声明
- 仅处理用户提供的文档,不采集 / 上传任何数据(云端复核除外,且仅发送你主动提交的片段)
- 打码能力用于去除文档中的身份证 / 手机号 / 银行卡 / 邮箱等个人信息
- 涉及版权内容(他人 PDF / 文档)仅限个人合法使用