2016-04-27 486 views
2

有什么方法可以访问和处理文本框中的现有docx文档中的文本,其中包含python-docx文本框中的Python docx段落

我试图通过重复来查找文档中的所有段落的关键词:

doc = Document('test.docx') 

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

如果放在普通的文本,而不是一个文本框里面找到。

+0

在Word文件中,文本框位于单独的对象中。从粗略的Google搜索中,'python-docx'可以访问InlineShapes,但不能访问TextBoxes。 – usr2564301

回答

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-诊断检查的XML Word中产生,当你保存文件:

$ opc browse test.docx document.xml 

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

+0

非常感谢这种通用方法的见解。目前的项目并不满足于深入挖掘这个特定的部分 - 所以我找到了一种将所有内容放入浮动表格而不是文本框的方法。顺便说一句:与docx项目很好的合作。非常感谢,请保持这项工作。 – Stefan

+0

这可以通过将文本框架(framePr)属性添加到段落来实现:http://officeopenxml.com/WPparagraph-textFrames.php –

2

一种解决方法只包含格式化文本的文本框是使用一个浮动的,格式化的表格。它可以被设计成几乎像文本框(框架,颜色等),并且可以通过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)