You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Openpyxl实现列中连续行单元格等值合并(非拼接)

解决方法

首先修正你代码中的基础错误,然后实现连续相同值单元格的合并逻辑:

完整代码

from openpyxl import load_workbook

def merge_consecutive_same_values(sheet, column_letter):
    max_row = sheet.max_row
    if max_row < 2:
        return  # 少于两行无需合并
    
    start_row = 1  # 初始化为第一行
    
    for row in range(2, max_row + 1):
        current_cell = sheet[f'{column_letter}{row}']
        prev_cell = sheet[f'{column_letter}{row-1}']
        
        # 检查当前单元格与前一个单元格值是否相等(排除空值情况,可根据需求调整)
        if current_cell.value == prev_cell.value and current_cell.value is not None:
            continue
        else:
            # 如果起始行和当前前一行不是同一行,说明有连续相同值需要合并
            if start_row < row - 1:
                sheet.merge_cells(f'{column_letter}{start_row}:{column_letter}{row-1}')
            # 更新起始行为当前行,开始新的分组
            start_row = row
    
    # 处理最后一组连续相同值
    if start_row < max_row:
        sheet.merge_cells(f'{column_letter}{start_row}:{column_letter}{max_row}')

# 加载工作簿并执行合并
wb = load_workbook('input.xlsx')
ws = wb.active
merge_consecutive_same_values(ws, 'I')

# 保存修改后的文件
wb.save('output.xlsx')

关键逻辑说明

  • 单元格定位:使用sheet[f'{column_letter}{row}']的格式直接通过列字母+行号获取单元格,比如ws['I2']对应第I列第2行的单元格。
  • 连续值追踪:用start_row记录当前连续相同值的起始行,遍历每一行时对比当前单元格与前一行的值:
    • 若值相同,继续遍历;
    • 若值不同,合并从start_row到当前行的前一行的范围(如果范围大于1个单元格),然后更新start_row为当前行。
  • 合并单元格:调用sheet.merge_cells(range_string)方法,传入类似'I1:I3'的范围字符串即可合并指定区域的单元格,合并后仅保留区域左上角的单元格值。

注意事项

  • 代码中排除了空值的合并,如果你需要合并连续的空单元格,可以去掉and current_cell.value is not None的判断。
  • 处理完后要调用wb.save()保存修改,否则不会生效。
  • 如果你的表格有表头,可将start_row初始化为2,循环从3开始,避免合并表头。

内容的提问来源于stack exchange,提问作者Goozmaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:05:47