FastAPI怎么导出Excel或CSV文件供前端下载

小辰姑娘_8853

小辰姑娘_8853

2026-10-31

559人浏览

原创

StreamingResponse 是导出首选,因其支持边生成边发送、内存可控且避免超时;CSV 用 csv.writer 写入 StringIO 后流式返回,Excel 用 openpyxl 生成后分块 yield BytesIO 内容,并须手动设置正确的 Content-Type 和 Content-Disposition 响应头。

fastapi怎么导出excel或csv文件供前端下载

直接用 StreamingResponse 导出 CSV,用 StreamingResponse + openpyxl 或 xlsxwriter 导出 Excel 流——这是最稳妥、内存可控、浏览器能正确下载的组合。别用 FileResponse 返回临时生成的 Excel 文件,除非你已确保文件写完且路径绝对可靠;更别依赖 FastAPI 自动推断 media_type,一错就变乱码页。

为什么 StreamingResponse 是导出首选

CSV 和 Excel 导出本质是“边生成边发”,尤其数据量超过 1 万行时:FileResponse 要求文件已落盘,而写 Excel 文件(尤其是带样式)常需完整构建 workbook 后才能序列化,中间过程吃内存;StreamingResponse 允许你把生成逻辑封装成迭代器,让 FastAPI 分块传输,避免超时和 OOM。

  • CSV 场景:用 csv.writer 写入 io.StringIO,再用 iter([s.getvalue()]) 包一层即可流式返回
  • Excel 场景:不能直接用 io.BytesIO().getvalue() 一次性塞进 iter,得用 openpyxl 的 save 到 BytesIO 后,再按 chunk 分片 yield(否则仍是内存全占)
  • 注意:不要对大 Excel 做 iter([wb_stream.getvalue()]),这等于没流式——getvalue() 会把整个二进制加载进内存

Content-Type 和 Content-Disposition 必须手动设对

浏览器靠这两个响应头决定是否弹下载框、用什么程序打开。设错一个,Excel 就在页面里显示为乱码,或者被当成文本强行渲染。

  • CSV:media_type="text/csv",headers={"Content-Disposition": 'attachment; filename="report.csv"'}
  • Excel(.xlsx):media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",filename 值必须用双引号包裹;含中文名时加 filename*=UTF-8''report%E6%8A%A5%E8%A1%A8.xlsx(URL 编码)
  • 千万别用 application/octet-stream ——它会让 Safari 拒绝识别为 Excel,Edge 可能截断文件名
  • FastAPI 不会自动从文件扩展名推断 media_type,response_class=StreamingResponse 时必须显式传 media_type

用 openpyxl 做流式 Excel 导出的实际写法

openpyxl 本身不原生支持流式写入,但你可以控制写入节奏:先创建 workbook → 写 header → 每写 1000 行就 save 到 BytesIO 并 yield 一部分,最后 flush 剩余内容。不过更轻量的做法是只用它生成最终二进制,再用 StreamingResponse 分 chunk 发送:

cn-excel-formula
cn-excel-formula

Excel公式助手。自然语言描述需求,自动生成Excel公式。支持VLOOKUP、条件统计、日期计算、文本处理等200+常用公式。附带公式解释和示例数据。

下载
from openpyxl import Workbook
from io import BytesIO
from fastapi.responses import StreamingResponse
<p>def generate_excel_stream(data_rows):
wb = Workbook()
ws = wb.active
ws.append(["姓名", "年龄", "城市"])
for row in data_rows:
ws.append(row)</p><pre class="brush:python;toolbar:false;">stream = BytesIO()
wb.save(stream)
stream.seek(0)

# 分 8KB chunk 发送,避免单次 load 全部进内存
def iter_stream():
    while True:
        chunk = stream.read(8192)
        if not chunk:
            break
        yield chunk

return StreamingResponse(
    iter_stream(),
    media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    headers={"Content-Disposition": 'attachment; filename="report.xlsx"'}
)
  • 关键点:yield 是在函数内部分块读取 BytesIO,不是把整个 stream.getvalue() 丢给 iter
  • 如果数据源本身是数据库游标或生成器,务必用 fetchmany(1000) 分批读,别 fetchall()
  • 想加样式?openpyxl 支持,但样式越多,内存占用越不可控;超 10 万行建议放弃复杂样式,或切到 xlsxwriter(它支持更高效的流式写)

大文件导出别卡在同步请求里

用户点下载按钮后等 3 分钟,Nginx 默认超时是 60 秒,前端早断连了。真实项目里,>5 万行的数据导出应该走异步任务:

  • 接口立即返回 {"task_id": "DL20261002_abc123"}
  • 后台用 Celery 或 asyncio.create_task 启动导出,写文件到共享存储(如 S3 或本地挂载目录)
  • 提供 GET /download/status/{task_id} 让前端轮询,状态变为 "ready" 后返回预签名 URL 或重定向到 FileResponse 接口
  • 临时文件必须带时间戳或 UUID 命名,且设置自动清理(比如 1 小时后删),不然磁盘迟早爆

流式导出看着简单,但真正压测时容易暴露内存泄漏、编码错误、响应头缺失这些细节问题——它们不会报错,只会让用户看到一片空白或乱码表格。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2743

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5983

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6910

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6678

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

943

5

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

2025.12.22

119

5

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

2026.02.06

574

18

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

2026.05.09

676

23

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

2026.06.16

559

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 45万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习