使用Pandas ExcelWriter向现有Excel文件追加工作表时出现属性错误及文件损坏问题
解决向现有Excel文件追加工作表的AttributeError问题
看起来你遇到的核心问题是混用了不同Excel处理库的对象,以及没有正确使用支持修改现有文件的引擎。让我一步步拆解并解决:
错误原因分析
xlsxwriter引擎报错的根源:
你用openpyxl.load_workbook()加载了现有Excel文件,得到的是openpyxl的Workbook对象,但随后把它赋值给了xlsxwriter引擎的writer.book。这两个库的Workbook类是完全独立的——xlsxwriter的Workbook有add_worksheet方法,但openpyxl的没有,所以触发了AttributeError: 'Workbook' object has no attribute 'add_worksheet'。
另外要注意:xlsxwriter不支持修改现有Excel文件,它只能创建新文件,所以用它来追加工作表从一开始就行不通。openpyxl引擎报错的可能原因:
你切换到openpyxl后遇到的'str' object has no attribute 'to_tree',大概率是因为没有正确初始化ExcelWriter的工作表映射,或者使用了不支持mode='a'参数的旧版pandas(该参数在pandas 1.4.0及以上才引入)。
正确解决方案
方案1:使用新版pandas(推荐)
如果你的pandas版本≥1.4.0,直接用追加模式+openpyxl引擎就能轻松解决:
import pandas as pd from openpyxl import load_workbook file = "Budget 2021 copy.xlsx" # 用with语句自动管理writer的生命周期,避免资源泄漏 with pd.ExcelWriter( file, engine="openpyxl", mode="a", # 追加模式,保留原有内容 if_sheet_exists="replace" # 可选:如果工作表已存在则替换,也可用'error'/'new' ) as writer: df.to_excel(writer, sheet_name="Test")
方案2:兼容旧版pandas
如果你的pandas版本低于1.4.0,需要手动映射现有工作表:
import pandas as pd from openpyxl import load_workbook file = "Budget 2021 copy.xlsx" # 加载现有工作簿 book = load_workbook(file) # 初始化writer并关联现有工作簿 writer = pd.ExcelWriter(file, engine="openpyxl") writer.book = book # 手动将现有工作表映射到writer,避免覆盖原有内容 writer.sheets = {ws.title: ws for ws in book.worksheets} # 写入新工作表 df.to_excel(writer, sheet_name="Test") # 保存并关闭 writer.save() writer.close()
关键注意事项
- 永远不要混用xlsxwriter和openpyxl的Workbook对象,它们的API不兼容。
- 要修改/追加现有Excel文件,必须使用支持读写的引擎(如openpyxl),xlsxwriter仅用于创建新文件。
- 使用
with语句管理ExcelWriter可以避免你遇到的ResourceWarning资源泄漏问题。
内容的提问来源于stack exchange,提问作者Benjamin Lian
相关产品推荐
相关产品推荐

