You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PhpSpreadSheet向客户端下载Xlsx文件时返回乱码该如何解决?

问题原因
  • 缺少必要的HTTP响应头声明,浏览器无法识别返回内容是Excel文件,默认按纯文本渲染就会显示为乱码
  • 读取了生成的Excel文件内容后没有输出到响应流,浏览器无法获取完整的文件数据
  • 没有清空输出缓冲区,代码执行过程中产生的多余空白、隐式输出会污染Excel文件结构,导致文件损坏
  • 发送文件内容后没有终止脚本运行,后续可能产生的额外输出会破坏文件完整性
修正后的代码
<?php
// 注意:当前文件<?php标签前不能有任何输出,包括空格、换行、UTF-8 BOM头
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet(); 

$sheet->setCellValue('A1', 'ID'); 
$sheet->setCellValue('B1', 'Name'); 
$sheet->setCellValue('C1', 'Name2'); 
$sheet->setCellValue('D1', 'Name3');
$sheet->setCellValue('E1', 'Type'); 

$date = date('d-m-y-'.substr((string)microtime(), 1, 8));
$date = str_replace(".", "", $date);
$filename = "export_".$date.".xlsx";

try {
    $writer = new Xlsx($spreadsheet);
    // 清空所有之前的输出,避免多余内容污染文件
    ob_end_clean();
    
    // 声明正确的响应头
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="'. $filename .'"');
    header('Cache-Control: max-age=0');
    header('Cache-Control: max-age=1');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: cache, must-revalidate');
    header('Pragma: public');

    // 直接输出到响应流,不需要额外保存到本地再读取
    $writer->save('php://output');
    exit;
} catch(Exception $e) {
    exit($e->getMessage());
}
额外注意事项
  • 确保当前PHP文件的<?php标签前没有任何空格、换行、UTF-8 BOM头,这些隐式输出会导致文件损坏
  • 代码中不要添加任何echo、var_dump之类的调试输出,否则输出内容会混入Excel文件导致打不开
  • 如果是在框架中使用,需要关闭框架的响应自动渲染逻辑,避免框架额外输出HTML内容

内容的提问来源于stack exchange,提问作者Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:57:02