Python使用openpyxl正确读取Excel合并单元格值的方法

听雨眠
听雨眠
发布时间:2026-10-14| 4人浏览过
原创

本文介绍如何利用Python的openpyxl库正确读取Excel中的合并单元格值。直接访问非左上角单元格会返回None,通过判断MergedCell类型并遍历merged_cell_ranges属性,可定位合并区域左上角单元格,从而获取正确的显示值。

问题描述:

假设在test.xlsx文件的“Sheet1”工作表中,A1至D3区域的数值分布如下:

目标是编写一个函数,接收指定的行号、列号以及对应的工作表对象作为参数,能够准确解析合并单元格,并返回指定坐标单元格的实际值。

若直接使用行列坐标获取单元格值,对于合并单元格中非左上角的单元格,openpyxl默认会返回None,示例如下:


if __name__ == "__main__":
    wb = xl.load_workbook("test.xlsx")
    sheet_ = wb["Sheet1"]
    print(sheet_["A1"].value)  # 1
    print(sheet_["A2"].value)  # None
    print(sheet_["D1"].value)  # 8
    print(sheet_["D2"].value)  # None
    print(sheet_["D3"].value)  # None

解决思路:

在获取到目标单元格后,首先判断其是否为合并单元格。如果是,则需要找到该单元格所属的整个合并区域,并提取该区域左上角单元格的值作为最终结果返回。

利用sheet.merged_cell_ranges属性,可以获取当前工作表中所有合并区域的列表:

测试代码:


if __name__ == "__main__":
    wb = xl.load_workbook("test.xlsx")
    sheet_ = wb["Sheet1"]
    merged_ranges = sheet_.merged_cell_ranges  # 获取当前工作表的所有合并区域列表
    for merged_range in merged_ranges:
        print(type(merged_range))  # 打印区域对象类型
        print(merged_range)  # 打印区域

运行结果如下:

查阅openpyxl.worksheet.merge.MergedCellRange的源码可知,该类定义了__contains__方法(支持in操作符),因此可以直接通过in关键字判断某个坐标是否位于指定的合并区域内。

至此,我们已具备获取合并单元格正确值的核心条件。

完整实现代码如下:


import openpyxl as xl
from openpyxl.worksheet.worksheet import Worksheet
from openpyxl.cell import MergedCell


def parser_merged_cell(sheet: Worksheet, row, col):
    """
    检查是否为合并单元格并获取对应行列单元格的值。
    如果是合并单元格,则取合并区域左上角单元格的值作为当前单元格的值,否则直接返回该单元格的值
    :param sheet: 当前工作表对象
    :param row: 需要获取的单元格所在行
    :param col: 需要获取的单元格所在列
    :return: 
    """
    cell = sheet.cell(row=row, column=col)
    if isinstance(cell, MergedCell):  # 判断该单元格是否为合并单元格
        for merged_range in sheet.merged_cell_ranges:  # 循环查找该单元格所属的合并区域
            if cell.coordinate in merged_range:
                # 获取合并区域左上角的单元格作为该单元格的值返回
                cell = sheet.cell(row=merged_range.min_row, column=merged_range.min_col)
                break
    return cell


if __name__ == "__main__":
    wb = xl.load_workbook("test.xlsx")
    sheet_ = wb["Sheet1"]

    for row_index in range(1, 4):
        for col_index in range(1, 5):
            cell_ = parser_merged_cell(sheet_, row_index, col_index)
            print("第%s行第%s列:%s" % (row_index, col_index, cell_.value))

最终输出结果如下:

第1行第1列:1 第1行第2列:2 第1行第3列:3 第1行第4列:8 第2行第1列:1 第2行第2列:4 第2行第3列:5 第2行第4列:8 第3行第1列:6 第3行第2列:7 第3行第3列:7 第3行第4列:8

以上就是关于Python使用openpyxl读取合并单元格值的详细介绍,更多相关Python openpyxl读取合并单元格的内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。