



AI 帮你改 Word,为什么总是一改就「不像人写的」?一份保住 99% 版式的 SOP
适合:经常用AI 生成/改写 Word、却被字体行距页眉页脚折磨的朋友。 工具:python-docx(或同类能操作 OOXML 的方案)。不涉及具体商业项目,示例已脱敏。
————————————————————
一、根因:Word 不是「一串字」,而是一棵树
很多人把.docx 当成「带格式的 txt」,但 Word 内部是 OOXML:段落(w:p)下面挂着多个运行(w:r),每个 run 都有自己的 rPr(run 属性)——东亚字体、西文字体、字号、加粗、颜色、语言标记……
一句话:同一段里,「前半句宋体、后半句加粗」在文件里往往是多个run,不是一段纯文本。
所以,当你用错误的方式「整段覆盖」时,常见后果是:
• 整段赋值 paragraph.text = "……":实现上往往会 干掉原有 run 结构,只留一个默认 run → 东亚字体、局部加粗、混排规则容易丢。
• Document() 从零新建再 add_paragraph:新段落走 Word 默认样式 → 全篇 Calibri、行距段前后与母版不一致。
• pandoc + reference-doc:结构会按 Pandoc 自己的映射重排,不等于在你那份「已经调好的 Word」里改字;中文场景下缩进、列表、样式名经常对不齐。
这不是AI「不努力」,是工具链在破坏结构。
————————————————————
二、心法(只要记住这一句)
先复制你的「格式母版」.docx,再在副本上改「run 里的字」。
绝不从空文档开写当主交付(除非你就是想要一份全新默认样式)。
「格式母版」可以是你司公文模板、会议纪要定稿、合同排版样例——任何一份你已经用 Word 调顺眼的文件都行。AI 的工作是:在不动版式骨架的前提下换字。
————————————————————
三、可执行SOP(按优先级)
1)起手式:复制原档
import shutilfrom docx import Documentshutil.copy("格式母版.docx", "输出-副本.docx")doc = Document("输出-副本.docx")
2)替换:优先在「单个 run」里 replace
大部分时候,关键词在同一个run 里,直接:
for run in paragraph.runs:if old in run.text:run.text = run.text.replace(old, new)
3)进阶:跨 run 替换(防「一个字被劈成两半」)
有时Word 会把「某市」这类地名拆成两个 run(例如前二字与「市」字各成一个 run),这时要做「合并区间 → 写回第一个 run → 清空其余 run」,否则替换不到或只改一半。
(完整replace_cross_runs 模板见文末「延伸阅读」所指的附录文档;公开发表版不放内网路径。)
4)整段重写:保留「第一个 run」的格式 DNA
当你必须整段换掉时,不要paragraph.text = ...。正确姿势是:
def rewrite_paragraph(paragraph, new_text):if paragraph.runs:paragraph.runs[0].text = new_textfor run in paragraph.runs[1:]:run.text = ""
含义是:段落级版式+ 第一个 run 的 rPr 还在,你把字写进 runs[0],其余 run 清空,避免残留碎片。
5)插入新段:不要迷信 add_paragraph()
add_paragraph 很容易变成「默认 Normal」,和母版正文长得不像一家人。更稳的是:deepcopy 母版里某一段的 XML,清掉旧 w:r,再 deepcopy 模板 run 填新字;多条插入时注意 addprevious 顺序反转问题,改用 addnext 锚点推进。
6)表格别忘
正文段落遍历完,还要遍历doc.tables 里每个 cell 的 paragraphs / runs,否则会出现「表格外完美、表格里还是旧文案」。
7)交付前自检
• 全文检索旧关键词是否残留。
• 抽查前几段 runs[0] 的字体/字号是否仍与母版一致。
• 有页眉页脚、分节、样式名的文档,避免在代码里硬写母版不存在的样式名(会 KeyError)。
————————————————————
四、陷阱速查表(建议保存)
Document() | shutil.copy | |
paragraph.text = | rPr 丢失 | runs[0].text |
doc.paragraphs | doc.tables | |
addprevious | reversed()addnext 推进锚点 | |
pandoc |
————————————————————
五、对比示例(脱敏主题,可直接打开Word 看差别)
我用同一份已排版的Word 作为母版,把正文全部换成城市慢行/街区改造的公开向短文(不涉及任何真实项目或特定行业背景),然后做两次改写:
1. 按 SOP:runs[0] 写入新正文,其余 run 清空 → 版式跟母版走。 2. 典型踩坑:对同结构段落使用 paragraph.text = 整段赋值 → run 级格式容易被 Word/python-docx 重建,常见表现是:字体统一成默认、局部加粗丢失、混排「发飘」。
若你随文提供示例,可采用如下命名(便于读者对照下载):
• word格式对比-按SOP改写(保run).docx
• word格式对比-整段paragraph.text踩坑.docx
建议读者本地并排打开:不用相信文中的描述,直接看版式差异——往往一眼可见。亦可用任意已排版的母版自行复现对照实验。
————————————————————
六、和「写作提示词」分工边界
这套SOP解决的是 「版式结构不被破坏」;去 AI 味、语气、事实准确性仍然要靠你自己的写作规范与复核流程。两者别混谈:
• 版式:交给「母版 + run 级改写」
• 内容:交给「事实核对 + 你的文体约束」
————————————————————
结语
AI 写 Word 让人抓狂,多半不是「模型不行」,而是我们用了会拆结构的写法。把 docx 当结构化文档而不是当 txt,用 复制母版 + run 级手术这条路径,你会少返工很多遍。————————————————————
最后,我手动补充一下,如果你想在修订模式下显示 AI 修改了哪些内容,和原文档对比有什么细颗粒度区别(修订痕迹),你可以直接使用 word 自带的比较功能——在审阅-比较-比较文档,直接对比你的原文档和 AI 修改后的文档,即可一键生成出完整的带有修订痕迹版本的 word。

目前“显示修订痕迹”这一步还没有什么 AI 替代的方法,还是需要人为手动操作一下的。


夜雨聆风