## 安装 模块
pip install python-docx
## 使用
from docx import Document
## 读取 Word 文件里的表格信息
try:
doc = Document('A:\\ABC.docx')
except Exception as e:
print("读取 Word 文件失败", e)
else:
print("读取 Word 文件成功")
## 读取文件中所有表格
doc.tables # 表格数 len(doc.tables)
## 第1个表格
doc.tables[0]
## 第1个表格的全部行
doc.tables[0].rows # 行数 len(doc.tables[0].rows)
## 第1个表格的 第1行
doc.tables[0].rows[0]
## 第1个表格 的 第1行 的全部 列
doc.tables[0].rows[0].cells # 列数 len(doc.tables[0].rows[0].cells)
## 第1个表格 的 第1行 的 第1列
doc.tables[0].rows[0].cells[0]
doc.tables[0].rows[0].cells[0].text # 第1个表格 的 第1行 的 第1列 的单元格内容
## 遍历全部单元格(下标方式)
表格数量 = len(doc.tables)
#print("表格数量", 表格数量)
for 表格编号 in range(0, 表格数量):
#doc.tables[表格编号] ## 遍历每一个表格
行数 = len(doc.tables[表格编号].rows)
#print("行数", 行数)
for 行编号 in range(0, 行数):
#doc.tables[表格编号].rows[行编号] ## 遍历每一个表格的每一行
列数 = len(doc.tables[表格编号].rows[行编号].cells)
#print("列数", 列数)
for 列编号 in range(0, 列数):
#doc.tables[表格编号].rows[行编号].cells[列编号] ## 遍历每一个表格的每一行的每一列
print("单元格内容", doc.tables[表格编号].rows[行编号].cells[].text)
## 遍历全部单元格(迭代方式)
for 表格 in doc.tables:
#print("表格 对象", 表格) # doc.tables[N]
for 行 in 表格.rows:
#print("行 对象", 行) # doc.tables[N].rows[N]
for 列 in 行.cells:
#print("列对象", 列) # doc.tables[N].rows[N].cells[N]
print("单元格值", 列.text)
## 第1表格 的 第1行 变成列表形式
[i.text for i in doc.tables[0].rows[0].cells]
## 打印 第3表格 的全部单元格内容(列表形式)
行数 = len(doc.tables[3].rows)
for 行编号 in range(0, 行数):
print([i.text for i in doc.tables[3].rows[行编号].cells])
## 查找标题某个单元格为某个关键字的表格编号
def 标题含关键字列的表格编号列表(doc, 标题关键字):
L = [] ## 列表:存放找到匹配的表格的编号
表格数量 = len(doc.tables)
print("表格数量", 表格数量)
for 表格编号 in range(0, 表格数量): ## 遍历每一个表格
标题行内容列表 = [i.text for i in doc.tables[表格编号].rows[0].cells] ## 每个表格的第一行(标题行)单元格转成列表形式
if 标题关键字 in 标题行内容列表:
L.append(表格编号)
return(L)
## 函数使用示例
doc = Document('TEST.docx')
标题某列 = 'XXX'
R = 标题含关键字列的表格编号列表(doc, 标题某列)
print(R) # [3, 5, 6] 或 []
## 查找标题某几个单元格为某几个关键字的表格编号
def 必须同时含有多列的表格(doc, 标题关键字列表):
L = [] ## 列表:存放找到匹配的表格的编号
表格数量 = len(doc.tables)
print("表格数量", 表格数量)
for 表格编号 in range(0, 表格数量): ## 遍历每一个表格
标题行内容列表 = [i.text for i in doc.tables[表格编号].rows[0].cells] ## 每个表格的第一行(标题行)单元格转成列表形式
if set(标题关键字列表) - set(标题行内容列表) == set(): ## 列表转成集合,使用差集计算 前一个集合不在后一个集合里的元素(如果差集为空集,说明后一个集合包含前一个集合的全部元素)
L.append(表格编号)
return(L)
## 函数使用示例
doc = Document('TEST.docx')
标题关键字列表 = ['AAA', 'BBB']
R = 必须同时含有多列的表格(doc, 标题关键字列表)
print(R) # [3, 6] 或 []
## 查找含指定内容列,且记录列位置
## D = {表格编号:{列名1:[列名1编号], 列名2:[列名2编号]}, 表格编号:{列名1:[列名1编号], 列名2:[列名2编号]}}
## 列编号使用列表格式是为了应对重名列的情况(出现过原始表格中使用重名列的情况,再次强烈谴责一下这些不规范的表格)
## 注意:表格有合并单元格的情况请自行修改代码
def 查找(doc, 列名列表):
D = {}
表格数量 = len(doc.tables)
#print("表格数量", 表格数量)
for 表格编号 in range(0, 表格数量):
列数 = len(doc.tables[表格编号].rows[0].cells)
#print("列数", 列数)
for 列编号 in range(0, 列数):
单元格内容 = doc.tables[表格编号].rows[0].cells[列编号].text ## 遍历表格标题行的每一个单元格的值
if 单元格内容 in 列名列表: ## 如果遍历到的当前单元格的值在要找的列表中
if 表格编号 in D:
if 单元格内容 in D[表格编号]:
D[表格编号][单元格内容].append(列编号)
else:
D[表格编号][单元格内容] = [列编号]
else:
D[表格编号] = {}
D[表格编号][单元格内容] = [列编号]
#return(D) ## 只要含标题关键字任意一项即可的这里就可以return
## 如果要标题列表内容全有的表格
全有长度 = len(列名列表)
D_New = {}
for K in D:
if len(D[K]) == 全有长度:
#print("符合要求 K", K)
D_New[K] = D[K]
return(D_New)
## 解析 查找() 函数返回的结果字典
doc = Document('TEST.docx')
标题关键字列表 = ['AAA', 'BBB']
R = 查找(doc, 列名列表)
## 返回的字典包含了第N个表格符合要求,每个表格里每个列名元素所在的列编号
## 可以按行遍历每个符合要求的表格的每一行,再通过列名对应编号提取对应单元格里的内容
## 可以拼接组合或者生成新的表格