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

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

火山引擎 最新活动