【问题标题】:Python docx paragraph in textbox文本框中的 Python docx 段落
【发布时间】:2016-04-27 11:16:04
【问题描述】:

有没有什么方法可以在带有python-docx的文本框中访问和操作现有docx文档中的文本?

我试图通过迭代在文档的所有段落中找到一个关键字:

doc = Document('test.docx')

for paragraph in doc.paragraphs:
    if '<DATE>' in paragraph.text:
        print('found date: ', paragraph.text)

如果放置在普通文本中,则可以找到它,但不在文本框内。

【问题讨论】:

  • 在 Word 文件中,文本框位于单独的对象中。通过粗略的谷歌搜索,python-docx 可以访问 InlineShapes 但不能访问 TextBoxes。

标签: python python-docx


【解决方案1】:

仅包含格式化文本的文本框的解决方法是使用浮动的格式化表格。它的样式几乎可以像文本框一样(框架、颜色等),并且可以通过docx API 轻松访问。

doc = Document('test.docx')

for table in doc.tables:
    for row in table.rows:
        for cell in row.cells:
            for paragraph in cell.paragraphs:
                if '<DATE>' in paragraph.text:
                   print('found date: ', paragraph.text)

【讨论】:

    【解决方案2】:

    不是通过 API,至少现在还没有。您必须发现它所在的 XML 结构,并深入到 lxml 级别,也许 XPath 才能找到它。这样的事情可能是一个开始:

    body = doc._body
    # assuming differentiating container element is w:textBox
    text_box_p_elements = body.xpath('.//w:textBox//w:p')
    

    我不知道 textBox 是否是此处的实际元素名称,您必须将其与 XPath 路径详细信息的其余部分一起整理出来,但这种方法可能会奏效。我经常使用类似的方法来解决 API 中尚未内置的功能。

    opc-diag 是检查 XML 的有用工具。基本方法是创建一个最小的 .docx 文件,其中包含您要查找的内容类型。然后使用 opc-diag 检查保存文件时生成的 XML Word:

    $ opc browse test.docx document.xml
    

    http://opc-diag.readthedocs.org/en/latest/index.html

    【讨论】:

    • 非常感谢您对这种通用方法的洞察力。当前的项目不能满足深入挖掘这个特定部分 - 所以我找到了一种将所有内容放在浮动表格而不是文本框中的方法。顺便说一句:与 docx 项目合作得很好。非常感谢,请继续这项工作。
    • 这可以通过在段落中添加文本框架 (framePr) 属性来实现:officeopenxml.com/WPparagraph-textFrames.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多