使用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
相关产品推荐
相关产品推荐

