在办公中,我们经常需要将 相同行或相同数据 在 Excel 中合并成一个大单元格(如客户名、产品编码等重复内容),提高视觉体验、减少冗余。虽然 Excel 自带“合并单元格”功能,但当数据量大时,手动操作非常低效,Python 自动处理就是最佳方案。
如下图:
✅ 功能概要
针对某一列,自动检测从指定行开始的连续重复数据;
合并这些连续的单元格区间,提升数据可读性;
支持对多列同时批量处理,保留表头不参与操作。
成果展示:
🧩 合并函数详细解释
下面提供一个通用函数 Merge_cells
,用于实现合并单元格逻辑。
def Merge_cells(ws, target_list, start_row, col):
"""
ws : openpyxl 工作表对象
target_list : 待处理的列表(如客户名列表),按行顺序提供
start_row : 表中数据起始行(跳过表头)
col : 目标列的列字母,比如 "B"
"""
start = end = 0
reference = target_list[0]
for i in range(len(target_list)):
# 当数据变化或到达最后一行时,执行合并动作
if target_list[i] != reference or i == len(target_list) - 1:
reference = target_list[i]
end = i - 1 if target_list[i] != reference else i
# 合并对应的单元格区域
ws.merge_cells(f"{col}{start + start_row}:{col}{end + start_row}")
start = end + 1
遍历
target_list
,记录重复数据的起止行索引;当检测到新值或遍历结束时,利用
merge_cells()
合并对应区域;合并逻辑通用,可用于任意指定列。
该方法背后调用的是 openpyxl.Worksheet.merge_cells(...)
,它支持如下两种方式:
ws.merge_cells('A2:D2')
# 或者使用参数形式:
ws.merge_cells(start_row=2, start_column=1, end_row=2, end_column=4)
这是 openpyxl 官方文档中明确支持的用法 topcoder.com+9openpyxl.readthedocs.io+9openpyxl.readthedocs.io+9topcoder.com+5media.readthedocs.org+5openpyxl.readthedocs.io+5。
⚙️ 整体处理逻辑
结合上面的函数,我们可以批量处理单个或多个工作表:
from openpyxl import load_workbook
wb = load_workbook('产品清单.xlsx')
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
customer_list, pn_list = [], []
for row in range(6, ws.max_row - 2):
customer_list.append(ws[f'B{row}'].value)
pn_list.append(ws[f'C{row}'].value)
Merge_cells(ws, customer_list, start_row=6, col="B")
Merge_cells(ws, pn_list, start_row=6, col="C")
wb.save("产品清单-合并单元.xlsx")
从第 6 行开始读取 B、C 列内容到两个列表;
依次调用
Merge_cells
对客户和产品编码列进行合并;最后保存带有合并单元格的 Excel 文件。
🧠 合并注意事项
merge_cells()
会保留最左上角单元格的内容,其他单元格会被清空但保留格式 ;多列合并需分别处理,确保列数据顺序一致;
若存在跨工作表不同起始行或列需求,只需调整
start_row
和col
参数即可重用该函数;合并后若需单元格样式统一,可读取 top-left 单元格属性,并在代码中统一设置。
更多实用案例,代码,素材如下:
自取链接:https://pan.quark.cn/s/a46f30accea2
✅ 总结
提供了可复用性强的 合并函数
Merge_cells
;利用
openpyxl.merge_cells()
实现批量合并;可扩展至多列、多表处理,适配复杂场景;
是处理重复内容、提高表格可读性的好帮手。
如果你有更多列需要合并,或想添加样式统一、支持单元格拆分(unmerge_cells
),也可以继续告诉我,我可以帮你完善这个功能并生成系列博客文章!