zilong-wps — WPS Office COM 自动化引擎
通过 COM 接口程序化操控本机 WPS Office(文字 Writer / 表格 ET / 演示 Presentation),核心能力是 JSON 数据驱动 PPT 一键生成:搜数据 → 出图表 → 写 JSON → 产出 PPTX+PDF 双格式。
环境与 Python 解释器
使用装有 pywin32 的 Python 3.10+(Windows)。先检测、缺失再安装:
python -c "import win32com.client" 2>/dev/null || pip install pywin32
下文命令中的 python 一律指该解释器。若环境里存在多个 Python,优先选已装 pywin32 的那个。
首次使用或报错时,先跑自检脚本确认链路:
python <skill_dir>/scripts/env_check.py
自检项:Windows 系统 / WPS 安装路径 / pywin32 / 三大 COM ProgID(KWPS=文字, KET=表格, KWPP=演示)注册状态。
三条使用路径
| 路径 | 适用场景 | 做法 |
|---|---|---|
| A. JSON→PPT 构建器(首选) | 批量生成结构化 PPT(汇报/招生/课件/榜单) | 编写 data.json → 运行 build_ppt_from_json.py |
| B. COM 助手模块 | 自定义 COM 脚本 | import wps_com(连接/配色/退出/杀进程助手) |
| C. 裸 COM | 构建器覆盖不了的特殊操作 | 直接 win32com.client.Dispatch,参考 COM 速查 |
路径 A:JSON→PPT 构建器(核心工作流)
完整 6 步流水线:
1. 提取模板背景(可选): 模版.pptx 里的背景图存为 PNG (960x540)
2. WebSearch 搜数据: 分数线/排名/计划/科研数据等
3. matplotlib 生成图表 PNG (注意中文字体 plt.rcParams['font.sans-serif']=['SimHei'])
4. 编写 data.json: 每页 elements[] 编排
5. 运行构建器:
python build_ppt_from_json.py data.json -o output.pptx [--pdf]
6. 校验: 打开 PPTX 逐页检查溢出/间距/字号
JSON 完整字段规范与 7 种元素类型的排版细节见 references/ppt_json_spec.md;COM 常量/格式码/踩坑见 references/com_cheatsheet.md。
路径 B:COM 助手模块
自定义脚本放在任意目录,把技能的 scripts/ 目录加入 sys.path 后 import wps_com:
import sys; sys.path.insert(0, r"C:\Users\shizi\.workbuddy\skills\zilong-wps\scripts")
from wps_com import connect_wpp, rgb, kill_wps, safe_quit
app = connect_wpp() # 连接 WPS 演示(自动回退 PowerPoint.Application)
pres = app.Presentations.Add()
# ... 自定义逻辑 ...
safe_quit(app, pres) # 保存退出,不留僵尸进程
路径 C:裸 COM
import win32com.client
app = win32com.client.Dispatch("KWPP.Application") # WPS 演示
JSON→PPT 元素类型路由
| type | 用途 | 关键参数 |
|---|---|---|
text |
文本框 | text/font/size/color/align/bold |
image |
图片(含matplotlib图表) | path/x/y/w/h(缺w或h则按比例) |
table |
表格 | data 二维数组 / header 加深色白字 |
cards_2x3 |
2行x3列彩色卡片 | items[{title,desc,color}] |
cards_1x4_info |
4列数字统计卡 | items[{num,label,color}] |
card_list_wide |
目录编号列表 | items[{num,title,desc,color}] |
tagline_bar |
页面底部总结条 | text/color |
关键约束 ⚠️(违反必翻车)
- 标题与内容间距:标题 y=14 h=40(结束于 y≈54),第一个内容元素必须起始于 y≥76-78(≥24pt gap)
- 页面标题最多 4 字,居中,SimHei 40-44pt,品牌色,无装饰线
- JSON 中文引号:文本内引用用「」代替
"",避免 JSON 转义地狱 - 所有元素不出画布:960x540,任何元素 y+h ≤ 518
- 构建前清理:COM 连接失败/卡死时先杀进程
taskkill //F //IM wps.exe //T,或调wps_com.kill_wps() - 导出 PDF:
pres.SaveAs(path, 32);保存 PPTX 用pres.SaveAs(path, 24) - OLE 颜色:COM 的 RGB 是
r + g*256 + b*65536(BGR 打包),直接用wps_com.rgb("#1A3C8B")
设计预设(品牌色)
| 预设 | 主色 | 适用场景 |
|---|---|---|
| academic | 深蓝 #1A3C8B | 学术答辩/基金申请/招生简章 |
| consultant | 深蓝 #003366 + 亮青 #00B0B9 | 咨询报告 |
| business | 商务蓝 #005294 | 会议汇报/课件 |
| tech | 近黑 #0F1423 | 科技/AI/数据报告 |
标准页序(12-15 页汇报型 PPT)
S1 封面 → S2 目录(card_list_wide) → S3-S10 内容页(图+表+卡片) → S11 总结卡片 → S12 致谢
质量审查(交付前 5 维度自检)
| 维度 | 检查项 | 阈值 |
|---|---|---|
| visual | 字体层级/对比度/留白/溢出 | 70分 |
| pedagogy | 叙事弧/预备知识铺垫 | 75分 |
| proofreading | 拼写/术语/数值单位 | 80分 |
| parity | PPTX 与 PDF 内容一致性 | 85分 |
| substance | 数据准确性/来源引用 | 90分 |
排障
| 症状 | 处置 |
|---|---|
| Dispatch 报 "类未注册" | 跑 env_check.py;仍失败则 WPS 需重装或修复安装 |
| COM 卡死/无响应 | taskkill //F //IM wps.exe //T 后重试 |
| 中文字体变方块 | matplotlib 图表加 plt.rcParams['font.sans-serif']=['SimHei'];PPT 内指定中文字体名 |
| 图形全黑 | 忘了 OLE 颜色打包,用 wps_com.rgb() |
| PDF 导出为空 | 确认 SaveAs 第二参数是 32 且路径为绝对路径 |