You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:32:51