Python怎么导出Excel_API生成Excel流并返回供浏览器下载

必须用 BytesIO 拦截 to_excel 输出流并调用 seek(0),Content-Type 需设为 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,filename 要用双引号或 UTF-8 编码,空值需 fillna 处理,大文件应分页或改用 CSV。

pandas.DataFrame.to_excel 生成内存 Excel 流,别写文件

直接调用 to_excel 写磁盘再读取是典型反模式——多一次 I/O,还可能因并发或权限出错。必须用 BytesIO 拦截输出流。

  • to_excelbuffer 参数接受任意类文件对象,传 BytesIO() 即可
  • 写完后记得调用 .seek(0),否则后续读取会从末尾开始,返回空内容
  • 别用 StringIO,Excel 是二进制格式,StringIO 会报 TypeError: expected bytes, got str
from io import BytesIO
import pandas as pd

output = BytesIO() df.to_excel(output, index=False) output.seek(0) # 关键一步

Flask/FastAPI 返回 Excel 流时的 Content-Type 和 Content-Disposition

浏览器靠响应头判断是否触发下载。错一个字段,Excel 就变成乱码页面或被强行打开。

  • Content-Type 必须是 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet(xlsx)或 application/vnd.ms-excel(xls),不能用 application/octet-stream
  • Content-Disposition 中的 filename 值需用双引号包裹,且建议只含 ASCII 字符;中文名要加 filename*=UTF-8''xxx.xlsx 编码,否则 Safari/Edge 可能截断
  • FastAPI 用户注意:Response 构造时传 media_type,别依赖自动推断
# Flask 示例
return send_file(
    output,
    mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    as_attachment=True,
    download_name="data.xlsx"  # Flask 2.1+ 用 download_name,旧版用 attachment_filename
)

openpyxl 手动构造复杂 Excel 时如何避免 ValueError: Can't convert 'None' to Excel

当 DataFrame 含 NoneNaTNaN 或自定义空值对象,openpyxl 直接写单元格会崩。pandas 默认已处理,但手动操作时得自己兜底。

  • 先用 df.fillna("")df.replace({pd.NaT: "", pd.NA: "", None: ""}) 清洗数据
  • 遍历写入前检查值类型:if pd.isna(cell_value): cell.value = ""
  • 日期列若为 NaT,不要转 datetime 再写,openpyxl 不认 NaT,也不建议写字符串“N/A”,会丢失 Excel 日期格式识别能力

大文件导出卡顿或内存爆掉?别让整个 DataFrame 呆在内存里

几百万行导 Excel,BytesIO + pandas.to_excel 会吃光内存,且用户等不到响应。得换策略。

Stable Diffusion

目前最强的开源AI绘画工具

下载

立即学习“Python免费学习笔记(深入)”;

  • 优先考虑分页导出:前端传 page=1&size=50000,后端只查并导当前批次
  • 真要单文件超大,改用 xlsxwriter 的 streaming 模式(它不支持读,只写),配合 yield 分块写入,但需放弃 pandas 样式和公式
  • 更现实的解法:导 CSV。用 df.to_csv(output, index=False),内存占用低两个数量级,浏览器一样能下载打开

生成 Excel 流这事本身不难,难的是边界情况——空数据、时区混杂的 datetime、带合并单元格的模板、还有用户偷偷在 filename 里塞了斜杠或控制字符。这些地方一漏,线上就收 500 错误。

相关推荐:

分析:社交媒体超四分之一长文为 AI 生成,LinkedIn 成重灾区

7 月 13 日消息,根据 Pangram 的一项分析,目前社交媒体上超过 250 个单词的长篇内容中,每四篇就有一篇是由 AI 生成。其中,LinkedIn 的 AI 内容占比最高,41% 的长文被判定为 AI 撰写。虽然 LinkedIn 仅占此次扫描帖子总数的约三分之一,但却贡献了近三分之二的 AI 内容。注意到,在 X(原 Twitter)平台上,接近一半的长文被认为是完全由 AI 生成,...

