Echo框架怎么导出Excel与CSV文件

风宇吖_2256

风宇吖_2256

2026-10-13

762人浏览

原创

csv导出必须加utf-8 bom(\xef\xbb\xbf)且用fwrite写入php://output,禁用echo/print调试;excel导出需用phpspreadsheet分批写入或改用异步队列,避免内存溢出与输出流污染。

echo框架怎么导出excel与csv文件

CSV导出必须加BOM,否则Windows下Excel打不开中文

直接用 fputcsv() 写入 php://output 是最轻量的方式,但 Windows 版 Excel 默认不识别 UTF-8 编码,会把中文显示成乱码。唯一稳定解法是手动写入 UTF-8 BOM 头:\xEF\xBB\xBF。

常见错误包括:在 header() 前有空格或 echo、用 print_r() 调试后忘记删、开启 display_errors 导致错误信息混入输出流——这些都会让 CSV 文件损坏,浏览器提示“无法打开文件”或弹出下载但内容为空。

  • 响应头必须完整:Content-Type: text/csv; charset=utf-8 + Content-Disposition: attachment; filename="data.csv"
  • 用 fopen('php://output', 'w'),不要用临时文件再读取,避免内存和IO浪费
  • 写 BOM 必须用 fwrite() 或 fprintf(),不能用 echo(可能被缓冲干扰)
  • 每行数据传给 fputcsv() 前确保是字符串数组,数值类型会自动转,但 null 或 false 会变成空字符串,需提前处理

导出Excel要用PhpSpreadsheet,别碰PHPExcel

PHPExcel 已停止维护多年,PhpSpreadsheet 是其官方继任者,支持 PHP 7.4+ 和现代 Composer 生态。Echo 框架本身不提供 Excel 功能,所有逻辑都在控制器里完成:查数据 → 构建 Spreadsheet 对象 → 写入 → 输出流响应。

关键点不是“怎么装库”,而是“怎么避免内存爆掉”。10 万行数据直接塞进内存生成 .xlsx 很容易触发 Fatal error: Allowed memory size exhausted。解决思路是分批写入或改用 CSV;如果必须 Excel,优先用 setCellValueByColumnAndRow() 替代整行 fromArray(),减少中间数组拷贝。

QuickBooks Mileage CSV
QuickBooks Mileage CSV

使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。

下载
  • 安装命令:composer require phpoffice/phpspreadsheet
  • 输出时用 php://output 流,不要 save() 到磁盘再读取
  • 务必设置 ob_end_clean() 在 header() 前,防止 Echo 的中间件输出干扰二进制流
  • 中文字段要调用 $sheet->getStyle('A1')->getFont()->setName('SimSun'),否则默认字体不显示中文

Echo 的响应流控制比 Laravel 更敏感

Echo 是轻量级框架,没有内置的响应包装器,echo、print、var_dump() 一旦出现在导出逻辑中,就会破坏二进制文件结构。比如你在 for 循环里加了 error_log("row $i"),日志虽不显示,但若配置了 log_errors = On 且 error_log 指向 stdout,就可能污染输出流。

另一个坑是中间件顺序。如果你在路由上挂了 Logger 或 Recover 中间件,它们可能在导出前已向响应体写入内容(如 JSON 错误页),导致 Excel 文件开头多出几行文本,用户双击打不开。

  • 导出接口应单独定义路由,不套通用中间件
  • 在 handler 开头立刻调用 ob_end_clean() 和 ob_start(),确保输出缓冲干净
  • 用 Response::Writer 时,别调用 WriteString(),直接 Write() 二进制字节
  • 调试时改用 file_put_contents('/tmp/debug.log', ...),避开任何输出函数

大表导出别硬扛,优先走流式CSV + 后台队列

超过 5 万行的数据,强行在 Web 请求里生成 Excel 几乎必然超时或 OOM。即使加了 set_time_limit(0) 和 ini_set('memory_limit', '-1'),用户端也会因连接中断而失败。

真实生产环境的解法是:前端点击“导出”只提交任务,后端用 exec('php artisan export:run '.$jobId.' > /dev/null &') 或 Redis 队列异步执行,完成后发通知或生成可下载链接。CSV 可以流式处理(逐行 fputcsv),Excel 不行——PhpSpreadsheet 必须构建完整对象后才能写入,所以大数据量 Excel 导出本质是伪实时,得接受延迟。

  • 小数据(
  • 中等数据(1–5 万行):强制用 CSV,加 BOM,前端提示“建议用 Excel 打开”
  • 大数据(> 5 万行):必须异步,返回 {"status":"processing","job_id":"exp_abc123"},由定时任务轮询生成状态
  • 别信“边查边写 Excel”的方案——PhpSpreadsheet 没有真正的流式写入 API
导出功能最易被忽略的其实是 HTTP 缓存头。很多团队加了 Cache-Control: no-cache 就以为安全,但 IE 和旧版 Edge 会缓存 attachment 响应,第二次点下载拿到的是上次的文件。真正有效的是三连:Cache-Control: no-store, no-cache, must-revalidate + Pragma: no-cache + Expires: 0。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

2023.07.25

5081

7

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3136

5

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

2023.08.02

2920

3

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

2023.08.02

1444

3

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

2023.08.02

697

5

绝对引用的输入方法
绝对引用的输入方法

绝对引用允许在公式中引用一个固定的单元格,而不会随着公式的复制和粘贴而改变引用的单元格。本专题为大家提供绝对引用相关内容的文章,大家可以免费体验。

2023.08.09

5148

7

java导出excel
java导出excel

在Java中,我们可以使用Apache POI库来导出Excel文件。本专题提供java导出excel的相关文章,大家可以免费体验。

2023.08.18

6663

6

excel输入值非法
excel输入值非法

在Excel中,当输入的数值非法时,有以下多种处理方法。本专题为大家提供excel输入值非法的相关文章,大家可以免费体验。

2023.08.18

1681

3

excel生成二维码
excel生成二维码

虽然Excel本身并不直接支持生成二维码,但我们可以借助一些插件或宏来实现在Excel中生成二维码的功能。本专题为大家提供excel生成二维码的相关文章。

2023.08.18

2798

4

热门下载

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

精品课程

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

共162课时 | 44.1万人学习

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

共28课时 | 3.5万人学习