这个错误通常表示文件对象在操作之前已经被关闭。根据您提供的代码和错误信息,问题可能出现在保存工作簿后,仍然试图读取图像文件。
请尝试将 wb.save(name_str)
的位置移动到图片对象添加之前,以确保在保存工作簿之前不再使用图像文件。修改代码如下:
from openpyxl import load_workbook
from openpyxl.drawing.image import Image as XLImage
from PIL import Image
# 打开现有的Excel工作簿
wb = load_workbook(name_str)
ws = wb[site_name] # 替换为实际的工作表名称
temp_image_path = str(sys.argv[1]) + str(date_time) + ".png"
# 将Base64编码字符串转换为Image对象
image = decode_base64_to_image(sign_image, temp_image_path)
# 调整图像尺寸以适应单元格大小(可选)
img_width, img_height = image.size
cell_width = ws.column_dimensions['G'].width - 2 # 减去边框宽度,根据实际情况调整值
cell_height = (cell_width / img_width) * img_height
resized_image = image.resize((int(cell_width), int(cell_height)))
# 创建Excel工作簿中的图像对象,并插入到指定位置
with BytesIO() as img_bytes:
resized_image.save(img_bytes, format='PNG')
xl_img = XLImage(img_bytes)
xl_img.width = cell_width - 2 # 减去边框宽度,根据实际情况调整值
xl_img.height = cell_height - 2 # 减去边框宽度,根据实际情况调整值
ws.add_image(xl_img, 'G29')
# 关闭图像文件对象
image.close()
# 保存Excel文件
wb.save(name_str)
在这个修改后的代码中,我们将 wb.save(name_str)
移到了添加图像之前。这样可以避免在保存工作簿时引发 I/O 错误,并确保图像文件不会在关闭之前被访问。
内容由零声教学AI助手提供,问题来源于学员提问