脚本专家 发表于 6 天前

Python查找替换Word文档文本的方法与代码实现

在Word文档自动化处理中,查找和替换文本是最常见的需求之一。比如批量修改合同编号、更新报告日期、统一术语表述,手动操作不仅效率低,而且容易遗漏。用Python脚本可以精准控制匹配规则,还能集成到批量文档处理流程中。本文基于Spire.Doc库,介绍如何用Python实现对Word文档的文本查找、替换、高亮以及批量处理,覆盖正则匹配和图片替换等实用场景。

为什么选择编程方式替代Word内置查找替换

Word自带的查找替换功能适合单文档交互操作,但在以下场景中有明显局限:

批量处理:几十份文档执行相同的替换,用脚本可以一次完成。
复杂匹配:正则表达式可以匹配编号、日期、邮箱等特定模式,Word原生查找做不到。
精确控制:区分大小写、全词匹配等逻辑,脚本可以灵活配置。
流程集成:合同模板生成或报告自动化管道中,替换操作可以嵌入到整个工作流。

环境准备

需要先安装Spire.Doc库,该库支持读写Word文档。使用pip安装:


pip install Spire.Doc


安装完成后,在Python脚本中导入以下模块即可开始开发:


from spire.doc import *
from spire.doc.common import *


基础文本替换

最简单的替换是固定字符串替换。Spire.Doc的Document对象提供了Replace()方法,它接受四个参数:查找文本、替换文本、是否忽略大小写、是否全词匹配。下面的代码将示例文档中的“word”替换为“ReplacedText”,并区分大小写、全词匹配:


from spire.doc import *
from spire.doc.common import *

inputFile = "Sample.docx"
outputFile = "ReplaceText.docx"

document = Document()
document.LoadFromFile(inputFile)

# 参数:查找文本, 替换文本, 忽略大小写, 全词匹配
document.Replace("word", "ReplacedText", False, True)

document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()


第三个参数False表示区分大小写,第四个参数True表示仅匹配完整单词,这样“word”不会匹配到“words”或“keyword”。合理设置这两个布尔值可以避免误替换。

使用正则表达式替换模式化文本

当查找目标不是固定字符串,而是符合某种模式的文本时,就需要正则表达式。例如替换所有以#开头的标签编号。先用Python标准库re.compile()创建正则对象,再传给Replace()方法:


from spire.doc import *
from spire.doc.common import *
import re

inputFile = "Sample.docx"
outputFile = "ReplaceByRegex.docx"

document = Document()
document.LoadFromFile(inputFile)

# 匹配以#开头的单词
regex = re.compile(r"#\w+\b")
document.Replace(regex, "Spire.Doc")

document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()


正则替换特别适合处理以下场景:

将形如#TAG001的标签统一替换为其他文本。
把文档中的邮箱地址替换为。
将日期格式从YYYY/MM/DD转换为YYYY-MM-DD。

查找文本并高亮显示

有时我们并不想替换内容,只想把匹配到的文本标记出来,便于人工审核。FindAllString()方法可以返回所有匹配位置,然后通过CharacterFormat.HighlightColor设置高亮颜色。下面的代码将全词匹配的“word”高亮为黄色:


from spire.doc import *
from spire.doc.common import *

inputFile = "Sample.docx"
outputFile = "FindAndHighlight.docx"

document = Document()
document.LoadFromFile(inputFile)

textSelections = document.FindAllString("word", False, True)

for selection in textSelections:
    selection.GetAsOneRange().CharacterFormat.HighlightColor = Color.get_Yellow()

document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()


FindAllString()的第二个和第三个参数同样控制大小写与全词匹配。GetAsOneRange()返回匹配到的文本范围,通过它可以直接修改字符格式。该功能适合文档审核、关键词标记等场景。

将查找到的文本替换为图片

在模板文档中,我们经常需要把、之类的占位符批量替换成实际图片。可以用DocPicture加载图片,再清除原文本并插入图片克隆对象:


from spire.doc import *
from spire.doc.common import *

inputFile = "Sample.docx"
outputFile = "ReplaceWithImage.docx"

document = Document()
document.LoadFromFile(inputFile)

image = DocPicture(document)
image.LoadImage("logo.png")

textSelections = document.FindAllString("", False, False)

for selection in textSelections:
    range = selection.GetAsOneRange()
    range.Text = ""
    range.ChildObjects.Add(image.Clone())

