Anaconda重装后Python Excel代码报AttributeError与IndexError求助
Excel生成代码报错修复方案
问题背景
重装最新版Anaconda后,一段生成多标签Excel的代码出现报错:
- 首先触发
AttributeError: 'Workbook' object has no attribute 'add_worksheet' - 后续引发
IndexError: At least one sheet must be visible
该代码此前正常运行一年多,另一段仅使用pandasto_excel的类似代码仍可正常工作。
报错原因
- 旧版Anaconda中,pandas默认使用xlsxwriter作为Excel写入引擎,
writer.book返回xlsxwriter的Workbook对象,支持add_worksheet、insert_textbox等专属方法。 - 新版Anaconda默认将引擎切换为openpyxl,openpyxl的Workbook对象没有
add_worksheet方法,且API与xlsxwriter完全不兼容,导致自定义工作表的代码直接报错。 - 第一个错误中断了后续代码执行,未创建任何可见工作表,进而触发第二个错误。
修复方案
方案1:指定xlsxwriter引擎(最小改动)
此方案无需修改原有业务逻辑,仅需指定写入引擎并确保xlsxwriter已安装:
- 安装xlsxwriter:
conda install xlsxwriter # 或用pip安装 pip install xlsxwriter
- 修改代码,在
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
相关产品推荐
相关产品推荐

