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

使用Openpyxl向已有工作簿写入时原有工作表丢失问题求助

问题排查与修复

核心问题分析

你的代码存在两个关键问题导致原有工作表丢失:

  1. 初始化pd.ExcelWriter时,未将已有工作簿的工作表同步到writer的sheets属性中,pandas无法识别原有工作表,最终保存时只保留新写入的表。
  2. 存在冗余操作:手动创建工作表后又调用df.to_excel,两者功能重复,且手动创建的表会被to_excel覆盖,同时干扰原有表的保留逻辑。

另外,代码中遗漏了import os语句,会导致os.path.isfile调用报错。

修复后的代码

import os
import pandas as pd
from openpyxl import load_workbook, Workbook


def write_resolution(df, file_name, sheet_name):
    # 处理文件存在/不存在的情况
    if os.path.isfile(file_name):
        workbook = load_workbook(file_name)
        # 初始化writer时指定追加模式,同时处理重复工作表的替换
        writer = pd.ExcelWriter(file_name, engine='openpyxl', mode='a', if_sheet_exists='replace')
    else:
        workbook = Workbook()
        writer = pd.ExcelWriter(file_name, engine='openpyxl')
        writer.workbook = workbook

    # 将现有工作表同步到writer的sheets属性,确保原有表不丢失
    writer.sheets = {ws.title: ws for ws in workbook.worksheets}

    # 写入数据到指定工作表
    df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    # 保存并关闭writer(无需单独调用workbook.save)
    writer.close()

关键修改说明

  • 添加import os语句,修复文件判断的依赖问题。
  • 当文件存在时,使用mode='a'和if_sheet_exists='replace'初始化ExcelWriter,明确追加模式并自动处理重复工作表的替换。
  • 新增writer.sheets = {ws.title: ws for ws in workbook.worksheets},将已有工作表同步到writer,确保保存时不会丢失原有内容。
  • 移除冗余的手动创建工作表和设置active的代码,df.to_excel会自动完成工作表的创建或替换。
  • 移除单独的workbook.save调用,writer.close()会自动完成保存操作,避免重复保存导致的异常。

测试验证

  1. 初始无文件时,写入sheet1:函数会创建新工作簿并写入sheet1,成功。
  2. 写入sheet2:加载已有工作簿,同步原有sheet1,写入sheet2后保存,两个工作表都会保留。

内容的提问来源于stack exchange,提问作者Ginger_Chacha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:15:12