"new PhpOffice\PhpSpreadsheet\Spreadsheet()" 是如何工作的

How does "new PhpOffice\PhpSpreadsheet\Spreadsheet()" work

我有一个简单的代码如下(docs) :

// Set the headers to a downloadble content
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment;filename="nomfichier.xlsx"'); 

// Initialize spreadsheet
$objPHPExcel = new PhpOffice\PhpSpreadsheet\Spreadsheet();
$objPHPExcel->setActiveSheetIndex(0);

// Get the sheet and set the value of the first cell
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'ID');

// Create the .xlsx file and download it
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($objPHPExcel, 'Xlsx');
$writer->save('/tmp/temp.csv');

知道这段代码在我的PHP页面中间,下载的内容是HTML页面的全文,试图适应我的excel文件第一列,而不是我正在寻找的简单结果:第一个单元格和第一列中名为 ID 的值。

我错过了什么?此代码是否需要包含在它自己的文件中?

您的代码有几个问题。

代码位置

由于文件下载只是服务器向客户端发送一堆数据,以及一些 headers 告诉浏览器如何对内容进行操作,因此您无法输出 除文件内容外的任何内容。这样做也会将其添加到文件内容中(并且您下载的文件很可能已损坏)。

此外,任何 header() 调用都需要 在任何 输出之前。 Headers 先发,再发内容。所以如果你已经输出了内容,就不能再发送了headers.

解决方案:
将您的代码移动到它自己的文件或将其移动到当前文件的顶部(在 HTML 等任何其他输出之前)。如果它在顶部,请不要忘记在代码后添加 exit; 以阻止它解析和发送 HTML。

正在输出 Excel 文档

您当前的代码在任何时候实际上都不会输出文档。它所做的只是将其保存在服务器上的 /tmp/ 文件夹中。

解决方案:
要输出文档而不是保存它,请更改:

$writer->save('/tmp/temp.csv');

$writer->save('php://output'); // Send it to the output buffer instead

如果你想保存它发送给客户端,你可以尝试(我不确定这是否有效,但应该可以),然后保留两者:

$writer->save('/tmp/temp.csv');
$writer->save('php://output');

如果由于某种原因,它不起作用,您可以先保存它,然后使用 readfile() 将其读回客户端。像这样:

$writer->save('/tmp/temp.csv');
readfile('/tml/temp.csv');