"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');
我有一个简单的代码如下(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');