使用Pandas+OpenPyXL写入Excel时部分工作表报'Merged Cell'对象属性'value'只读错误的排查求助
Pandas+OpenPyXL写入Excel时部分工作表报'Merged Cell'对象属性'value'只读错误的排查求助
问题背景
我现在在给老板写一个Python工具,功能是从一份Excel排班表里读取数据,然后把工时写入员工的考勤表(也是Excel文件)。老板要求必须保留考勤表里的原有函数和格式,所以我用Pandas来匹配日期,再用openpyxl引擎的ExcelWriter以追加覆盖的方式写入。
测试用随机生成的Excel文件时完全正常,但一用到真实的员工考勤表就触发错误:
'Merged Cell' object attribute 'value' is read only
这是我第一次写这类数据写入Excel的工具,肯定有不少疏漏,但只要解决这个问题就能赶上下周的截止日期了😭。
奇怪的现象细节
我做了很多测试,发现这个错误的触发非常有针对性:
- 仅在部分工作表出现,同一个工作簿里的不同工作表表现不一致——比如"JAN 2026"工作表完全正常,但切换到"FEB 2026"就会立刻报错
- 报错只发生在写入数据的步骤,读取数据的过程没有任何问题
- 测试用的空白/简单结构Excel表从未出现过这个错误
我的代码片段
核心逻辑是:读取目标工作表(跳过前5行表头),遍历排班数据workData,匹配每行第一列的日期,找到后把对应工时写入第8列("Expected work hours"列,索引为7),最后覆盖原工作表:
import pandas as pd # 读取目标工作表,跳过前5行表头 df = pd.read_excel(filePath, sheet_name=worksheetName, skiprows=5) # 遍历排班数据,匹配日期并写入工时 for item in workData: for row in range(0, len(df)): excelDate = df.iat[row, 0] if excelDate == item["date"]: # 写入到第8列(索引7):Expected work hours df.iat[row, 7] = item["hours"] break # 以追加覆盖模式写入原Excel文件 with pd.ExcelWriter(filePath, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: df.to_excel(writer, sheet_name=worksheetName, index=False, header=False, startrow=6)
我已经尝试过的方案(均无效)
- 检查了报错工作表的合并单元格,尝试手动取消部分合并后重新测试,仍然报错
- 更换过
openpyxl的版本(从3.0.9升到3.1.2),问题依旧 - 尝试用
df.loc代替df.iat来修改数据,还是触发同样的只读错误
求助问题
想请教各位大佬:
- 为什么同一个工作簿里有的工作表正常,有的却触发合并单元格只读错误?
- 我的代码逻辑哪里有问题?应该怎么修改才能避免这个错误?
- 有没有办法在完全保留原有Excel函数、格式、合并单元格结构的前提下,安全地写入数据?




