我的知识记录

Python替换Word文档指定文字方法

用python-docx替换Word文档中指定文字为新内容,解决跨run拆分导致替换失败的问题,支持正文和表格内文字替换,保留原有格式。

场景痛点

合同模板里有占位符如【公司名称】【甲方】【金额】,需要把这些占位符换成实际内容。手动用Word的查找替换,一份合同点好几下,几十份合同就要重复几十遍。更头疼的是python-docx直接改run.text经常替换不成功,因为同一个词被拆到了多个run里。这篇讲一个稳妥的替换方案。

用到的库

pip install python-docx

完整代码

# 导入库
from docx import Document

def replace_text_in_paragraph(paragraph, old_text, new_text):
"""
替换一个段落里的文字,解决跨run拆分问题
思路:先拿到段落完整文字,判断是否包含目标词,
如果包含,把第一个run设为替换后的完整文本,其他run清空
"""
# 先拼接段落所有run的文字,看整体是否包含目标
full_text = ''.join(run.text for run in paragraph.runs)
if old_text not in full_text:
return False

# 替换后的完整文本
new_full_text = full_text.replace(old_text, new_text)

# 把第一个run设为完整新文本,保留第一个run的格式
if paragraph.runs:
paragraph.runs[0].text = new_full_text
# 清空其余run
for run in paragraph.runs[1:]:
run.text = ''
return True

def replace_text_in_docx(docx_path, output_path, replace_map):
"""
批量替换文档中的多个关键词
replace_map: 字典,key是要找的旧文字,value是替换成的新文字
"""
doc = Document(docx_path)
count = 0

# 替换正文段落
for para in doc.paragraphs:
for old_text, new_text in replace_map.items():
if replace_text_in_paragraph(para, old_text, new_text):
count += 1

# 替换表格里的文字
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
for old_text, new_text in replace_map.items():
if replace_text_in_paragraph(para, old_text, new_text):
count += 1

doc.save(output_path)
print(f'替换完成,共处理 {count} 处,输出文件:{output_path}')

if __name__ == '__main__':
# 定义替换映射表
replace_map = {
'【公司名称】': '宝鸡市稳驰供应链有限公司',
'【甲方】': '宝鸡市金台区卓亚技术服务部',
'【金额】': '壹拾万圆整(¥100,000.00)',
'【日期】': '2026年9月14日',
}

replace_text_in_docx('合同模板.docx', '输出合同.docx', replace_map)

代码讲解

  • 直接改run.text有个致命问题:Word把一段文字按格式拆成多个run,比如"【公司】"这三个字可能拆成三个run各一个字,直接遍历run根本找不到完整的"【公司】"这个词。
  • replace_text_in_paragraph()的解决思路:先把段落所有run的文字拼成完整字符串,判断目标词是否在里面。如果在,就把替换后的完整文字全部塞回第一个run(保留第一个run的字体格式),其余run清空。这样无论目标词跨几个run都能替换成功。
  • replace_map字典一次性配置多组替换关系,遍历正文段落和表格单元格段落分别处理。
  • 缺点:替换后段落格式统一变成第一个run的格式,如果原段落有多种混排格式会丢失,但对模板占位符这种场景完全够用。

运行结果

运行脚本后生成输出合同.docx,打开可以看到所有【公司名称】【甲方】【金额】【日期】占位符都被替换成了实际内容,正文和表格里的替换都生效,控制台打印替换处数。

注意事项

  • 这个方法会把段落里多个run的格式合并成第一个run的格式,如果原段落有粗体、斜体等混排需求,需要更精细的run级替换方案。
  • 替换是精确匹配,区分大小写,全角半角也要对应,比如【】必须是中文方括号。
  • 页眉页脚里的文字不在doc.paragraphs里,需要单独遍历doc.sections的header和footer。
  • 替换前先备份原文件,替换后的文件另存为新文件名。

Python替换Word文档指定文字方法

标签:

更新时间:2026-09-15 08:58:06

上一篇:Python Word插入超链接:外链和邮箱链接

下一篇:Python读取Word文档全部文字方法详解