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

使用PhpSpreadsheet下载文件后为空的问题求助

问题解决:PhpSpreadsheet下载文件为空的问题

核心问题分析

你的代码中$writer->save($filename); die;这一行的die;语句会直接终止PHP脚本,导致后续的下载头设置和文件输出逻辑完全没有执行,这是下载文件为空的直接原因。此外,重复使用Writer对象输出到php://output也可能引发异常。

修正方案

方案1:直接下载(不保存到本地文件)

如果不需要保留本地文件,直接生成并下载:

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('template.xlsx');
$worksheet = $spreadsheet->getActiveSheet();
$filename = 'write.xls';

$worksheet->getCell('A1')->setValue('John');
$worksheet->getCell('A2')->setValue('Smith');

// 设置下载头
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=\"$filename\"");
header('Cache-Control: max-age=0');

// 直接输出到浏览器
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('php://output');
exit();

方案2:保存到本地同时下载

如果需要同时保留本地文件并提供下载:

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('template.xlsx');
$worksheet = $spreadsheet->getActiveSheet();
$filename = 'write.xls';

$worksheet->getCell('A1')->setValue('John');
$worksheet->getCell('A2')->setValue('Smith');

// 保存到本地文件
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save($filename);

// 设置下载头
header('Content-Type: application/vnd.ms-excel');
header("Content-Length: " . filesize($filename));
header("Content-Disposition: attachment;filename=\"$filename\"");
header('Cache-Control: max-age=0');

// 输出本地文件内容到浏览器
readfile($filename);
exit();

额外注意事项

  • 确保PHP脚本在输出header之前没有任何内容输出(包括空格、换行、HTML标签等),否则header会失效,导致下载异常。
  • 如果使用Xlsx格式,需要将Content-Type改为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,并将文件名后缀改为.xlsx。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:50:44