使用openpyxl写入Excel遇合并单元格报错:MergedCell值只读
解决openpyxl写入合并单元格时的
AttributeError: 'MergedCell' object attribute 'value' is read-only错误 错误原因
合并单元格区域中,除左上角的主单元格外,其余单元格都会被转换为MergedCell对象,这类对象的value属性是只读的。你的代码在检查已合并的单元格时,直接访问了MergedCell的value属性,从而触发了只读限制的报错。
问题分析
你的代码逻辑是先写入第一行数据,再循环处理每个条目:检查目标行的指定列范围是否为空,无数据则合并单元格并写入内容。但处理第二个条目["Entry 2", 2, 6]时,第2行的2-5列已经被第一个条目合并为MergedCell,此时访问ws.cell(row=2, column=2).value就会触发错误。
解决方案
修正思路是在检查单元格值之前,先判断该单元格是否为MergedCell类型,若是则跳过(合并区域的占用状态由主单元格决定),只检查普通单元格或合并区域的主单元格。
修正后的代码
from openpyxl import Workbook from openpyxl.cell.cell import MergedCell wb = Workbook() ws = wb.active # 写入第一行1-19的数字 for x in range(1, 20): ws.cell(row=1, column=x).value = x entries = [["Entry 1", 1, 5], ["Entry 2", 2, 6], ["Entry 3", 3, 7]] for entry in entries: target_row = None # 检查第2到4行是否可用 for count_row in range(2, 5): row_available = True for count_col in range(entry[1], entry[2]+1): cell = ws.cell(row=count_row, column=count_col) # 跳过合并单元格,仅检查普通单元格 if isinstance(cell, MergedCell): continue # 若普通单元格有值,标记该行不可用 if cell.value is not None: row_available = False break if row_available: target_row = count_row break # 合并目标单元格并写入内容 ws.merge_cells(start_row=target_row, start_column=entry[1], end_row=target_row, end_column=entry[2]) ws.cell(row=target_row, column=entry[1]).value = entry[0] wb.save("Test.xlsx")
关键修改点
- 导入
MergedCell类用于类型判断 - 检查单元格时跳过
MergedCell,避免访问只读的value属性 - 优化变量命名,让逻辑更清晰
内容的提问来源于stack exchange,提问作者Lorina
相关产品推荐
相关产品推荐

