在 Word 中,书签是一种文档浏览与定位的重要工具,在文档编辑软件中发挥着关键作用。它可以帮助我们快速定位到重要的段落处,从而获取段落内容;它也经常会起到占位符的作用,有了它,我们可以将数据插入到文档中任意的位置。在这篇文章中,我们将探讨如何使用 Spire.Doc for Python 替换或获取 Word 书签内容。
安装 Spire.Doc for Python
本教程需要 Spire.Doc for Python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.Doc
如果您不确定如何安装,请参考此教程: 如何在 Windows 中安装 Spire.Doc for Python
用于测试的 Word 源文档如下图:
Python 替换 Word 书签内容
书签替换内容分为两种,文本和其他内容(如图片、表格或 OfficeMath 公式等其他对象)。首先都需要定位到书签,定位后,文本内容可以使用字符串直接进行替换,其他对象的话则需要添加进 TextBodyPart 对象中再进行替换。这里以表格为例,详细步骤如下:
- 创建一个 Document 对象,并通过 Document.LoadFromFile() 加载文档。
- 创建书签定位器对象 BookmarksNavigator 后使用 BookmarksNavigator.MoveToBookmark() 方法通过书签名字定位书签
- 使用 BookmarksNavigato.ReplaceBookmarkContent(str,bool) 替换书签文本
- 参照第二步定位到另一个书签
- 使用 Document.Sections.get_Item(0).Tables.get_Item(0) 获取表格
- 创建 TextBodyPart 对象,并使用 TextBodyPart.BodyItems.Add() 方法将表格添加进去
- 使用 BookmarksNavigato.ReplaceBookmarkContent(TextBodyPart,bool,bool) 替换书签内容
- Python
from spire.doc import *
# 创建Document对象并加载文档
document = Document()
document.LoadFromFile("D:\\schedule\\Data\\模板.docx")
# 创建书签定位器对象并根据书签名字定位书签
bookmarkNavigator_office = BookmarksNavigator(document)
bookmarkNavigator_office.MoveToBookmark("Spire_Office")
# 用文本替换书签,True代表保留格式
bookmarkNavigator_office.ReplaceBookmarkContent(
"Spire.Office for Python 是一个功能强大的综合类库,帮助开发人员使用 Python编程语言处理各种文件格式的文档。"+\
"Spire.Office for Python 包括 Spire.Doc for Python,Spire.XLS for Python,Spire.Presentation for Python 和 Spire.PDF for Python。\n"
"通过使用 Spire.Office for Python,开发人员可以处理 Word (DOC、DOCX)、Excel (XLS、XLSX)、PowerPoint (PPT、PPTX)、PDF "+\
"和其他多种文档格式。该库提供了广泛、高效的文档处理功能,可用于执行文档的读取、创建、编辑和转换等多种任务",
True)
# 创建书签定位器对象并根据书签名字定位书签
bookmarkNavigator_products = BookmarksNavigator(document)
bookmarkNavigator_products.MoveToBookmark("Spire_Products")
# 获取第一个表格
table = document.Sections.get_Item(0).Tables.get_Item(0)
# 创建TextBodyPart对象,并把Table对象添加进去
textBodyPart = TextBodyPart(document)
textBodyPart.BodyItems.Add(table)
# 用textBodyPart替换书签内容,第一个True代表保留第一段的格式,第二个True代表保留替换内容的格式
bookmarkNavigator_products.ReplaceBookmarkContent(textBodyPart, True, True)
# 保存文档
document.SaveToFile("模板_output.docx", FileFormat.Docx)
document.Close()
document.Dispose()
Python 获取 Word 书签内容
以上例的结果文件测试,获取第一个书签内的文本内容,详细步骤如下:
- 创建一个 Document 对象。
- 使用 Document.LoadFromFile() 方法加载 Word 文件。
- 创建 BookmarksNavigator 对象,并使用 BookmarksNavigator.MoveToBookmark() 定位书签
- 使用 BookmarksNavigator.GetBookmarkContent() 获取该书签内容的集合
- 遍历书签内容集合的子对象,并判断是否为 Paragraph 对象,若是则强转为 Paragraph 对象
- 继续遍历 Paragraph 中的子对象,并判断是否为 TextRange 文本对象,若是则强转为 TextRange 对象,并使用 TextRange.Text 写入字符串。
- 遍历结束后,使用 with FileIO(outputFile, mode="w") as 以写模式创建文件对象,并将字符串内容写入指定文本文件中。
- Python
from spire.doc import *
from io import FileIO
# 创建Document对象,并加载输入文件
doc = Document()
doc.LoadFromFile("模板_output.docx")
# 创建书签导航器,并定位到书签
navigator = BookmarksNavigator(doc)
navigator.MoveToBookmark("Spire_Office")
# 获取书签内容的集合
textBodyPart = navigator.GetBookmarkContent()
text = ''
# 遍历集合中的子对象
for i in range(textBodyPart.BodyItems.Count):
item = textBodyPart.BodyItems.get_Item(i)
# 如果子对象为段落则继续遍历段落子对象集合
if isinstance(item, Paragraph):
for j in range((item if isinstance(item, Paragraph) else
None).ChildObjects.Count):
# 获取段落子对象
childObject = (item if isinstance(item, Paragraph) else
None).ChildObjects.get_Item(j)
# 判断若是Textrange类型,则写入text字符串中
if isinstance(childObject, TextRange):
text += (childObject
if isinstance(childObject, TextRange) else None).Text
# 指定输出文件,并创建文件对象输出text到指定文件
outputFile = "ExtractBookmarkText.txt"
with FileIO(outputFile, mode="w") as f:
f.write(text.encode("utf-8"))
doc.Close()
doc.Dispose()
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。