使用 win32com 操作 word 中的表格

由于工作需要,最近需要对 word 中的表格进行写入操作,首先考虑的是 python-docx 库。

对于 docx 库,虽然它比较简单、容易上手,但是有两个比较明显的缺点:

  1. 只能操作 docx 文件,对于 doc 文件,需要转化后再使用。

  2. 其 paragraphs 与 tables 是两组完全不同的对象,两者无法进行联系,所以单独添加、修改、删除段落或者表格内容,使用该库比较方便,但是一旦需要获取某表格前对该表的描述等信息(提取一堆表总需要知道这个表名字叫啥吧),就相当困难了。


iS-RPA 自带 win32com 库,直接进行调用即可。
使用 win32com 操作 word 中的表格
目标是将空表格中都用数字 1 填满。

这边直接给出代码:

from win32com.client import Dispatch

word = Dispatch('Word.Application')  # 调用word程序
word.Visible = 0
word.DisplayAlerts = 0  # 不在前台显示文档及错误,在实际使用阶段可以全部关闭,提高运行速度
doc = word.Documents.Open(path)  # 打开文档
t = doc.Tables  # 获取文档中的表格

for i in range(1,3):
    for j in range(3):
        t[0].Rows[i].Cells[j].Range.Text = '1'
		
doc.Close()  # 关闭文档
word.Quit()  # 退出word程序

对于第二张表格这种进行了合并单元格操作的情况,如果还是用 t[1].Rows[i].Cells[j].Range.Text 会报错:
pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Word', '无法访问此集合中单独的行,因为表格有纵向合并的 单元格。', 'wdmain11.chm', 25471, -2146822297), None)
因此需要换一种写法:

t(2).Cell(i,j).Range.Text = '1'  # 其中t(2)和t[1]效果是一样的

下面是案例文件,大家可以自行测试。
fb63d95db2ed4352a5c1415fb0ca471d_test.docx