讲师中心 微信公众号
AI工具推荐 视频效率加速

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

小辰姑娘_8853

小辰姑娘_8853

发布时间:2026-10-31 11:15:28

|

559人浏览过

|

来源于php中文网

原创

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 小时后删),不然磁盘迟早爆

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

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

2763

2023.08.11

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

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

6003

2023.10.09

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

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

6950

2024.03.19

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

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

6718

2024.03.22

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

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

963

2024.05.22

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

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

119

2025.12.22

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

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

574

2026.02.06

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

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

676

2026.05.09

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

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

共162课时 | 45万人学习

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

共28课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn