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

使用Python保存Excel工作簿时出现列表越界错误的原因

问题:openpyxl保存Excel时触发IndexError:list index out of range

复现代码

cur_wb=openpyxl.Workbook()

# 修改单元格值的代码。
# 示例:target_cell._style = copy(template_cell._style)

filename="DB-"+months[inm]+"xlsx"
cur_wb.save(filename="output/"+filename)

报错信息

File "Python\Python310\lib\site-packages\openpyxl\workbook\workbook.py", line 407, in save
    save_workbook(self, filename)
  File "Python\Python310\lib\site-packages\openpyxl\writer\excel.py", line 293, in save_workbook
    writer.save()
  File "Python\Python310\lib\site-packages\openpyxl\writer\excel.py", line 275, in save
    self.write_data()
  File "Python\Python310\lib\site-packages\openpyxl\writer\excel.py", line 84, in write_data
    stylesheet = write_stylesheet(self.workbook)
File "Python\Python310\lib\site-packages\openpyxl\styles\stylesheet.py", line 253, in write_stylesheet
    xf.alignment = wb._alignments[style.alignmentId]
IndexError: list index out of range

原因分析

就是因为你用了copy(template_cell._style)操作。_style是openpyxl的私有属性,内部用来关联工作簿的样式注册表(比如_alignments列表)。直接复制这个属性时,复制出来的样式对象里的alignmentId是原模板单元格所在工作簿的索引,但这个索引在当前新创建的cur_wb里并不存在——新工作簿的样式注册表是空的,没有对应ID的对齐样式,所以保存时遍历样式列表就会触发索引越界。

openpyxl不允许直接操作私有属性,这属于未公开的内部实现,出问题是必然的。

正确的样式复制方式

不要碰_style,用官方推荐的方法:

  • 直接复制整个样式:
    target_cell.style = template_cell.style
    
  • 单独复制某类样式(比如对齐、字体):
    from copy import copy
    target_cell.alignment = copy(template_cell.alignment)
    target_cell.font = copy(template_cell.font)
    # 其他样式属性同理
    

这样操作时,openpyxl会自动把样式注册到当前工作簿的样式注册表中,保存时就不会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:01:26