Python实现WEBP转PNG后直接插入Excel(无需本地存储)
问题:无需本地存储直接将WEBP转PNG插入Excel?
抓取包含结构化信息和WEBP图片的HTML数据并保存到Excel工作表时,WEBP格式无法直接插入Excel,需要转换为PNG或JPG,但批量转换后保存到本地再插入的方式耗时较长。尝试直接插入转换后的二进制img_png失败,但下载WEBP转PNG后存本地再用openpyxl插入可行,现有代码如下:
url = "https://down-aka-tw.img.susercontent.com/tw-11134207-7qul7-lilu03jxchpw3d_tn.webp" response = requests.get(url) img_data = response.content img_png = Image.open(BytesIO(requests.get(url).content)).convert("RGB") #from PIL import Image as pImage img_png.save("C:\\temp\\image.png") img = oImage('C:\\temp\\image.png') #from openpyxl.drawing.image import Image as oImage wb = Workbook() ws = wb.active # insert images ws.add_image(img, 'A1') wb.save("C:\\temp\\export.xlsx") wb.close()
请问是否有无需本地存储,将WEBP转PNG后直接插入Excel的方法?
解决方案
可以通过内存缓冲区BytesIO实现全程无本地存储的WEBP转PNG并插入Excel,核心思路是把转换后的图片数据保存在内存中,而非写入本地文件。修改后的代码如下:
import requests from PIL import Image from openpyxl import Workbook from openpyxl.drawing.image import Image as oImage from io import BytesIO url = "https://down-aka-tw.img.susercontent.com/tw-11134207-7qul7-lilu03jxchpw3d_tn.webp" # 下载WEBP图片并转换为RGB格式(PNG基础格式) response = requests.get(url) img_png = Image.open(BytesIO(response.content)).convert("RGB") # 创建内存缓冲区,将转换后的图片写入缓冲区 img_buffer = BytesIO() img_png.save(img_buffer, format="PNG") img_buffer.seek(0) # 重置缓冲区指针到起始位置,确保openpyxl能读取完整数据 # 直接从内存缓冲区创建openpyxl的Image对象 img = oImage(img_buffer) wb = Workbook() ws = wb.active # 插入图片到指定单元格 ws.add_image(img, 'A1') wb.save("C:\\temp\\export.xlsx") wb.close()
关键说明:
- 用
BytesIO替代本地文件作为数据载体,避免了磁盘IO操作,大幅提升批量处理效率 - 转换后的图片写入缓冲区后,必须调用
seek(0)将指针移到开头,否则openpyxl读取时会从缓冲区末尾开始,无法获取有效图片数据 - openpyxl的
Image类支持接受类文件对象(如BytesIO)作为参数,因此可以直接读取内存中的图片数据
内容的提问来源于stack exchange,提问作者陳韋仲
相关产品推荐
相关产品推荐

