WPS/Word 纯 COM 直连编辑
为什么是纯 COM(不是 MCP)
MCP(word-mcp-live)底层也是 Word COM,但它额外套了一层 SSE 服务器。
那层服务器会通道堵塞、崩溃、断连——断一次 AI 就连不上正打开的 WPS,活就卡死。
结论:实时改标书,一律走 win32com 直连,不启 MCP、不启 SSE 服务器。
去掉中间商 = 去掉不稳定来源。实测填几十个格、批量加批注都不抖。
前置条件
- 已打开 WPS 或 Word,且目标文档是活动文档(光标在里面)。
- 跑脚本的 Python 必须装了
pywin32(用户机器上的系统 Python312 已装):
C:/Users/ZhuanZ/AppData/Local/Programs/Python/Python312/python.exe
(路径因人而异,认准装了 pywin32 的那个。) - 连接函数已统一:
com_insert._get_word_app()依次尝试KWPS.Application/Word.Application。
工具集(scripts/ 与本 SKILL.md 同级)
| 脚本 | 能力 | 关键函数 |
|---|---|---|
com_read_para.py |
读段落、按页读、空格段分析 | read_para(i) / analyze_spaces(i) / read_page(n) / get_page_count() |
com_insert.py |
段落内插字、锚点后插字、读段 | insert_text_at_pos / insert_text_after_anchor |
com_fill_blanks.py |
下划线填空题(插字法,保空格) | fill_paragraph(doc,i,data) |
get_table.py |
光标定位表格、插文档块 | get_current_table() / insert_block() |
com_table.py |
表格读/写(替掉 MCP 最不稳的表格功能) | get_table_info / set_cell / fill_rows / read_cell |
com_comment.py |
实时加批注(替掉 MCP 批注) | add_comment_by_text / add_comment_by_para |
com_revision.py |
修订模式开关、接受/拒绝修订 | set_track_changes / accept_all / reject_all / list_revisions |
调用方式
从 Python(AI 跑脚本时):
import sys, os
sys.path.insert(0, r'<本技能 scripts 目录绝对路径>')
from com_table import get_current_table, fill_rows
from com_revision import set_track_changes, accept_all
ti = get_current_table() # 用户光标点进表 → 表序号
fill_rows(ti, [(3, ['张三','高级工程师',...])]) # 批量写格(坐标寻址,无需从后往前)
命令行(用户手动或 AI 触发):
PY="C:/Users/ZhuanZ/AppData/Local/Programs/Python/Python312/python.exe"
# 表格
$PY scripts/com_table.py info <表序号>
$PY scripts/com_table.py set <表序号> <行> <列> <文本>
# 批注
$PY scripts/com_comment.py text "搜索词" "批注内容"
$PY scripts/com_comment.py para <段落号> "批注内容"
# 修订
$PY scripts/com_revision.py on|off|status|list|accept-all|reject-all
$PY scripts/com_revision.py accept <序号>|reject <序号>
# 读段落
$PY scripts/com_read_para.py <段落号> [--simple]
# 按页读取
$PY scripts/com_read_para.py pages # 总页数
$PY scripts/com_read_para.py page <页码> # 读整页文本
安全检查点(动文档前必确认)
本技能直接改写你正打开的 WPS/Word 文档,写/改类操作不可逆。AI 在执行以下动作前,必须先向用户确认目标与作用范围,拿到明确同意再动手:
- 写格 / 批量填表(
set_cell/fill_rows):确认表序号、目标行列、是否会覆盖已有内容。 - 插字 / 填空(
insert/fill_paragraph):确认插入位置与文本,避免带崩原格式。 - 加批注 / 开修订:确认作用范围(整篇还是指定段落或词句)。
accept_all/reject_all:会清空或保留全部修订,必须先让用户看list_revisions()结果并确认。
非破坏性操作(读段落、读表结构、读页、空格段分析)无需确认,可直接执行。
标准工作流(拿填表举例)
- 定位:让用户光标点进目标表,调
get_current_table()拿序号ti。 - 探查:
get_table_info(ti)读结构,确认行列与现有内容。 - 写入:
set_cell稀疏填 /fill_rows批量写。坐标寻址,不会因插入引起位置偏移。 - 核对:再
get_table_info(ti)读回确认。
修订(track changes)工作流
适用:让客户看「改了哪」。
1. set_track_changes(True) 开修订。
2. 之后所有编辑(含 com_table 写格、com_insert 插字)都会自动记为修订。
3. list_revisions() 看清单。
4. 确认无误 → accept_all() 清修订;要回退 → reject_all()。
⚠️ 注意:开着修订做大面积程序化填表,会留下一堆修订记录。填完如果不想留给客户看,记得 accept_all()。 想清爽填表就不开修订。
注意事项
- 连不上 / 报「无效的类字符串」:说明 WPS/Word 没开或 COM 不可用。先打开 WPS 并让目标文档成为活动窗口,再重试;不要反复强行重连。若报
pywin32/win32com缺失,改用装了 pywin32 的那个 Python(见前置条件路径),别在没装的环境硬跑。 - 表格用坐标写,不是找词替换:
set_cell/fill_rows按(行,列)地址直接Cell(r,c).Range.Text = text,空单元格也能写。绝不用replace_text+\t(Word 把\t解释成跳格还是插制表符看运气,不可靠)。 - 段落才用"插入不替换"(InsertBefore/After,禁用
range.Text = xxx整体覆盖);单元格恰恰用坐标覆盖,两者不矛盾。 insert_block的相对路径默认指向标书项目的.workbuddy;其他项目请传绝对路径。- 合并单元格读表会触发异常,已
try/except留空,不会中断整表读取。 - 不要在 TrackRevisions 开着时大面积程序化填表又想清爽——填完用
accept_all清修订。 - 所有函数依赖
ActiveDocument,务必先让目标文档成为活动窗口。 - 标书项目另有工作副本:
E:\王帅工作\0、标书\.workbuddy\scripts\,与本技能脚本内容一致,本项目优先用项目副本;其他项目直接用本技能脚本即可。