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