使用ExcelWriter追加DataFrame至Excel时遇MergedCell只读属性错误
解决
AttributeError: 'MergedCell' object attribute 'value' is read-only错误 错误原因
你使用overlay模式追加DataFrame时,pandas默认从工作表的A1单元格开始写入,而目标工作表"DR Sheet"中存在合并单元格。openpyxl对合并单元格的value属性做了只读限制,无法直接覆盖修改,因此触发该错误。
解决方案
1. 定位工作表中的合并单元格
先运行以下脚本,找出"DR Sheet"里所有合并单元格的位置,确认哪些区域不能被写入:
from openpyxl import load_workbook wb = load_workbook('finaldr.xlsx') ws = wb['DR Sheet'] # 输出所有合并单元格的坐标范围 for merged_range in ws.merged_cells.ranges: print(f"合并单元格范围: {merged_range.coord}")
2. 正确追加数据到已有数据下方
修改原代码的追加逻辑,先获取工作表中已有数据的最后一行,从下一行开始写入,避开合并单元格区域(通常合并单元格在表头):
import pandas as pd from openpyxl import load_workbook # 原DataFrame处理逻辑保持不变 poam = pd.read_excel('finalpoam.xlsm', header = 4) new_poam = poam[["POAM ID", "Weakness Source Identifier", "Asset Identifier", "Weakness Name", "Weakness Detector Source", "Original Risk Rating", "Original Detection Date", "Weakness Description", "Overall Remediation Plan", "False Positive"]] oracle = "oracle mysql" sev = "moderate" false = "No" filename = "finaldr.xlsx" oracle_df = new_poam[new_poam['Weakness Name'].str.contains(oracle, case=False, na=False)] moderate_df = oracle_df[oracle_df['Original Risk Rating'].str.contains(sev, case=False, na=False)] false_df = moderate_df[moderate_df['False Positive'].str.contains(false, case=False, na=False)] final_df = false_df.drop(labels=range(783, 788), axis=0) final_df = final_df.drop(columns="False Positive") # 修改后的追加逻辑 wb = load_workbook(filename) ws = wb['DR Sheet'] # 获取已有数据的最后一行行号(openpyxl行号从1开始) last_row = ws.max_row with pd.ExcelWriter(filename, mode="a", engine="openpyxl", if_sheet_exists="overlay") as writer: # 设置startrow为last_row,从已有数据的下一行开始写入 final_df.to_excel(writer, sheet_name="DR Sheet", header=None, startrow=last_row, index=False)
额外注意事项
- 确保
final_df的列数和"DR Sheet"中的数据列数一致,避免列对齐错误导致写入到合并单元格区域。 - 如果表头的合并单元格范围较大,可手动调整
startrow的值(比如表头占了前3行,就设置startrow=4)。
内容的提问来源于stack exchange,提问作者Legion_of_boom__
相关产品推荐
相关产品推荐

