在日常辦公中,Word 表格中常出現重復的“供應商名稱”或“物料編碼”,會導致表格冗余且視覺混亂。這時候,用 Python 自動合并重復單元格可以大幅提升表格專業度和可讀性。本篇給大家演示如何用
python-docx
實現該功能。
? 功能概覽
-
自動讀取 Word 文件中的第一個表格;
-
檢測指定列中連續重復的單元格;
-
合并重復項所在區域,留下首行內容;
-
最終覆蓋內容并保存至新文檔。
🛠? 核心函數:Merge_cells
這個函數可以實現按照列 index 合并 Word 表格中重復值連續區域:
def Merge_cells(table, target_list, start_row, col):"""table : docx Table 對象(目標表格)target_list : 待處理列值列表,按行順序提取start_row : 數據開始行,標題行除外,0 為第一行col : 待合并列的列索引(0 起始)"""start = end = 0reference = target_list[0]for i in range(len(target_list)):if target_list[i] != reference:reference = target_list[i]end = i - 1table.cell(start + start_row, col).merge(table.cell(end + start_row, col))start = end + 1if i == len(target_list) - 1:end = itable.cell(start + start_row, col).merge(table.cell(end + start_row, col))
-
利用雙指針
start
和end
識別連續相同內容; -
cell(...).merge(...)
方法實現合并; -
該方法底層調用的是 python-docx 提供的
[Cell].merge()
方法 github.com+5python-docx.readthedocs.io+5stackoverflow.com+5。
?
🔄 完整流程:讀取、合并、覆蓋、保存?
from docx import Documentdoc = Document("收貨記錄.docx")
table = doc.tables[0]# 提取列數據
supplier = [table.rows[i].cells[1].text for i in range(1, len(table.rows)-1)]
pn = [table.rows[i].cells[2].text for i in range(1, len(table.rows)-1)]# 合并單元格
Merge_cells(table, supplier, start_row=1, col=1)
Merge_cells(table, pn, start_row=1, col=2)# 重寫覆蓋內容以消除合并后空白
for i, row in enumerate(range(1, len(supplier)+1), start=1):table.cell(row, 1).text = supplier[i-1]table.cell(row, 2).text = pn[i-1]doc.save("收貨記錄-合并單元格.docx")
-
table.rows
訪問所有行; -
合并執行后,其他重復行內容清空,因此要覆蓋填值;
-
最終生成文件名帶“合并單元格”的新文檔。
🖼? 結果展示區
?
?
?? 技術詳解 & 注意事項
-
合并操作只保留左上單元內容,其他單元秒變空白但保留格式;
-
python-docx 的
Cell.merge()
接受兩個對角單元格,自動合并區域中所有 cells python-docx.readthedocs.io; -
Word 表格支持跨行/跨列合并,
merge()
方法基于布局網格處理; -
處理完成后務必覆蓋空白單元格,否則部分數據會丟失;
-
可擴展到任意列,只需按
col
參數調用函數。
🧠 總結
功能 | 描述 |
---|---|
自動合并 | 自動識別并合并 Word 表格列中連續重復值 |
覆蓋數據 | 合并后補寫內容,防止空白單元格產生 |
靈活調用 | 可應用于任意列和場景,支持多列多表操作 |
這段代碼適用于多情境,如“收貨記錄”“發票匯總”“項目進度表”,省時、高效、美觀。如需支持列樣式統一、支持拆分合并、或加入 progress bar 等功能,都可以繼續擴展和完善,有需要的話隨時告訴我!
?