如何在openpyxl中插入Blob或Base64格式的图片?
解决openpyxl直接插入Blob/Base64图片(无需保存本地)
openpyxl的Image类虽然表面要求传入文件路径,但可以通过**内存字节流(BytesIO)**加载Blob或Base64格式的图片,无需先保存到本地。以下是修正后的实现方案:
核心逻辑
- 上传的Blob图片:直接读取字节数据,用
BytesIO包装成类文件对象供openpyxl使用 - Base64格式图片:先解码为字节数据,再用
BytesIO包装
修正后的代码
from io import BytesIO import openpyxl from openpyxl.drawing.image import Image @route(data_mgt, rule='/elevation-values-calculation/download-error-ratio', methods=['POST']) def download_error_ratio(): payl = payload() survey_id = payl.get('survey_id', {}) project_id = payl.get('project_id', {}) # 处理上传的Blob图片 image_file = request.files['image'] # 将图片字节数据包装为BytesIO对象 img_stream = BytesIO(image_file.read()) # 若为Base64格式图片,先解码再转BytesIO(示例) # import base64 # base64_str = "data:image/png;base64,xxxx..." # img_data = base64.b64decode(base64_str.split(',')[1]) # img_stream = BytesIO(img_data) wb = openpyxl.Workbook() ws = wb.worksheets[0] # 用BytesIO对象初始化Image img = Image(img_stream) img.anchor = 'A1' ws.add_image(img) # 注意传入初始化后的img对象,不是原始上传文件 # 后续可将Excel保存到内存并返回给前端 # output_stream = BytesIO() # wb.save(output_stream) # output_stream.seek(0) # return send_file(output_stream, as_attachment=True, download_name="error_ratio.xlsx")
关键注意事项
- 不要直接将
data:{content_type};base64,...格式的字符串传给Image,openpyxl不支持这种格式 - 必须用
BytesIO将字节数据包装成类文件对象,openpyxl依赖的Pillow库可直接读取该对象 add_image方法要传入初始化好的img对象,而非原始的上传文件对象
内容的提问来源于stack exchange,提问作者Mark Anthony Libres
相关产品推荐
相关产品推荐

