使用pandas和openpyxl追加Excel数据时遇AttributeError错误
解决AttributeError: 'OpenpyxlWriter' object has no setter for property 'book'
问题原因
在pandas 2.0+版本中,使用pd.ExcelWriter的mode='a'(追加模式)时,框架会自动加载目标Excel文件的工作簿,不再允许手动设置writer.book属性——该属性已改为只读,因此直接赋值会触发上述错误。此外你的代码中openpyxl.load_workbook的参数格式也存在错误。
修正方案
- 删除手动设置
writer.book = book的代码:pandas会自动处理工作簿加载 - 修正
openpyxl.load_workbook的参数位置:data_only=True是函数参数,不应放在format的占位符里 - 确保
if_sheet_exists='overlay'参数正确生效:该参数会让新数据覆盖工作表中已有内容的对应单元格,实现追加/更新效果
修正后的代码片段
# 修正load_workbook的参数格式 book = openpyxl.load_workbook( r'D:\Anto\Daily Work\Daily Reservoir Level\August\Plotting\Excel\{}.xlsx'.format(my_list[j]), data_only=True ) # 初始化ExcelWriter,无需手动设置book writer = pd.ExcelWriter( r'D:\Anto\Daily Work\Daily Reservoir Level\August\Plotting\Excel\{}.xlsx'.format(my_list[j]), engine='openpyxl', mode='a', if_sheet_exists='overlay' ) # 后续写入数据的示例(替换为你的实际数据写入逻辑) df.to_excel(writer, sheet_name='目标工作表名', index=False) # 务必保存并关闭writer writer.close()
额外说明
- 旧代码能运行是因为pandas旧版本允许手动设置
book属性,但2.0+版本重构了ExcelWriter的逻辑,废弃了该写法 - 使用
mode='a'时,若目标文件不存在,pandas会自动创建;若存在则加载已有工作簿 if_sheet_exists='overlay'适合在已有工作表中更新数据,若要新增工作表可改为if_sheet_exists='new'
内容的提问来源于stack exchange,提问作者anto majo
相关产品推荐
相关产品推荐

