使用Pandas向现有Excel新增工作表时遇文件损坏及报错问题
问题与解决方案
问题描述
编写了一个函数用于将DataFrame保存为现有Excel文件中的新工作表,代码如下:
def saveToExcel(data, excelFile, sheetName): book = load_workbook(excelFile) writer = pd.ExcelWriter(excelFile, engine = 'openpyxl') writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) data.to_excel(writer, index = False, sheet_name = sheetName, float_format='%.2f') writer.save()
其中data为DataFrame,excelFile为文件路径,sheetName为工作表名称。运行时先出现"File is not a zip file"错误,排查后发现文件已损坏,根源是执行writer.sheets = dict((ws.title, ws) for ws in book.worksheets)时出现"can't set attribute"错误。
解决方案
1. 修复"can't set attribute"错误
新版本pandas中,ExcelWriter.sheets已变为只读属性,无法直接赋值。需将原赋值语句替换为update()方法同步现有工作表。
2. 修正后的完整函数
from openpyxl import load_workbook import pandas as pd def saveToExcel(data, excelFile, sheetName): # 加载现有工作簿 book = load_workbook(excelFile) # 用追加模式初始化ExcelWriter,指定引擎及工作表存在时的处理逻辑 writer = pd.ExcelWriter( excelFile, engine='openpyxl', mode='a', if_sheet_exists='replace' # 可选:存在则替换,也可设为'error'/'new' ) # 关联已加载的工作簿 writer.book = book # 同步现有工作表到writer,替换原直接赋值语句 writer.sheets.update({ws.title: ws for ws in book.worksheets}) # 将DataFrame写入指定工作表 data.to_excel(writer, index=False, sheet_name=sheetName, float_format='%.2f') # 关闭writer完成保存,替代已弃用的save()方法 writer.close()
3. 关键说明
- 使用
mode='a'(追加模式)配合openpyxl引擎,确保原有Excel内容不被覆盖 - 用
writer.sheets.update()替代直接赋值,适配pandas新版本的只读属性限制 - 改用
writer.close()替代writer.save(),save()在pandas 1.4.0+已被弃用,close()会自动处理保存和资源释放 if_sheet_exists参数可按需调整:replace替换现有工作表、error抛出错误、new创建带后缀的新工作表
4. 解决"File is not a zip file"错误
该错误是之前代码报错导致Excel文件结构损坏(Excel本质是ZIP压缩包)。需删除损坏文件,使用原始正常的Excel文件重新运行修正后的代码。
内容的提问来源于stack exchange,提问作者chintan s
相关产品推荐
相关产品推荐

