在 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 天的临时许可证。
    


					



