Python使用openpyxl正确读取Excel合并单元格值的方法
本文介绍如何利用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读取合并单元格的内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









