WPS COM 自动化排障

SKILL开发
开发 未标注权限 许可证不明确
安装这个技能

用 Python + pywin32 通过 COM 驱动 WPS Office(文字/表格/演示)的实战排障手册:覆盖「无效的类字符串」「WPS.Application 未注册」、Workbooks.Add 返回 None、SaveAs 后 Quit 卡死等高频坑,附可复用的启动与收尾模板。

一句话选型结论

按资料字段整理

WPS COM 自动化排障是开发类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类开发 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_a8ae7749/wps-com-automation
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

开发
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_a8ae7749仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791693695
正文体量7.7 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
写代码与改 bug

按需求补代码、定位并修掉报错。

读仓库与生成改动

让模型读懂项目结构,再给出可落地的改动。

跑测试与排查故障

按现象排查问题,补测试用例并复跑。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在开发场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
WPS COM 自动化排障当前 未标注权限 未标注 未标注 未标注 有
技能审查员 浏览器控制 ClawHub 市场 877.9 万 OpenClaw 有
Vercel React 最佳实践 浏览器控制 GitHub 仓库 849.1 万 Codex、Claude、Cursor 有
GitHub 代码协作 联网访问 ClawHub 市场 763.3 万 OpenClaw 有
网页设计指南 联网访问 GitHub 仓库 668.6 万 Codex、Claude、Cursor 有
本体论 只读 ClawHub 市场 663.7 万 OpenClaw 有

SKILL.md 全文

7.7 KB
模型实际读到的说明书原文,来自技能仓库

WPS COM 自动化对接手册

用 COM 自动化驱动 WPS Office 时,有四个反复踩到的坑。本手册给出判定方法与修法。


坑 1:现代 WPS 不注册 WPS.Application

症状:win32com.client.Dispatch("WPS.Application") 报
(-2147221005, '无效的类字符串') 或 (-2147221008, '尚未调用 CoInitialize。')。

事实:WPS Office 12.x 的三件套是三个彼此独立的 COM 类,没有任何单一 ProgID 同时提供 Documents + Workbooks + Presentations:

ProgID Documents Workbooks Presentations 对应程序
Kwps.Application ✅ ❌ ❌ wps.exe(文字)
Ket.Application ❌ ✅ ❌ et.exe(表格)
Kwpp.Application ❌ ❌ ✅ wpp.exe(演示)

核验命令(先跑这个,别猜):

import win32com.client as w
for pid in ["WPS.Application","Kwps.Application","Ket.Application","Kwpp.Application"]:
    try:
        app = w.Dispatch(pid)
        print(pid, "OK", app.Path, app.Name, getattr(app,"Build","?"))
        app.Quit()
    except Exception as e:
        print(pid, "FAIL", str(e)[:80])

坑 2:WPS 抢占 MS Office 的 ProgID,导致误判

症状:脚本报告"检测到 Microsoft Office",实际装的是 WPS;或 Word.Application 能用但 Name 返回 Microsoft Word、Version 返回 12.0。

原因:WPS 的"兼容第三方系统和软件"会把 Word/Excel/PowerPoint.Application 全部接管指向自己。

判据:不能只看 Dispatch 是否成功,必须核对可执行文件路径:

def app_is_wps(app) -> bool:
    try:
        p = str(app.Path).lower()
    except Exception:
        return False
    return ("kingsoft" in p) or ("wps" in p)

WPS 的真实路径形如
C:\Users\<用户>\AppData\Local\Kingsoft\WPS Office\<版本>\office6。
据此判定才能把 MS Office 与 WPS 兼容层区分开。


坑 3:默认保存到桌面 → 工作簿未保存 → Quit() 永久阻塞

症状:wb.SaveAs(<桌面路径>) 看似返回,桌面却查不到文件;随后 app.Quit() 卡住,
把整个命令拖到 120 秒超时甚至永不返回。

原因:桌面若被重定向(junction / 符号链接,例如
C:\Users\X\Desktop → E:\Users_X\Desktop),WPS SaveAs 静默失败,
工作簿保持"已修改未保存",退出时弹出保存确认框;而应用是 Visible=False,
对话框没人能点 → 无限等待。

先检查桌面是不是链接:

ls -la ~/Desktop          # 出现 "->" 即为 junction

修法(两条都要):

  1. 永远显式传输出路径,不要依赖"默认桌面"。
  2. 给 Quit 加限时,防止任何模态框挂死调用方:
