add image from other worksheet error:
I need to copy a sheet with images,using follow code:
from openpyxl import load_workbook
from copy import copy
wb = load_workbook('demo.xlsx')
ws = wb.worksheets[0]
ws_copy = wb.copy_worksheet(wb.worksheets[0])
for img in ws._images:
ws_copy.add_image(copy(img))
wb.save('save.xlsx')
Error:
Traceback (most recent call last):
File "test.py", line 8, in <module>
wb.save('save.xlsx')
File "/usr/local/lib/python3.6/dist-packages/openpyxl/workbook/workbook.py", line 407, in save
save_workbook(self, filename)
File "/usr/local/lib/python3.6/dist-packages/openpyxl/writer/excel.py", line 293, in save_workbook
writer.save()
File "/usr/local/lib/python3.6/dist-packages/openpyxl/writer/excel.py", line 275, in save
self.write_data()
File "/usr/local/lib/python3.6/dist-packages/openpyxl/writer/excel.py", line 77, in write_data
self._write_images()
File "/usr/local/lib/python3.6/dist-packages/openpyxl/writer/excel.py", line 116, in _write_images
self._archive.writestr(img.path[1:], img._data())
File "/usr/local/lib/python3.6/dist-packages/openpyxl/drawing/image.py", line 48, in _data
img = _import_image(self.ref)
File "/usr/local/lib/python3.6/dist-packages/openpyxl/drawing/image.py", line 16, in _import_image
img = PILImage.open(img)
File "/usr/local/lib/python3.6/dist-packages/PIL/Image.py", line 2315, in open
fp.seek(0)
ValueError: I/O operation on closed file.
By modify \openpyxl\drawing\image.py can fix this problem.
def _data(self):
"""
Return image data, convert to supported types if necessary
"""
img = _import_image(self.ref)
# don't convert these file formats
if self.format in ['gif', 'jpeg', 'png']:
img.fp.seek(0)
fp = img.fp
data = fp.read()
# fp.close()
else:
fp = BytesIO()
img.save(fp, format="png")
fp.seek(0)
data = fp.read()
fp.close()
return data