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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:42:50