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

如何使用BytesIO在浏览器中下载XlsxWriter生成的文件?

使用BytesIO实现XlsxWriter的临时Excel下载

完全可以通过BytesIO实现内存中生成Excel并直接返回给前端,无需存储到服务器本地。核心思路是将BytesIO对象作为XlsxWriter的工作簿目标,生成完成后将内存中的字节数据返回给客户端。

修改后的代码示例

import xlsxwriter
from io import BytesIO
# 以FastAPI为例,其他Web框架逻辑类似
from fastapi import FastAPI
from fastapi.responses import StreamingResponse

app = FastAPI()

@app.get("/download-excel")
def download_excel():
    # 创建BytesIO对象作为内存缓冲区
    output = BytesIO()
    
    # 将工作簿指向BytesIO对象,替代本地文件路径
    workbook = xlsxwriter.Workbook(output)
    worksheet = workbook.add_worksheet()

    worksheet.set_column('A:A', 20)
    bold = workbook.add_format({'bold': True})

    worksheet.write('A1', 'Hello')
    worksheet.write('A2', 'World', bold)
    worksheet.write(2, 0, 123)
    worksheet.write(3, 0, 123.456)

    # 关闭工作簿,此时数据会写入BytesIO缓冲区
    workbook.close()
    
    # 将文件指针移到缓冲区开头,确保前端能读取完整数据
    output.seek(0)
    
    # 返回流式响应,设置正确的MIME类型和下载文件名
    return StreamingResponse(
        output,
        media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        headers={"Content-Disposition": "attachment; filename=demo.xlsx"}
    )

关键改动说明

  • 替换工作簿的目标路径为BytesIO对象,让XlsxWriter直接写入内存而非本地文件
  • 工作簿关闭后必须调用output.seek(0),将缓冲区指针重置到起始位置,否则前端会接收到空数据
  • 通过Web框架的响应对象(如FastAPI的StreamingResponse)返回内存字节流,同时设置符合Excel格式的MIME类型和下载文件名

这种方式全程在内存中处理数据,既避免了服务器存储占用,也提升了下载响应的效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:03:15