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

如何在Python中将openpyxl Workbook对象转为输出流写入Azure Blob

解决Azure Functions中openpyxl Workbook转流写入Blob的问题

直接上可行方案:核心是利用openpyxl自带的save方法,将Workbook对象写入BytesIO内存流,再将流指针重置到开头后,通过Azure Blob SDK上传即可。

完整代码示例

import openpyxl
from io import BytesIO
from azure.storage.blob import BlobServiceClient
import os

def main(req):
    # 1. 生成/获取你的Workbook对象(示例:创建带测试数据的工作簿)
    wb = openpyxl.Workbook()
    ws = wb.active
    ws['A1'] = '订单ID'
    ws['B1'] = '金额'
    ws.append(['OD001', 299.9])
    ws.append(['OD002', 159.5])

    # 2. 将Workbook写入BytesIO流
    output_stream = BytesIO()
    wb.save(output_stream)  # 关键:通过openpyxl的save方法把工作簿内容写入流
    output_stream.seek(0)  # 重置流指针到开头,否则上传时会读取空内容

    # 3. 上传到Azure Blob Storage
    # 从Azure Functions环境变量读取Blob连接字符串(需提前在应用设置中配置)
    conn_str = os.getenv("AZURE_BLOB_CONNECTION_STRING")
    blob_service_client = BlobServiceClient.from_connection_string(conn_str)
    
    # 指定目标容器和Blob文件名
    container_name = "your-container-name"
    blob_name = "orders.xlsx"
    
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.upload_blob(output_stream, overwrite=True)  # overwrite=True允许覆盖已有文件

    return {"status": "success", "message": f"文件 {blob_name} 已上传到Blob存储"}

常见错误原因说明

  • 直接用BytesIO包裹Workbook:BytesIO(wb) 会触发TypeError,因为Workbook不是字节序列,BytesIO仅接受字节数据或无参数,必须通过wb.save()将工作簿的二进制内容写入流。
  • 用StringIO尝试:StringIO是处理文本的工具,而Excel是二进制格式,写入会导致编码混乱,且Blob存储需要二进制流,完全不适用。
  • 使用临时文件:Azure Functions的临时目录权限受限,且临时文件会增加IO开销,用内存流更高效且无权限问题。

Azure Functions配置注意事项

  1. 在requirements.txt中添加依赖:
openpyxl>=3.1.2
azure-storage-blob>=12.19.0
  1. 在Azure Functions的应用设置中添加AZURE_BLOB_CONNECTION_STRING配置项,值为你的Blob存储连接字符串。

内容的提问来源于stack exchange,提问作者Asu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:11