我在尝试下载 xlsx 文件时遇到问题。当我在本地测试它时它工作得很好,但是当我将它上传到生产服务器时,文件被损坏。
这是我使用的代码:
<?php
require 'conn.php';
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', '#');
$sheet->setCellValue('B1', 'First');
$sheet->setCellValue('C1', 'Last');
$sheet->setCellValue('D1', 'Handle');
header('Content-Type: application/vnd.openxmlformats-
officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="text.xlsx"');
header('Cache-Control: max-age=0');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
die;
我尝试将标题更改为,但没有帮助:
header('内容类型:application/vnd.ms-excel');
我认为如果在调用 createWriter 静态方法之前添加输出缓冲区的清理就可以了。
ob_end_clean();
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
我也有同样的症状,那是因为网络服务器在做完之后继续输出东西
$writer->save('php://output');
就我而言,在它之后执行
die()
是可行的,问题就消失了。
也许它可以节省一些人的时间。
我遇到了同样的问题,
ob_end_clean();
也解决了我的问题。最后几行如下。
ob_end_clean();
$writer=new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="'.urlencode($file_name).'"');
$writer->save('php://output');
在努力诊断工作站点副本上损坏的 Xlsx 文件生成后,添加
ob_end_clean();
也为我解决了这个问题。