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

如何将Pandas DataFrame数据追加到已有Excel工作表并解决KeyError报错

解决Pandas追加Excel数据及KeyError问题

报错原因

KeyError: "There is no item named 'xl/sharedStrings.xml' in the archive" 通常由以下情况导致:

  • 目标Excel文件是旧版.xls格式而非标准.xlsx
  • 文件损坏或由非Office工具生成的非标准xlsx格式
  • 使用了不匹配的文件读取引擎

实现数据追加的代码方案

针对Dash框架场景,你需要在处理数据生成DataFrame的回调函数中,添加以下逻辑:

1. 安装依赖库

先确保已安装所需工具库:

pip install pandas openpyxl

2. 核心追加逻辑

假设你的回调已生成待追加的new_df,添加以下代码实现追加:

import pandas as pd
from openpyxl import load_workbook

def append_to_excel(df, file_path, sheet_name='Sheet1'):
    try:
        # 加载已有工作簿,获取目标表的最后一行位置
        book = load_workbook(file_path)
        startrow = book[sheet_name].max_row
        # 以追加模式写入数据
        with pd.ExcelWriter(
            file_path,
            engine='openpyxl',
            mode='a',
            if_sheet_exists='overlay'
        ) as writer:
            df.to_excel(
                writer,
                sheet_name=sheet_name,
                startrow=startrow,
                index=False,
                header=False  # 已有表头,无需重复写入
            )
    except FileNotFoundError:
        # 文件不存在时直接创建并写入
        df.to_excel(file_path, sheet_name=sheet_name, index=False)
    except Exception as e:
        print(f"追加失败: {str(e)}")

# 在Dash回调中调用该函数
@app.callback(
    # 此处填写你的回调输入、输出定义
)
def process_and_append_data(input_param):
    # 示例:生成待追加的DataFrame
    new_df = pd.DataFrame({'列1': [1, 2], '列2': ['测试A', '测试B']})
    # 替换为你的实际文件路径和工作表名
    append_to_excel(new_df, '目标文件.xlsx', sheet_name='数据汇总')
    # 此处返回你的回调输出内容
    return "数据追加完成"

关键细节说明

  • 使用openpyxl引擎:这是处理标准xlsx文件的专用引擎,可避免sharedStrings.xml相关错误
  • mode='a':设置为文件追加模式
  • if_sheet_exists='overlay':指定在已有工作表上追加数据,而非创建新表
  • startrow=startrow:从已有数据的下一行开始写入,避免覆盖原有内容

针对旧版xls文件的兼容方案

如果目标文件是.xls格式,需改用xlrd和xlwt引擎:

pip install xlrd xlwt

修改追加函数如下:

def append_to_excel_xls(df, file_path, sheet_name='Sheet1'):
    try:
        # 读取已有数据并合并
        existing_df = pd.read_excel(file_path, sheet_name=sheet_name)
        combined_df = pd.concat([existing_df, df], ignore_index=True)
        # 写入合并后的数据
        combined_df.to_excel(file_path, sheet_name=sheet_name, index=False)
    except FileNotFoundError:
        df.to_excel(file_path, sheet_name=sheet_name, index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:09:16