在日常办公中,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 = 0
reference = target_list[0]
for i in range(len(target_list)):
if target_list[i] != reference:
reference = target_list[i]
end = i - 1
table.cell(start + start_row, col).merge(table.cell(end + start_row, col))
start = end + 1
if i == len(target_list) - 1:
end = i
table.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 Document
doc = 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 等功能,都可以继续扩展和完善,有需要的话随时告诉我!