如何使用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
相关产品推荐
相关产品推荐

