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

如何使用Openpyxl获取合并单元格值并填充至所有合并对应位置

解决Openpyxl合并单元格值填充到所有对应位置的方案

Openpyxl读取Excel时,合并单元格的实际值仅存储在合并区域的左上角单元格,区域内其他单元格取值均为None,要实现合并值填充到所有对应位置,需要先遍历所有合并单元格区域,再批量赋值。

原场景信息

源表格

源表格

现有代码问题

原有代码仅逐单元格读取赋值,没有处理合并单元格的空值情况,得到的输出结果如下:
当前输出结果

期望输出效果

需要将合并单元格的取值按合并范围填充到每一个对应位置,效果如下:
期望输出结果

修正后的实现代码

from openpyxl import load_workbook
from openpyxl import Workbook

# 加载源工作簿和工作表
wb = load_workbook("你的源文件路径.xlsx")
source_sheet = wb.active
# 新建目标工作表
new_wb = Workbook()
new_sheet = new_wb.active

# 第一步:预处理源表合并单元格,把值填充到合并区域的所有单元格
for merged_range in source_sheet.merged_cells.ranges:
    # 取合并区域左上角的存储值
    merged_value = source_sheet.cell(row=merged_range.min_row, column=merged_range.min_col).value
    # 遍历合并区域内所有单元格,统一赋值
    for row in range(merged_range.min_row, merged_range.max_row + 1):
        for col in range(merged_range.min_col, merged_range.max_col + 1):
            source_sheet.cell(row=row, column=col).value = merged_value

# 第二步:逐行逐列复制处理后的值到新表
max_row = source_sheet.max_row
max_col = source_sheet.max_column
for i in range(1, max_row + 1):
    for j in range(1, max_col + 1):
        new_sheet.cell(row=i, column=j).value = source_sheet.cell(row=i, column=j).value

# 保存输出文件
new_wb.save("你的输出文件路径.xlsx")

逻辑说明

  • 提前遍历源表所有合并单元格区域,将合并区域的每一个单元格都填充为左上角的取值,从根源解决合并单元格取值为空的问题
  • 后续复制数据时不需要额外判断,直接逐单元格读取赋值即可得到期望的填充效果
  • 如果不需要保留新表的合并格式,可在处理完值填充后调用source_sheet.unmerge_cells(str(merged_range))方法解除源表的合并状态,再复制到新表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:09:05