【问题标题】:How does "new PhpOffice\PhpSpreadsheet\Spreadsheet()" work“新的 PhpOffice\PhpSpreadsheet\Spreadsheet()”如何工作
【发布时间】:2019-07-30 14:11:53
【问题描述】:

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

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

【问题讨论】:

  • 你能澄清你的问题吗?
  • @Justinas 定义 clarify?你不明白什么? :-)
  • 它不需要包含在它自己的文件中。如果需要,您可以将其移动到文件的顶部。 (不要忘记在这段代码之后有一个exit;)。其原因是 Web 服务器(和客户端)不知道您的预期响应应该是什么,因此它无法为您“删除”已经输出的 HTML。此外,任何header()-call must 都必须在 any 输出之前。标头始终在任何内容之前发送,因此如果您输出任何内容,则无法为该响应设置额外的标头。
  • @MagnusEriksson 将代码放在文件顶部并在保存后立即退出下载一个空的 excel 文件 - 但不是我指定的单元格值。知道为什么吗?
  • 那是因为您没有将文件发送给客户端。您只是将它保存在服务器上的temp.csv 文件夹中的tmp 中。如果您想输出它,请使用$writer->save('php://output');

标签: php spreadsheet phpspreadsheet


【解决方案1】:

您的代码存在一些问题。

代码位置

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

此外,任何header()-call in 都需要在任何输出之前。先发送标头,然后发送内容。因此,如果您已经输出了内容,则无法发送额外的标头。

解决方案:
将您的代码移动到它自己的文件或将其移动到当前文件的顶部(在任何其他输出之前,如 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');

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 2022-01-11
    • 2020-02-24
    • 2017-10-29
    • 2018-06-22
    • 2021-11-25
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多