【问题标题】:How to read contents of an Table in MS-Word file Using Python?如何使用 Python 读取 MS-Word 文件中表格的内容?
【发布时间】:2012-05-09 03:27:27
【问题描述】:

如何读取和处理 DOCX 文件中表格的每个单元格的内容?

我在 Windows 7 和 PyWin32 上使用 Python 3.2 来访问 MS-Word 文档。

我是初学者,所以我不知道访问表格单元格的正确方法。到目前为止,我刚刚这样做了:

import win32com.client as win32
word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False 
doc = word.Documents.Open("MyDocument")

【问题讨论】:

标签: python ms-word


【解决方案1】:

在相当晚的生活中加入,但我想我还是要把它说出来: 现在(2015 年),您可以使用非常简洁的 doc python 库: https://python-docx.readthedocs.org/en/latest/。然后:

from docx import Document

wordDoc = Document('<path to docx file>')

for table in wordDoc.tables:
    for row in table.rows:
        for cell in row.cells:
            print cell.text

【讨论】:

  • 这是一个用于多种用途的有用包...但一个大问题是文本作为一个长列表(段落)给出,表格作为第二个,图像作为第三个,没有任何迹象表明它们是如何一起排序的。 github.com/kmrambo/… 试图解决这个问题......但处理文档的速度难以置信。如果需要对所有元素进行排序,您可能必须使用 Mike Robins 的方法。
【解决方案2】:

以下是在 Python 2.7 中对我有用的方法:

import win32com.client as win32
word = win32.Dispatch("Word.Application")
word.Visible = 0
word.Documents.Open("MyDocument")
doc = word.ActiveDocument

要查看您的文档有多少表:

doc.Tables.Count

然后,您可以通过索引选择所需的表。请注意,与 python 不同,COM 索引从 1 开始:

table = doc.Tables(1)

要选择一个单元格:

table.Cell(Row = 1, Column= 1)

获取其内容:

table.Cell(Row =1, Column =1).Range.Text

希望这会有所帮助。

编辑:

根据标题返回列索引的函数示例:

def Column_index(header_text):
for i in range(1 , table.Columns.Count+1):
    if table.Cell(Row = 1,Column = i).Range.Text == header_text:
        return i

然后您可以通过这种方式访问​​您想要的单元格,例如:

table.Cell(Row =1, Column = Column_index("The Column Header") ).Range.Text

【讨论】:

  • 非常感谢您为我工作。我还有一个问题,有没有办法通过列标题和行号访问表格单元格?再次感谢:)
  • 我认为 Ms Word 中的列标题是常规单元格。它们应该只是表格的第一行。但是,您可以编写一个返回列索引的函数。我将编辑我的答案以向您展示一个示例。
  • 非常感谢您的帮助。它有帮助。
  • 这段代码没有捕捉到可能在标题中的表格。你有解决方案吗?非常感谢您的帮助,谢谢
  • 能否详细说明! '抓住可能在标题中的表格'是什么意思?
【解决方案3】:

我在Reading Table Contents Using Pythonetienne的博客上找到了一个简单的代码sn-p

这样做的好处是您不需要安装任何非标准的 python 库。

docx 文件的格式在Open Office XML 中描述。

import zipfile
import xml.etree.ElementTree

WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
PARA = WORD_NAMESPACE + 'p'
TEXT = WORD_NAMESPACE + 't'
TABLE = WORD_NAMESPACE + 'tbl'
ROW = WORD_NAMESPACE + 'tr'
CELL = WORD_NAMESPACE + 'tc'

with zipfile.ZipFile('<path to docx file>') as docx:
    tree = xml.etree.ElementTree.XML(docx.read('word/document.xml'))

for table in tree.iter(TABLE):
    for row in table.iter(ROW):
        for cell in row.iter(CELL):
            print ''.join(node.text for node in cell.iter(TEXT))

【讨论】:

  • 谢谢!你知道如何处理合并的单元格吗?例如,我有一个 2 行 3 列的表,但最后一行的前两列被合并了。上面代码的结果是第三列的内容被读取为第二列,而不是第三列。
  • @Shani,我已经有几年没有看 Excel 文件了。您可以解压缩 doc 并检查合并单元格的结构并修改上面的代码。或者,自从我写了这篇文章以来,python 对 Microsoft 文档的支持要好得多。使用其中一个 python 模块可能会做得更好。我无法具体推荐任何内容。
  • 实际上,上面的代码比我在网上找到的模块要简单得多,涵盖的情况也更多(例如,如果在表格中使用表格,则表格不会读取字段,因此整个表格都会被扭曲。但是我还尝试了其他软件包)。我会看看内部结构。
猜你喜欢
  • 1970-01-01
  • 2018-02-11
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
相关资源
最近更新 更多