You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用openpyxl的load_workbook读取含合并单元格的Excel时,如何统一填充合并单元格的值

使用openpyxl的load_workbook读取含合并单元格的Excel时,如何统一填充合并单元格的值

我来帮你搞定这个问题~ 你遇到的情况很常见:用openpyxl读取带合并单元格的Excel时,合并区域只有左上角的单元格会保留原始值,其他被合并的单元格都会返回NaNNone。要让所有合并单元格都显示同一个值,我们只需要先批量处理这些合并区域,把左上角的值填充到整个区域里就行。

下面是修改后的完整代码,我会在代码里加注释说明关键步骤:

import pandas as pd
from openpyxl import load_workbook

workbook = load_workbook("example.xlsx", data_only=True)
sheet = workbook.active

# 关键步骤:遍历所有合并单元格区域,统一填充值
for merged_range in sheet.merged_cells.ranges:
    # 获取合并区域左上角的单元格值(这是合并单元格的真实值)
    top_left_value = sheet.cell(merged_range.min_row, merged_range.min_col).value
    # 遍历合并区域内的每一行每一列,把值批量填进去
    for row_num in range(merged_range.min_row, merged_range.max_row + 1):
        for col_num in range(merged_range.min_col, merged_range.max_col + 1):
            sheet.cell(row=row_num, column=col_num, value=top_left_value)
    # 可选操作:取消合并单元格(如果之后不需要保留Excel合并格式的话,不取消也不影响值的填充)
    sheet.unmerge_cells(str(merged_range))

# 简化版的DataFrame构建(比原来的np初始化写法更简洁)
data = []
for row in sheet.iter_rows(values_only=True):
    data.append(list(row))
df = pd.DataFrame(data, index=range(1, len(data)+1), columns=range(1, len(data[0])+1))

print(df)

运行这段代码后,就能得到你想要的输出:

1       2            3           4           5
1  merged  merged  long_merged long_merged long_merged
2       1     4.0            A         NaN         NaN
3       2     5.0            B         NaN         NaN
4       3     NaN         None         NaN         NaN

补充说明:

  • sheet.merged_cells.ranges会返回工作表中所有合并单元格的区域对象,每个对象包含min_row/max_row/min_col/max_col属性,帮我们精准定位整个合并范围。
  • values_only=Trueiter_rows可以直接拿到单元格的值,不用逐个访问cell.value,代码更简洁高效。
  • 取消合并单元格是可选操作——如果之后需要保留原Excel的合并格式,删掉这一行即可,完全不影响DataFrame的结果。

备注:内容来源于stack exchange,提问作者Quinten

火山引擎 最新活动