Python實現(xiàn)快速提取Word表格并轉(zhuǎn)Markdown
一、為什么需要這個工具
在測試工作中,我們常遇到這樣的場景:
- 需求文檔是Word格式,但需要將表格數(shù)據(jù)提取出來生成測試用例
- 手動復制粘貼效率低且易出錯
- 大模型需要結(jié)構(gòu)化數(shù)據(jù)輸入,但Word表格格式復雜
本文提供一套零基礎(chǔ)可操作的代碼方案,幫助測試工程師3分鐘內(nèi)完成表格提取與轉(zhuǎn)換,直接對接自動化測試或大模型。

二、代碼實戰(zhàn):三步搞定表格提取
第一步:安裝依賴
pip install python-docx
注意:
- 如果提示權(quán)限問題,可在命令前加 sudo(Linux/macOS)或以管理員身份運行命令行(Windows)。
- 如果文檔包含復雜格式(如合并單元格),需確保 python-docx 版本 ≥ 0.8.11。
第二步:核心代碼解析
1. 標題檢測:精準定位目標段落
def is_heading_enhanced(paragraph):
# 標題特征:樣式名稱含關(guān)鍵詞 + 字體加粗 + 字體足夠大
style_name = (paragraph.style.name or "").lower()
if "標題" in style_name or "heading" in style_name:
return True
try:
font = paragraph.style.font
return (font.size.pt >= 14 and font.bold) if font.size else False
except:
return False
關(guān)鍵點詳解:
樣式名稱匹配:
- 優(yōu)先檢查標題樣式名稱是否包含 標題(中文)或 heading(英文),如 Heading 1、標題1。
- 這一設(shè)計能快速定位到文檔中明確標記的標題段落。
格式兜底判斷:
- 字體大?。簶祟}通常比正文大,這里設(shè)置閾值為14pt(可調(diào)整)。
- 加粗要求:標題一般需要加粗,確保格式一致性。
- 如果段落樣式名稱未包含關(guān)鍵詞,但滿足格式條件,也會被識別為標題。
異常處理:
使用 try-except 捕獲字體信息缺失的異常,避免程序崩潰。
2. 表格抓?。喊次臋n順序提取
def get_tables_under_heading(doc_path, target_title):
from docx import Document
doc = Document(doc_path)
target_tables = []
found = False
for element in doc.element.body.iter():
if element.tag.endswith('p'): # 段落
par = Paragraph(element, doc)
if target_title in par.text and is_heading_enhanced(par):
found = True
elif found and is_heading_enhanced(par): # 遇到新標題停止
break
elif element.tag.endswith('tbl') and found: # 表格
table = Table(element, doc)
data = [[cell.text.strip() for cell in row.cells] for row in table.rows]
target_tables.append(data)
return target_tables
實戰(zhàn)技巧詳解:
文檔元素遍歷:
- 通過 doc.element.body.iter() 直接遍歷Word文檔底層元素,確保段落和表格的順序與實際文檔一致。
- element.tag.endswith('p') 和 element.tag.endswith('tbl') 分別識別段落和表格的XML標簽。
雙重標記機制:
- found 標記:當找到目標標題后,標記為 True,開始收集后續(xù)的表格。
- 新標題終止:一旦遇到新標題(同樣滿足標題檢測條件),立即停止收集,避免誤取其他章節(jié)的表格。
數(shù)據(jù)提?。?/p>
使用列表推導式逐行提取表格內(nèi)容,cell.text.strip() 去除單元格中的多余空格。
3. 轉(zhuǎn)換Markdown:結(jié)構(gòu)化輸出
def to_markdown(table_data):
if not table_data:
return ""
headers = table_data[0]
md = f"| {' | '.join(headers)} |\n"
md += f"| {' | '.join(['---']*len(headers))} |\n"
for row in table_data[1:]:
md += f"| {' | '.join(row)} |\n"
return md
效果示例:
| 用戶角色 | 創(chuàng)建權(quán)限 | 刪除權(quán)限 | 修改權(quán)限 |
|----------|----------|----------|----------|
| 管理員 | 是 | 是 | 是 |
| 普通用戶 | 否 | 否 | 是 |
細節(jié)說明:
表頭與分隔符:第一行數(shù)據(jù)作為表頭,用 --- 分隔表頭與數(shù)據(jù)行。
空表格處理:如果輸入表格為空,直接返回空字符串,避免錯誤。
兼容性:適用于大多數(shù)表格,但若表格包含合并單元格,需額外處理(見后續(xù)優(yōu)化建議)。
第三步:調(diào)用代碼(5分鐘上手)
def main():
doc_path = "需求文檔_v2.0.docx" # 替換為你的文檔路徑
target_title = "功能權(quán)限矩陣" # 替換為目標標題
# 提取表格
tables = get_tables_under_heading(doc_path, target_title)
# 輸出Markdown
for idx, table in enumerate(tables, 1):
print(f"--- 表格{idx} ---\n")
print(to_markdown(table))
print("\n-------------------\n")
if __name__ == "__main__":
main()
執(zhí)行步驟:
- 將代碼保存為 extract_tables.py。
- 修改 doc_path 和 target_title 為實際文檔路徑和標題。
- 運行 python extract_tables.py,即可在控制臺看到Markdown格式的表格。
三、常見問題與解決方案
Q1:檢測不到標題
可能原因:
- 標題樣式名稱不符合 標題 或 heading 關(guān)鍵詞。
- 標題字體大小或加粗格式未達標。
解決方案:
1.檢查標題樣式:
- 在Word中右鍵標題段落 → 選擇「段落樣式」,確認樣式名稱是否包含關(guān)鍵詞。
- 例如:將樣式改為「標題 1」或「Heading 2」。
2.手動調(diào)整格式判斷:
# 在 is_heading_enhanced 中,降低字體大小要求 return (font.size.pt >= 12 and font.bold) if font.size else False
Q2:表格提取不完整
可能原因:
- 表格與標題不在同一章節(jié),中間有其他標題阻隔。
- 文檔中存在多個同名標題,代碼只提取第一個。
解決方案:
強制遍歷所有表格:
# 移除遇到新標題停止的邏輯 # 刪除以下代碼: elif found and is_heading_enhanced(par): break
精確匹配標題:
如果標題文本唯一,可直接使用 par.text.strip() == target_title 完全匹配。
Q3:Markdown格式混亂
可能原因:
單元格內(nèi)容包含換行符或特殊符號。
解決方案:
清理數(shù)據(jù):
# 在提取單元格時去除換行符
cell.text.strip().replace('\n', ' ')
手動調(diào)整:
將輸出結(jié)果復制到Markdown編輯器(如Typora),通過可視化界面調(diào)整格式。
四、真實場景應(yīng)用案例
場景1:生成接口測試用例
# 提取"接口參數(shù)表"后,直接生成測試用例模板
table_data = get_tables_under_heading("接口文檔.docx", "接口參數(shù)表")[0]
for row in table_data[1:]:
param, type_, example = row
print(f"測試點:{param}參數(shù)為{example}時,接口應(yīng)返回{type_}類型")
輸出示例:
測試點:user_id參數(shù)為123時,接口應(yīng)返回int類型
測試點:username參數(shù)為"admin"時,接口應(yīng)返回str類型
場景2:自動化測試數(shù)據(jù)生成
# 將表格數(shù)據(jù)寫入CSV文件供測試框架讀取
import csv
tables = get_tables_under_heading("測試數(shù)據(jù).docx", "登錄用例數(shù)據(jù)")
with open("test_data.csv", "w", newline="") as f:
writer = csv.writer(f)
for table in tables:
writer.writerows(table)
五、代碼擴展與優(yōu)化建議
1. 支持多級標題
def get_tables_under_heading(doc_path, target_title, level=1):
# 新增參數(shù):level表示標題層級(如1級標題)
# 在is_heading_enhanced中增加層級判斷
if f"heading{level}" in style_name:
return True
2. 處理合并單元格
def extract_cell(cell):
# 處理合并單元格時的空值
if cell.text.strip():
return cell.text.strip()
else:
return "[合并單元格]"
3. 日志記錄與錯誤提示
import logging
logging.basicConfig(level=logging.INFO)
def main():
try:
tables = get_tables_under_heading(...)
except FileNotFoundError:
logging.error("文檔路徑錯誤,請檢查文件是否存在!")
六、總結(jié)
通過這套方案,你可以:
- 快速定位文檔中指定標題的表格
- 自動化輸出結(jié)構(gòu)化Markdown數(shù)據(jù)
- 無縫對接測試用例生成、自動化測試腳本等下游流程
立即嘗試:
- 將代碼保存為extract_tables.py。
- 替換文檔路徑和標題。
- 運行代碼,查看輸出結(jié)果。
以上就是Python實現(xiàn)快速提取Word表格并轉(zhuǎn)Markdown的詳細內(nèi)容,更多關(guān)于Python提取Word轉(zhuǎn)Markdown的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python+imbox庫實現(xiàn)郵件讀取與刪除和附件下載
這篇文章主要為大家詳細介紹了Python如何使用imbox庫實現(xiàn)郵件讀取與刪除以及附件下載,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2025-02-02
Python使用Appium實現(xiàn)自動化操作手機入門教學
Appium作為一個開源的移動應(yīng)用自動化測試框架,支持多種編程語言,包括Python、Java、Ruby等,本文將詳細介紹如何使用Python和Appium來操作手機,需要的可以了解下2025-10-10
在Qt中正確的設(shè)置窗體的背景圖片的幾種方法總結(jié)
今天小編就為大家分享一篇在Qt中正確的設(shè)置窗體的背景圖片的幾種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
selenium2.0中常用的python函數(shù)匯總
這篇文章主要介紹了selenium2.0中常用的python函數(shù),總結(jié)分析了selenium2.0中常用的python函數(shù)的功能、原理與基本用法,需要的朋友可以參考下2019-08-08
pytorch 運行一段時間后出現(xiàn)GPU OOM的問題
這篇文章主要介紹了pytorch 運行一段時間后出現(xiàn)GPU OOM的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

