添加老明微信

老明微信二维码

如何优雅的让 AI 编辑 word 文档


原文首发微信公众号
相信不少朋友都有过类似的困扰:让 AI 帮忙编辑生成一份 word 文档,内容没啥大问题,但总是出现各种各样的格式问题:这里没对齐、那里字体乱码、字体段落格式不对、AI 痕迹太明显……总之就是和人类手工码字的 word 文档不一样,让人非常抓狂,总是出现莫名其妙的字体与排版,歪歪扭扭的。如果你给领导提交 AI 生成歪歪扭扭的 word 版本,领导一眼就看出来是 AI 写的,不管内容如何,先给你劈头盖脸骂一顿;如果你再手动对齐格式,改字体,改页眉页脚,去除斧凿痕迹,那也要花很多心力和时间,得不偿失,甚至不如你直接手动修改内容来得快。所以,为了偷懒:通过不懈的努力(和 claude code 进行了长达数小时的迭代),我摸索出了一套用 AI 编辑 word 文档的 SOP,可以 99% 还原人类word 文档的全部格式。按这套 Word 修改 SOP 来做,在已有排版母版的前提下 ,通常可以把字体、段落 run 级样式、表格、页眉页脚 等视觉信息保到非常接近原稿——体感上就是几乎看不出来是AI改的。这很重要,不是嘛?先给大家看下对比效果,事先声明,我可以保证,以下对比试验的文档全是 AI 自己生成的,我没有做人为改动。这是没有使用 word SOP生成的文档,歪歪扭扭,字体诡异,一眼 AI:


这是使用了 word SOP 生成的文档,是不是更像活人的排版了,精致感和高级感油然而生:再来一张直观的对比图:高下立判。我让 claude code 帮我整理了一份从原理到具体实现方法的文章(包含整个复现的 SOP),分享给你:注明:不要太在意原理,原理我也不理解,只要能解决实际问题就行,喂给你的 cc,只要他能理解并帮你实现就行了,我们非技术人不用太在意技术实现的细节,一切以目的为导向。否则你会陷入巨大的混沌感和无力感的漩涡。(直接把以下文字复制给 cc 就行了,让 cc 帮你总结并实现)


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 Document  
shutil.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_text        for 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 =run 结构被毁,rPr 丢失runs[0].text + 清空其余 run
只改 doc.paragraphs表格里没改到同步遍历 doc.tables
addprevious 批量插入段落顺序反了reversed()addnext 推进锚点
pandoc 当默认主路径与母版视觉不一致接受偏差再选用;否则走「母版副本 + run 级改写」

————————————————————

五、对比示例(脱敏主题,可直接打开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 替代的方法,还是需要人为手动操作一下的。

👀 本文阅读量