Python3 读取word中的表格,根据表格第一行标题行查找想要的表格

你离开我真会死。 提交于 2020-01-25 09:31:35

## 安装 模块
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个表格符合要求,每个表格里每个列名元素所在的列编号
## 可以按行遍历每个符合要求的表格的每一行,再通过列名对应编号提取对应单元格里的内容
## 可以拼接组合或者生成新的表格

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!