使用openpyxl向含图片的Excel添加图片时文件损坏问题
问题描述
使用Python的openpyxl库向Excel文件中添加图片时出现异常:首次在空白Excel文件上运行代码,图片可正常粘贴到工作表中;第二次运行完全相同的代码后,Excel文件损坏。该问题仅发生在向已有图片的工作表重复添加图片的场景下。
相关代码
图片文件:test1.png、test2.png
import os import openpyxl print(os.getcwd()) file_name = 'a.xlsx' wb = openpyxl.load_workbook(file_name) # 打开已存在的Excel文件 ws = wb["Sheet1"] # 设置活动工作表 sheet = wb.active ws['a2'].value = 11112 wb.save(file_name) #------------------将图片附加到单元格并修改图片尺寸----- # ws = wb.worksheets[0] # 默认Sheet1工作表 img = openpyxl.drawing.image.Image('test2.png') img.height = 238 img.width = 356 ws.add_image(img, 'B6') img = openpyxl.drawing.image.Image('test1.png') img.height = 238 img.width = 356 ws.add_image(img, 'I6') # 在I6位置添加图片到文件 wb.save(file_name)
解决方案
问题根源
代码中存在两次wb.save()调用,第一次保存后,文件的内部资源(尤其是图片相关的嵌入对象)未被正确释放,后续继续修改并再次保存时,openpyxl无法正确处理已有图片的文件结构,导致文件损坏。
修改后的代码
将中间的wb.save(file_name)移除,所有修改操作完成后仅执行一次保存:
import os import openpyxl print(os.getcwd()) file_name = 'a.xlsx' wb = openpyxl.load_workbook(file_name) # 打开已存在的Excel文件 ws = wb["Sheet1"] # 设置活动工作表 sheet = wb.active ws['a2'].value = 11112 #------------------将图片附加到单元格并修改图片尺寸----- img = openpyxl.drawing.image.Image('test2.png') img.height = 238 img.width = 356 ws.add_image(img, 'B6') img = openpyxl.drawing.image.Image('test1.png') img.height = 238 img.width = 356 ws.add_image(img, 'I6') # 在I6位置添加图片到文件 wb.save(file_name)
额外建议
如果确实需要分阶段保存文件,每次保存后必须关闭工作簿对象,再重新打开进行后续操作,避免资源冲突:
# 第一阶段:修改单元格并保存 file_name = 'a.xlsx' wb = openpyxl.load_workbook(file_name) ws = wb["Sheet1"] ws['a2'].value = 11112 wb.save(file_name) wb.close() # 关闭工作簿释放资源 # 第二阶段:添加图片并保存 wb = openpyxl.load_workbook(file_name) ws = wb["Sheet1"] img = openpyxl.drawing.image.Image('test2.png') img.height = 238 img.width = 356 ws.add_image(img, 'B6') img = openpyxl.drawing.image.Image('test1.png') img.height = 238 img.width = 356 ws.add_image(img, 'I6') wb.save(file_name) wb.close()
内容的提问来源于stack exchange,提问作者Chris L
相关产品推荐
相关产品推荐

