使用Pandas与Openpyxl更新Excel文件时触发AttributeError且文件损坏
问题修复方案
错误原因分析
你遇到的AttributeError是因为Pandas的OpenpyxlWriter对象的book属性是只读的,无法直接赋值。另外代码还有两个关键问题:
- 循环中每次用
pd.ExcelWriter打开原文件时,默认是覆盖模式,会直接清空原有数据 - 用只读模式加载的
book无法用于写入操作
修正后的代码
下面是可以正常更新Excel文件的代码,核心是先处理完所有sheet的数据,再统一写入,避免读写冲突:
import pandas as pd from openpyxl import load_workbook file_path = 'original.xlsx' update_path = 'update.xlsx' # 加载原文件的工作簿(非只读模式,允许修改) book = load_workbook(file_path) # 遍历需要更新的sheet,逐一处理数据 for sheet_name in ['sheet1']: # 替换成你的实际sheet列表 # 读取原sheet和更新sheet的数据 df_original = pd.read_excel(file_path, sheet_name=sheet_name) df_update = pd.read_excel(update_path, sheet_name=sheet_name) # 保持你的合并去重逻辑 df_update = df_update.iloc[::-1] df_combined = pd.concat([df_original, df_update], ignore_index=True) df_combined = df_combined.drop_duplicates(subset='column1', keep='last') # 将处理后的数据写入原sheet(覆盖原有内容) with pd.ExcelWriter(file_path, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer: df_combined.to_excel(writer, sheet_name=sheet_name, index=False) # 保存工作簿,确保所有修改生效 book.save(file_path) print(f"所有sheet已成功更新到文件: {file_path}")
关键修正点说明
- 使用
mode='a'和if_sheet_exists='replace':让ExcelWriter以追加模式打开文件,目标sheet存在时直接替换,避免清空整个文件 - 不在循环内重复创建ExcelWriter:减少文件操作次数,避免文件锁定问题
- 用非只读模式加载
book:确保可以对文件进行写入修改 - 最后统一保存工作簿:保证所有修改都能写入到文件中
额外注意事项
如果你的Excel文件有复杂格式(比如单元格样式、公式),直接替换sheet会丢失格式。这种情况下需要用openpyxl直接操作单元格:
# 示例:保留格式的情况下更新数据 ws = book[sheet_name] # 清空原有数据(表头保留则从第2行开始) for row in ws.iter_rows(min_row=2): for cell in row: cell.value = None # 写入新数据 for r_idx, row in enumerate(df_combined.values, start=2): for c_idx, val in enumerate(row, start=1): ws.cell(row=r_idx, column=c_idx, value=val) book.save(file_path)
内容的提问来源于stack exchange,提问作者Teo
相关产品推荐
相关产品推荐

