You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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")

关键注意事项

  1. 不要直接将data:{content_type};base64,...格式的字符串传给Image,openpyxl不支持这种格式
  2. 必须用BytesIO将字节数据包装成类文件对象,openpyxl依赖的Pillow库可直接读取该对象
  3. add_image方法要传入初始化好的img对象,而非原始的上传文件对象

内容的提问来源于stack exchange,提问作者Mark Anthony Libres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:05:40