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

Anaconda重装后Python Excel代码报AttributeError与IndexError求助

Excel生成代码报错修复方案

问题背景

重装最新版Anaconda后,一段生成多标签Excel的代码出现报错:

  1. 首先触发 AttributeError: 'Workbook' object has no attribute 'add_worksheet'
  2. 后续引发 IndexError: At least one sheet must be visible
    该代码此前正常运行一年多,另一段仅使用pandas to_excel的类似代码仍可正常工作。

报错原因

  • 旧版Anaconda中,pandas默认使用xlsxwriter作为Excel写入引擎,writer.book返回xlsxwriter的Workbook对象,支持add_worksheet、insert_textbox等专属方法。
  • 新版Anaconda默认将引擎切换为openpyxl,openpyxl的Workbook对象没有add_worksheet方法,且API与xlsxwriter完全不兼容,导致自定义工作表的代码直接报错。
  • 第一个错误中断了后续代码执行,未创建任何可见工作表,进而触发第二个错误。

修复方案

方案1:指定xlsxwriter引擎(最小改动)

此方案无需修改原有业务逻辑,仅需指定写入引擎并确保xlsxwriter已安装:

  1. 安装xlsxwriter:
conda install xlsxwriter
# 或用pip安装
pip install xlsxwriter
  1. 修改代码,在pd.ExcelWriter中明确指定引擎:
productivity_flname = "%s/productivity_%s.xlsx" %(expath, fsuffix)
# 添加engine='xlsxwriter'参数
with pd.ExcelWriter(productivity_flname, engine='xlsxwriter') as writer:
    prod_book = writer.book
    prod_info_sheet = prod_book.add_worksheet('Info')
    prod_info_sheet.insert_textbox('A1', productivity_txt_bx, txt_bx_options)
    for row, data in enumerate(['Adjudicators'] + adjudicators):
        prod_info_sheet.write_string(row, 12, data)  
    for row, data in enumerate(['Peer Reviewers'] + peer_reviewers):
        prod_info_sheet.write_string(row, 13, data)
    prod_info_sheet.set_column("M:N", 18)    
    adj_ret.to_excel(writer, sheet_name="All Adjudicators", index = True)
    review_ret.to_excel(writer, sheet_name='All Peer Reviewers', index = True)
    for nm in adjudicators:
        print(nm)
        write_individuals(adj_ret, nm)
    for nm in peer_reviewers:
        print(nm)
        write_individuals(review_ret, nm)

方案2:改用openpyxl重写自定义工作表(适合长期迁移)

如果需要适配openpyxl引擎,需替换所有xlsxwriter专属API,示例如下(仅核心部分):

from openpyxl.utils import get_column_letter

productivity_flname = "%s/productivity_%s.xlsx" %(expath, fsuffix)
with pd.ExcelWriter(productivity_flname, engine='openpyxl') as writer:
    # 创建Info工作表
    prod_info_sheet = writer.book.create_sheet('Info')
    # 插入文本框(openpyxl的实现方式)
    txt_box = prod_info_sheet.shapes.add_textbox(
        left=0, top=0, width=300, height=100, text=productivity_txt_bx
    )
    # 写入字符串
    for row, data in enumerate(['Adjudicators'] + adjudicators):
        prod_info_sheet.cell(row=row+1, column=13, value=data)
    for row, data in enumerate(['Peer Reviewers'] + peer_reviewers):
        prod_info_sheet.cell(row=row+1, column=14, value=data)
    # 设置列宽
    prod_info_sheet.column_dimensions['M'].width = 18
    prod_info_sheet.column_dimensions['N'].width = 18
    # 后续pandas写入代码保持不变
    adj_ret.to_excel(writer, sheet_name="All Adjudicators", index = True)
    review_ret.to_excel(writer, sheet_name='All Peer Reviewers', index = True)
    for nm in adjudicators:
        print(nm)
        write_individuals(adj_ret, nm)
    for nm in peer_reviewers:
        print(nm)
        write_individuals(review_ret, nm)

说明

另一段代码正常运行的原因是:它仅使用pandas封装的to_excel方法,pandas会自动适配不同的Excel引擎;而报错代码直接操作了底层Workbook对象,依赖特定引擎的API,因此在引擎切换后出现兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:22:34