Flask服务中实现Pandas DataFrame转内存Excel供前端下载的方案问询
后端Flask接口修改
依赖准备
首先安装Excel文件生成依赖:pip install openpyxl
接口代码调整
pandas的to_excel方法需要写入文件或类文件对象,因此我们用内存字节缓冲区BytesIO承接生成的Excel内容,不需要写入磁盘即可返回:
import pandas as pd from io import BytesIO from flask import Response # 原有业务逻辑生成raw_results df_results = pd.DataFrame(raw_results) # 初始化内存字节缓冲区 output = BytesIO() # 将DataFrame写入缓冲区,index=False表示不导出索引列,可按需调整参数 df_results.to_excel(output, engine="openpyxl", index=False) # 把缓冲区指针移动到起始位置,否则读取到的内容为空 output.seek(0) # 构造响应,设置Excel对应的MIME类型 return Response( output, mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", status=200 )
前端请求逻辑修改
Excel是二进制文件,不能用之前处理文本CSV的逻辑,需要先按二进制格式接收响应:
// 示例为fetch请求,axios等请求库逻辑同理 fetch('/你的接口地址', { method: 'GET' // 保持和你原有请求方式一致 }) .then(response => response.blob()) .then(blob => { const element = document.createElement('a'); // 基于二进制blob生成临时访问链接 const fileUrl = URL.createObjectURL(blob); element.setAttribute('href', fileUrl); element.setAttribute('download', filename + ".xlsx"); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); // 释放临时链接占用的内存,避免内存泄漏 URL.revokeObjectURL(fileUrl); })
如果使用axios发送请求,需要在请求配置中添加responseType: 'blob',后续处理逻辑和上述一致。
内容的提问来源于stack exchange,提问作者ralvarez
相关产品推荐
相关产品推荐

