python-docx 从段落中获取表格

标签 python document docx paragraphs

我有包含许多段落和表格的 .docx 文件,例如:

  1. 标准杆1
    • 表1
    • 表2
    • 表3
  2. par2

    • 表1
    • 表2

    2.1 par21

    • 表1
    • 表2

我需要迭代所有对象并生成字典,可能是 json 格式,例如:

   {par1: [table1, table2, table3], par2[table1,table2, {par21: [table1,table2]} ] }
    from docx.api import Document

    filename = 'test.docx'
    document = Document(docx=filename)
    for table in document.tables:
        print table

    for paragraph in document.paragraphs:
        print paragraph.text

如何关联每个段落和表格?

你能推荐点什么吗?

最佳答案

from docx import Document
from docx.document import Document as _Document
from docx.oxml.text.paragraph import CT_P
from docx.oxml.table import CT_Tbl
from docx.table import _Cell, Table
from docx.text.paragraph import Paragraph

def iter_block_items(parent):
    """
    Generate a reference to each paragraph and table child within *parent*,
    in document order. Each returned value is an instance of either Table or
    Paragraph. *parent* would most commonly be a reference to a main
    Document object, but also works for a _Cell object, which itself can
    contain paragraphs and tables.
    """
    if isinstance(parent, _Document):
        parent_elm = parent.element.body
    elif isinstance(parent, _Cell):
        parent_elm = parent._tc
    elif isinstance(parent, _Row):
        parent_elm = parent._tr
    else:
        raise ValueError("something's not right")
    for child in parent_elm.iterchildren():
        if isinstance(child, CT_P):
            yield Paragraph(child, parent)
        elif isinstance(child, CT_Tbl):
            yield Table(child, parent)

document = Document('test.docx')
for block in iter_block_items(document):
    #print(block.text if isinstance(block, Paragraph) else '<table>')
    if isinstance(block, Paragraph):
        print(block.text)
    elif isinstance(block, Table):
        for row in block.rows:
            row_data = []
            for cell in row.cells:
                for paragraph in cell.paragraphs:
                    row_data.append(paragraph.text)
            print("\t".join(row_data))

关于python-docx 从段落中获取表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29240707/

相关文章:

python - 如何转换 DataFrame 以便标题成为列值?

sympy - 是否有一个完整的示例来将 sympy 中的数学表达式写入 Microsoft Word 文档?

java - 你如何在 Java 中保存 DOM 文档?

java - 使用apache poi创建的word文档始终以兼容模式打开

Python:将 PDF 转换为 DOC

python - 按特定列排序,但将具有相同主索引的项目放在一起

python - 如何在 Python 中测试 Web API 限制

python - 在列组合上扩展数据框

macos - 文件类型痛苦 - cocoa

testing - 一次创建数百个文档?