导出CSV中文乱码需加UTF-8 BOM头(\xEF\xBB\xBF),确保数据UTF-8编码;大数据量须流式查询+边查边写;导出Excel推荐phpspreadsheet(功能全)或box/spout(轻量高效);超时问题应异步处理。
PHP 生成 CSV 最常见的问题是 Excel 打开后中文显示为方块或乱码,本质是编码不匹配:Excel 默认用 ANSI(即 GBK/GB2312)解析 UTF-8 编码的 CSV。解决方法不是改 PHP 的 mb_internal_encoding(),而是给 CSV 内容加 BOM 头。
fputcsv() 输出前,先用 fwrite($fp, "\xEF\xBB\xBF") 写入 UTF-8 BOMmb_convert_encoding($row, 'UTF-8', 'GBK') 做兜底转换)header('Content-Type: text/csv'),应设为 text/csv; charset=utf-8,但注意 Excel 实际不读这个 header,BOM 才是关键fputcsv() 导出大
一次性把几万行查出来再循环写入,容易触发 Allowed memory size exhausted。必须流式处理,边查边写,不缓存整张表。
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false;MySQLi 用 mysqli_use_result()
ob_flush() 和 flush()(需确认服务器未启用 gzip 压缩,否则无效)fputcsv($fp, $row),不经过 implode() 或 str_putcsv()
原生 PHP 不支持 .xlsx 格式,必须依赖第三方库。实际项目中只推荐两个:
phpspreadsheet:功能全、文档好、持续维护,但体积大、生成 10 万行以上明显变慢;适合需要公式、样式、多 sheet 的场景box/spout:轻量(仅几百 KB)、内存占用低、支持流式写入,但不支持单元格样式和公式;适合纯数据导出、大数据量PHPExcel,也别手写 XML 模拟 xlsx——ZIP 结构+XML 校验极难稳定导出耗时操作不能阻塞 Web 请求生命周期,尤其当数据库查询慢或网络 I/O 高时。PHP 默认 max_execution_time=30,导出中途报 500 是常态。
set_time_limit(0) 解除脚本超时,但要搭配 ignore_user_abort(true) 防止用户关页中断php /path/to/export.php --task=123),前端轮询状态并提供下载链接