使用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
相关产品推荐
相关产品推荐