document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()


注意,这里需要先清空占位符文本,再在同一个位置插入图片对象。由于每个匹配位置都要插入独立图片,所以使用image.Clone()复制图片实例。公司Logo、签名、产品图的批量插入都可以用这个思路实现。

批量处理多个Word文档

实际项目中常常要对整个目录下的docx文件执行相同替换。结合Python的os模块遍历文件即可实现批量处理:


import os
from spire.doc import *
from spire.doc.common import *

input_dir = "./documents"
output_dir = "./processed"
os.makedirs(output_dir, exist_ok=True)

for filename in os.listdir(input_dir):
    if filename.endswith(".docx"):
      input_path = os.path.join(input_dir, filename)
      output_path = os.path.join(output_dir, filename)

      document = Document()
      document.LoadFromFile(input_path)
      document.Replace("旧公司名称", "新公司名称", False, True)
      document.SaveToFile(output_path, FileFormat.Docx)
      document.Close()
      print(f"已处理: {filename}")


这段代码会遍历./documents下的所有.docx文件,替换“旧公司名称”为“新公司名称”,并把结果保存到./processed目录。企业更名、术语统一、批量模板更新都非常适合这种批量脚本。

实用技巧:替换回调与格式控制

有些替换场景需要根据上下文决定是否执行替换。例如只替换标题样式中的“Python”为“Python Programming”,可以先查找所有匹配项,再逐个检查段落样式:


textSelections = document.FindAllString("Python", False, True)

for selection in textSelections:
    range = selection.GetAsOneRange()
    if range.OwnerParagraph.StyleName.startswith("Heading"):
      range.Text = "Python Programming"


替换文本后,原有字符格式默认会保留。如果需要同时调整字体、颜色或加粗属性,可以在替换后直接修改CharacterFormat:


textSelections = document.FindAllString("old term", False, True)

for selection in textSelections:
    range = selection.GetAsOneRange()
    range.Text = "new term"
    range.CharacterFormat.Bold = True
    range.CharacterFormat.TextColor = Color.get_Blue()


这样既能完成文本替换,又能确保新文本的视觉样式符合预期。

总结

本文覆盖了Python查找替换Word文档文本的常用方法:基础替换、正则替换、高亮标记、图片替换和批量处理。核心API围绕Replace()和FindAllString()展开,前者负责直接替换,后者负责定位匹配位置。掌握这些方法后,可以结合Python的文件处理能力搭建更复杂的文档自动化工作流,大幅减少重复性手工操作。

热心网友7 发表于 6 天前

Re: Python查找替换Word文档文本的方法与代码实现

楼主这篇写得挺实用,正好最近在搞文档批量处理,Spire.Doc的Replace方法我试过基础替换,没想到还能配合正则和高亮,学习了。有个小问题想请教一下:免费版的Spire.Doc有没有页数或者字数限制?之前用其他库处理大文档偶尔会卡。另外最后“替换为图片”那段代码好像没贴完,image.Clo后面是不是还有内容?期待补充,谢谢分享!

热心网友7 发表于 6 天前

Re: Python查找替换Word文档文本的方法与代码实现

感谢楼主分享,内容很实用!之前用Python处理Word文档时主要靠docx库,但这套基于Spire.Doc的方案看起来覆盖更全面,特别是正则替换和高亮功能,正好解决我批量改报告时需要标记异常数据的痛点。 想请教两个小问题: 1. 批量处理几十份文档时,内存占用情况如何?需要频繁加载/关闭吗? 2. 图片替换占位符时,如果原文档中有多个相同的占位符,是否每个都会插入同一张图片的克隆,需要额外处理位置偏移吗? 希望楼主能再补充下性能优化方面的经验,感谢!

热心网友7 发表于 6 天前

Re: Python查找替换Word文档文本的方法与代码实现

谢谢楼主的详细分享!平时用Word自带的查找替换确实够用,但遇到批量文档改合同编号那种情况,手动点几十次太崩溃了。正则替换和高亮这两个功能很实用,之前用python-docx处理不了复杂匹配,看到这篇思路挺受启发的。回头试试Spire.Doc,想请教下这个库对docx和doc的兼容性怎么样?另外图片替换占位符那段,如果文档里有多个相同占位符,InsertImage的定位是不是和文本替换一样精准?
页: [1]
查看完整版本: Python查找替换Word文档文本的方法与代码实现