openpyxl报错:'MergedCell'对象的'value'属性只读,如何修复?
解决openpyxl修改合并单元格时的AttributeError问题
你遇到的这个AttributeError: 'MergedCell' object attribute 'value' is read-only错误,本质原因很清晰:你要写入的C1单元格是合并单元格区域的一部分,而openpyxl里合并单元格只有左上角的那个单元格是可编辑的,其他被合并进来的单元格都是MergedCell对象,它们的value属性是只读的,不能直接修改。
下面给你两种解决方案,优先推荐第一种,更高效简洁:
方案一:写入合并区域的左上角单元格
首先你需要确认C1属于哪个合并区域,你可以先在代码里加一段打印合并区域的代码,找出目标区域的左上角单元格:
import openpyxl path = "/home/karol/Dokumenty/wzor.xlsx" wb_obj = openpyxl.load_workbook(path) sheet_obj = wb_obj.active # 打印所有合并单元格区域,找到C1所在的范围 for merged_range in sheet_obj.merged_cells.ranges: print(f"合并单元格区域: {merged_range}")
运行这段代码后,你会看到类似B1:C1或者C1:D1的输出,这就是C1所在的合并区域。合并区域的左上角单元格(比如B1或者C1)才是可以写入的核心单元格,设置它的值会自动同步显示在整个合并区域里。
然后修改你的原代码,把写入C1改成写入这个左上角单元格,同时注意不要用工作表对象保存,要用工作簿对象wb_obj.save()(原代码里用sheet_obj.save()会触发另一个错误,因为工作表本身没有save方法):
import openpyxl path = "/home/karol/Dokumenty/wzor.xlsx" wb_obj = openpyxl.load_workbook(path) sheet_obj = wb_obj.active firma = input("Podaj nazwe: ") nazwa_pliku = "Protokol odczytu" filename = nazwa_pliku + firma + ".xlsx" # 替换成你找到的合并区域左上角单元格,比如如果是B1就写"B1" sheet_obj["B1"] = firma sheet_obj["D1"] = input() # 用工作簿对象执行保存操作 wb_obj.save(filename=filename)
方案二:先取消合并,修改后重新合并(不推荐,除非必要)
如果你确实需要单独修改C1的值,那可以先取消该区域的合并,修改后再重新合并,但这种方法会破坏原有的合并格式再恢复,一般情况下没必要这么做:
import openpyxl path = "/home/karol/Dokumenty/wzor.xlsx" wb_obj = openpyxl.load_workbook(path) sheet_obj = wb_obj.active # 取消C1所在的合并区域,替换成实际的区域范围 sheet_obj.unmerge_cells("B1:C1") firma = input("Podaj nazwe: ") nazwa_pliku = "Protokol odczytu" filename = nazwa_pliku + firma + ".xlsx" sheet_obj["C1"] = firma sheet_obj["D1"] = input() # 重新合并单元格(如果需要保留合并格式的话) sheet_obj.merge_cells("B1:C1") wb_obj.save(filename=filename)
总结一下,优先用方案一,找到合并区域的左上角单元格写入就可以轻松解决问题啦。
内容的提问来源于stack exchange,提问作者zumber




