如何将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
相关产品推荐
相关产品推荐

