如何使用Python读取MS Word文件中的表内容?

如何使用Python读取MS Word文件中的表内容?,python,ms-word,Python,Ms Word,如何读取和处理DOCX文件中表的每个单元格的内容 我在Windows7和PyWin32上使用Python3.2访问MS Word文档 我是一个初学者,所以我不知道正确的方法达到表细胞。到目前为止,我刚刚做了以下工作: import win32com.client as win32 word = win32.gencache.EnsureDispatch('Word.Application') word.Visible = False doc = word.Documents.Open("MyD

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

我在Windows7和PyWin32上使用Python3.2访问MS Word文档

我是一个初学者,所以我不知道正确的方法达到表细胞。到目前为止,我刚刚做了以下工作:

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

以下是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

晚年才加入,但我想我还是要把这句话说出来: 现在(2015年),您可以使用非常整洁的doc python库: . 然后:

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
来自docx导入文档
wordDoc=文档(“”)
对于wordDoc.tables中的表:
对于table.rows中的行:
对于row.cells中的单元格:
打印cell.text

我在一个博客上找到了一个简单的代码片段

最棒的是,您不需要安装任何非标准的python库

docx文件的格式如中所述

导入zipfile
导入xml.etree.ElementTree
WORD_{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
PARA=WORD_名称空间+p
TEXT=WORD_名称空间+t'
TABLE=WORD_名称空间+tbl
行=WORD_名称空间+tr
CELL=WORD_名称空间+tc
zipfile.zipfile(“”)作为docx:
tree=xml.etree.ElementTree.xml(docx.read('word/document.xml'))
对于树中的表。iter(表):
对于表.iter(行)中的行:
对于第行中的单元,iter(单元):
打印“”。连接(cell.iter中节点的node.text(text))

请提供更多详细信息。。。“到目前为止你试过什么?”克里斯托弗编辑。希望现在已经足够了?非常感谢你为我工作。我还有一个问题,有没有办法通过列标题和行号访问表单元格?再次感谢:)我认为Ms Word中的列标题是常规单元格。它们应该只是表格的第一行。但是,您可以编写一个返回列索引的函数。我将编辑我的答案,给你们展示一个例子。非常感谢你们的帮助。这很有帮助。此代码无法捕获可能位于标头中的表。。你有解决这个问题的办法吗??我真的很感激你的帮助,谢谢你,请详细说明!你所说的“抓住可能在页眉中的表格”是什么意思?谢谢!你知道如何处理合并的单元格吗?例如,我有一个2行3列的表,但最后一行的前两列合并了。上述代码的结果是,第三列的内容被读取为第二列,而不是第三列。@Shani,自从我查看Excel文件以来,已经有几年了。您可以解压缩word文档,检查合并单元格的结构,并修改上面的代码。或者,自从我写了这篇文章以来,对python中的Microsoft文档有了更好的支持。使用其中一个python模块可能会做得更好。实际上,上面的代码比我在网上找到的模块简单得多,涵盖的案例也更多(例如,如果表格中使用字段,tabla不会读取字段,因此整个表格都被扭曲了,但我也尝试了其他包)。我会看看里面的结构。这是一个有用的包,有很多用途。。。但一个大问题是,文本作为一个长列表(段落)给出,表格作为第二个列表,图像作为第三个列表给出,没有任何指示它们是如何排列在一起的。有人试图在……处设法解决这个问题。。。但它处理文件的速度非常慢。如果需要对所有元素进行排序,则可能必须使用Mike Robins的方法。
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))