18

如何读取和处理 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")
4

3 回答 3

39

在相当晚的生活中加入,但我想我还是会把它说出来:现在(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
于 2015-08-06T07:16:26.440 回答
26

以下是在 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
于 2012-04-29T19:54:08.890 回答
14

我在etienne的博客Reading Table Contents Using Python上找到了一个简单的代码片段

这样做的好处是您不需要安装任何非标准的 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))
于 2015-11-18T08:43:05.843 回答