Python3 讀取word中的表格,根據表格第一行標題行查找想要的表格


## 安裝 模塊
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個表格符合要求,每個表格裏每個列名元素所在的列編號
## 可以按行遍歷每個符合要求的表格的每一行,再通過列名對應編號提取對應單元格里的內容
## 可以拼接組合或者生成新的表格

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章