商汤发布并开源 SenseNova-Vision 理解生成统一视觉大模型,能力超越 Vision Banana

7 月 13 日消息,商汤科技今日发布并全面开源日日新 SenseNova-Vision 理解生成统一视觉大模型,这是商汤日日新大模型体系的重要视觉能力升级。商汤科技表示,行业以往的 " 统一视觉 " 多是把检测、分割、深度预测等多个专家模型打包封装,本质还是割裂的。SenseNova-Vision 的核心变革是:让视觉成为通用基础模型的原生能力,彻底融入大模型体系。所有经典视觉任务如目标检测、图...

谷歌为“我的广告中心”新增 AI 生成标记,可识别 AI 制作广告

7 月 10 日消息,谷歌昨天宣布为“My Ad Center”(注:我的广告中心)增加 AI 生成标记,用户可在此查看 Google 搜索、Google Discover 和 YouTube 展示的广告是否由 AI 生成或编辑。据介绍,用户只需要点击广告右边的三点菜单或信息按钮,就能查看广告是否由 AI 制作,还可以在此屏蔽或举报广告。谷歌表示,以后使用自家 AI 工具生成的广告,都会在投放时主...

谷歌安卓版 Chrome 150 浏览器曝 P0 级 Bug:下载文件后消失、视频控件失灵

7 月 10 日消息,科技媒体 piunikaweb 昨日(7 月 9 日)发布博文,报道称安卓版 Chrome 150 浏览器存在两个 P0 级别的 Bug,谷歌工程团队目前正在着手调查。注:在 Chromium 缺陷追踪系统中,P0 代表最高优先级,常用于标记会阻断版本发布或需要立即处理的问题,这类缺陷通常影响核心功能,且影响用户范围较广。第一个问题是安卓版 Chrome 150 下载文件后消...

路透社实测发现,Meta 检测工具面对裁剪后的自家 AI 生成图片竟然“失灵”

7 月 11 日消息,路透社 10 日披露的测试结果显示,Meta 本周公布的一款 AI 图像检测工具存在明显局限:部分由 Meta 自家模型 Muse Image 生成的图片只要经过裁剪,检测工具便无法确认其 AI 来源。Meta 在推出 Muse Image 的同时介绍了这款检测工具,并声称即使图片经过裁剪,工具仍可识别由 Meta AI 生成的内容。不过,路透社的测试结果显示,常见的图片修改...

桌面版 Claude Code 新增应用内浏览器,可用于 AI 调试网页等

7 月 11 日消息,Anthropic 旗下官方账号 @ClaudeDevs 今天(7 月 11 日)在 X 平台发布推文,宣布桌面版 Claude Code 新增内置浏览器,可读取、点击并与网站交互。基于 Anthropic 官方文档说明,用户可以在 Claude Code 中启用浏览器面板(Browser pane),使用独立且干净的浏览器配置文件,与用户个人浏览器隔离,不共享已保存登录状态...

能直接用公开 Instagram 帖子生成图像,Meta 新 AI 功能被“骂”到下线

7 月 11 日消息,据《综艺(Variety)》杂志今天(11 日)报道,Meta 将下线利用公开 Instagram 账号生成图像的 AI 功能。由于默认允许系统引用公开内容、账号持有人需要主动选择退出,推出后数日内持续遭到批评,好莱坞多家艺人经纪公司也表达了不满。Meta 发言人在声明中说:“本周早些时候,我们宣布,用户可以在 Meta AI 中 @提及公开 Instagram 账号,并将账...

DuckDuckGo 浏览器现已默认开启视频广告拦截,YouTube 广告也挡得住

7 月 9 日消息,DuckDuckGo 浏览器宣布,用户观看视频时,浏览器可屏蔽大多数视频广告,尤其是 YouTube 视频广告。DuckDuckGo 在博客文章中介绍新功能时称,YouTube 广告检测和屏蔽能力基于 uBlock Origin 的开源社区过滤列表。为了提高兼容性,DuckDuckGo 预计也会加入自有规则。不过,用户开启广告屏蔽后,视频缓冲时间可能变长,使用过程中也会出现一些...