import threading
def bounded_quit(app, timeout=8.0) -> bool:
    """限时退出,超时则放弃(残留进程事后清理),保证调用方不被挂死。"""
    done = threading.Event()
    def _run():
        try:
            import pythoncom; pythoncom.CoInitialize()
        except Exception:
            pythoncom = None
        try:
            app.Quit()
        except Exception:
            pass
        finally:
            if pythoncom:
                try: pythoncom.CoUninitialize()
                except Exception: pass
            done.set()
    t = threading.Thread(target=_run, daemon=True)
    t.start()
    return done.wait(timeout)

> 注意:不要在 Quit 前关闭文档、也不要设 DisplayAlerts=False 去"自动答框"——
> 若 COM 附着到的是用户正在使用的 WPS 实例,那会静默丢弃用户的未保存修改。


坑 4:残留进程让 COM 附着到坏实例

症状:app.Workbooks.Count 恒为 1、Workbooks.Add() 返回 None、ActiveWorkbook.Name
报 <unknown>.Name;或前一次超时后,后续调用全部异常。

原因:上一次操作被超时杀掉,留下一个持有孤儿文档的 et.exe/wpp.exe;
再次 Dispatch 会附着到这个坏实例,而不是新建。

处理:结束残留进程后重试(只杀自动化残留,不要动用户正在用的窗口):

# 列出
tasklist | grep -Ei "et\.exe|wpp\.exe|wps\.exe"
# 按 PID 精确结束(先确认该 PID 不是用户自己开的)
taskkill /PID <pid> /F

判断依据:在开始自动化之前先记一次进程清单,之后新出现的才是你制造的。


定位卡死位置:faulthandler

不要靠猜。用 faulthandler 直接把堆栈打出来:

import faulthandler, runpy
faulthandler.dump_traceback_later(25, exit=True)   # 25 秒后打印堆栈并退出
runpy.run_path(r"...\target_script.py", run_name="__main__")

典型输出会直接指到 release_wps → Quit → <COMObject Ket.Application>.Quit,一步锁定问题。


通用改造模式:套件代理(一处改动,几十处调用点不动)

当既有代码用一个 get_wps() 对象同时访问 Documents / Workbooks / Presentations 时,
不要去改那几十处调用点,改为按属性名路由的代理:

_ROUTE = {"Documents": "word", "Workbooks": "excel", "Sheets": "excel",
          "Presentations": "ppt"}

class WpsSuiteProxy:
    def __init__(self):
        object.__setattr__(self, "_apps", {})
    def _app(self, suite):
        apps = object.__getattribute__(self, "_apps")
        if suite not in apps:
            apps[suite] = _dispatch_suite(suite)   # 按 suite 选 ProgID
        return apps[suite]
    def __getattr__(self, name):
        if name.startswith("_"):
            raise AttributeError(name)
        return getattr(self._app(_ROUTE.get(name, "word")), name)
    def __setattr__(self, name, value):
        if name.startswith("_"):
            object.__setattr__(self, name, value); return
        try: setattr(self._app("word"), name, value)
        except Exception: object.__setattr__(self, name, value)
    def Quit(self):
        for a in list(object.__getattribute__(self, "_apps").values()):
            bounded_quit(a)
        object.__getattribute__(self, "_apps").clear()

_dispatch_suite(suite) 内部按候选 ProgID 依次尝试,并用 app_is_wps() 过滤掉
MS Office 同名对象;Visible=False 用 try/except 包住(PowerPoint 类组件可能拒绝)。


环境准备清单

python -m venv <venv>
<venv>/Scripts/python.exe -m pip install pywin32 openpyxl python-pptx pandas Pillow PyYAML
  • pywin32 是必需项,缺了报 ModuleNotFoundError: win32com.client。
  • 从非主线程调 COM(如上面 bounded_quit)必须先 pythoncom.CoInitialize(),
    否则报 -2147221008 尚未调用 CoInitialize。

验收清单(改完必须逐项实测,不要只看代码)

  1. engine 判定是否已变成 WPS,且 msword/msexcel/msppt 为 false。
  2. Word:创建 → 编辑 → 导出 PDF,各返回 "engine": "WPS"。
  3. Excel:创建多工作表,用 openpyxl 打开核对 sheetnames。
  4. PPT:创建 → 加页(此功能常被 if engine != "WPS" 门禁屏蔽,能通过才说明真的走 WPS)。
  5. 跑一次技能自带自检,确认 overall: pass。
  6. 确认没有新增残留 et.exe/wpp.exe。

常见问题

5 问
答案由本站依据条目字段整理
WPS COM 自动化排障怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_a8ae7749/wps-com-automation。安装方式为未标注。装完刷新技能列表或重开客户端。

WPS COM 自动化排障支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

WPS COM 自动化排障权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

WPS COM 自动化排障收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

WPS COM 自动化排障用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。