在 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 文本框中的文本
使用 Spire.Doc for Python 获取文本框内文本内容的详细步骤如下:
- 创建一个 Document 对象,并通过 Document.LoadFromFile() 加载文档。
- 使用 with open(outputFile, 'w', encoding='utf-8') as sw 以写模式创建文件对象并命名为 sw。
- 根据 Document.TextBoxes.Count 判断 Word 文档中是否有文本框。
- 遍历文档的章节、段落,并判断段落的子对象是否是 Textbox 类型,如果是则强制类型转换为 Textbox 类型。
- 继续遍历 Textbox 对象的子对象,并判断是否为 Paragraph 对象,如果是则强制转换为 Paragraph 类型
- 使用 sw 输出 Paragraph.Text 包含的文本内容
- Python
from spire.doc import *
from spire.doc.common import *
# 创建Document对象
document = Document()
# 加载文件
document.LoadFromFile("D:\\schedule\\Data\\提取textbox内容.docx")
# 定义文本输出文件名
outputFile = "ExtractTextFromTextBoxes.txt"
# 如果文档中的文本框个数大于0
if document.TextBoxes.Count > 0:
with open(outputFile, 'w', encoding='utf-8') as sw:
# 遍历文档的章节-段落
for i in range(document.Sections.Count):
section = document.Sections.get_Item(i)
for j in range(section.Paragraphs.Count):
p = section.Paragraphs.get_Item(j)
for k in range(p.ChildObjects.Count):
obj = p.ChildObjects.get_Item(k)
# 判断类型,如果获取到的对象是文本框就转换obj为TextBox对象
if obj.DocumentObjectType == DocumentObjectType.TextBox:
textbox = obj if isinstance(obj, TextBox) else None
for x in range(textbox.ChildObjects.Count):
objt = textbox.ChildObjects.get_Item(x)
# 如果对象是段落,则输出段落文本
if objt.DocumentObjectType == DocumentObjectType.Paragraph:
sw.write((objt if isinstance(objt, Paragraph) else None).Text)
document.Close()
Python 获取 Word 文本框中的图片
在上面的例子中,为了获取 Textbox 对象,需要遍历整个文档,当我们需要获取的目标对象属于非常基础的对象(比如 DocPicture)时,又需要继续遍历整个 Textbox 对象及其子对象,这样操作会显得非常繁琐。为了简化操作,我们借用 queue.Queue() 方法将 Textbox 压入队列进行遍历,这样只用取出队列中的对象判断是否为图片对象,若不是则获取其子对象继续压入队列。具体请参考下面的步骤:
- 创建一个 Document 对象。
- 使用 Document.LoadFromFile() 方法加载 Word 文件。
- 使用 range(document.TextBoxes.Count) 决定遍历次数,并通过 Document.TextBoxes.get_Item(index) 获取 Textbox 对象。
- 使用 queue.Queue() 创建一个 Queue 对象,并将 textbox 对象放入队列。
- 获取队列中的元素,遍历其子对象,判断是否为 Picture 类型,如果是则使用 DocPicture 获取图片的字节并加入 images 数组,如果不是 Picture 类型且为复合对象则压入队列继续遍历。
- 队列遍历结束后,遍历 images 数组,创建文件对象依次写入文件中。
- Python
from spire.doc import *
from spire.doc.common import *
import queue
# 创建Document对象
document = Document()
# 加载文件
document.LoadFromFile("D:\\schedule\\Data\\提取textbox内容.docx")
# 创建images数组
images = []
# 遍历文本框
for i in range(document.TextBoxes.Count):
textbox = document.TextBoxes.get_Item(i)
# 将textbox放入队列
nodes = queue.Queue()
nodes.put(textbox)
# 遍历nodes并获取node的子对象
while nodes.qsize() > 0:
node = nodes.get()
for i in range(node.ChildObjects.Count):
child = node.ChildObjects.get_Item(i)
# 判断node子对象是否为图片类型
# 是图片类型即加入images数组
if child.DocumentObjectType == DocumentObjectType.Picture:
picture = child if isinstance(child, DocPicture) else None
# 获取图片的字节并存储到images中
dataBytes = picture.ImageBytes
images.append(dataBytes)
# node子对象若不是图片类型且为复合对象则压入队列继续遍历
elif isinstance(child, ICompositeObject):
nodes.put(
child if isinstance(child, ICompositeObject) else None)
# 遍历images并保存图片
for i, item in enumerate(images):
fileName = "Image-{}.png".format(i)
with open("D:\\schedule\\Data\\" + fileName, 'wb') as imageFile:
imageFile.write(item)
document.Close()
Python 获取 Word 文本框中的表格
使用 Spire.Doc for Python 获取文本框内表格内容的详细步骤如下:
- 创建一个 Document 对象并使用 document.LoadFromFile() 加载文件。
- 使用 Document.TextBoxes.get_Item(0) 获取第一个文本框。
- 遍历文本框内的子对象并判断其类型,如果是 Table 类,则获取并转为table类型。然后继续遍历 Table 的行,以及每行单元格。
- 遍历单元格中的段落对象,使用 TableCell.Paragraphs.get_Item() 获取段落。
- 将 Paragraph.Text + "\t" 保存到 tempStr 中。
- 遍历段落的子对象,若有图片,则输出 "Image-{index}.png" 到 tempstr 中占位。
- 使用 with open(outputFile, 'w') as fp 以写模式创建文件对象,并在指定路径写入 tempStr 的内容。
- Python
from spire.doc import *
from spire.doc.common import *
# 创建Document对象
document = Document()
# 加载文件
document.LoadFromFile("D:\\schedule\\Data\\提取textbox内容.docx")
# 获取文档内第1个文本框
textbox = document.TextBoxes.get_Item(0)
# 计数图片
pic_count = 0
# 存放表格文本内容
tempStr = ''
# 遍历文本框内的对象
for j in range(textbox.ChildObjects.Count):
tb_obj = textbox.ChildObjects.get_Item(j)
# 若文本框的子对象为Table,则获取Table对象并转换为Table类型
if tb_obj.DocumentObjectType == DocumentObjectType.Table:
table = tb_obj if isinstance(tb_obj, Table) else None
# 遍历表格行及每行单元格
for m in range(table.Rows.Count):
row = table.Rows.get_Item(m)
for n in range(row.Cells.Count):
cell = row.Cells.get_Item(n)
# 遍历单元格中的段落
for k in range(cell.Paragraphs.Count):
paragraph = cell.Paragraphs.get_Item(k)
# 将段落文本保存到tempStr
tempStr += paragraph.Text + "\t"
# 遍历段落的子对象,若有图片,则在tempStr中定义图片名称
for p in range(paragraph.ChildObjects.Count):
para_obj = paragraph.ChildObjects.get_Item(p)
if para_obj.DocumentObjectType == DocumentObjectType.Picture:
tempStr += "Image-{}.png".format(pic_count) + "\t"
pic_count += 1
tempStr += "\r\n"
# 指定输出文件名并创建文件对象写入tempStr内容
outputFile = 'getTableFrTb.txt'
with open(outputFile, 'w') as fp:
fp.write(tempStr)
document.Close()
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。