如何修复读取时的未知错误,使用Phpspreadsheet更新Xlsx文件并作为PHP输出发送?

How fix unknown error while read, update Xlsx file with Phpspreadsheet and send as PHP output?

提问人:Oleg 提问时间:10/3/2023 最后编辑:Oleg 更新时间:10/3/2023 访问量:30

问:

我试图对HTTP请求执行操作以生成一些Xlsx文件。 开始时需要读取模板电子表格,向其添加一些数据并将其作为响应发送。 但是 PHPSpreadsheet 的失败原因不明。

use PhpOffice\PhpSpreadsheet\IOFactory;

$spreadsheet = IOFactory::load('test.xlsx');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8');
header('Cache-Control: max-age=0');
header('Content-Disposition: attachment;filename="myfile.xlsx"');
ob_end_clean();
$writer->save('php://output');
exit(0);

但是此代码不会在浏览器上提供文件,并且会出现未知错误。控制台上的响应如下所示:

enter image description here

刚刚新创建的电子表格文件,仅填充了 A1 单元格:

enter image description here

但是,如果我只更改 1 行以创建新的电子表格,它就可以正常工作。

use PhpOffice\PhpSpreadsheet\IOFactory;

// $spreadsheet = IOFactory::load('test.xlsx');
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$spreadsheet->getActiveSheet()->setCellValueByColumnAndRow(1,1,'testV');

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
// same code next

我有:

  • PHP格式:7.3
  • phpoffice/phpspreadsheet:1.8.2

如何正确打开现有文件并将其发送到HTTP响应?

更新

就像提议@ADyson一样,在启用错误打印后,我得到了错误的电子表格:Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 41943040 bytes) in ...vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php on line 1371

是否可以说 Phpspreadsheet 只处理填充的行,而不是全部?

php phpspreadsheet

评论

1赞 ADyson 10/3/2023
这回答了你的问题吗?如何在PHP中获得有用的错误消息?
0赞 Oleg 10/3/2023
嗨,@ADyson。不,它只是打印错误,但没有描述如何在存储库中打开、更新和发送电子表格文件
0赞 ADyson 10/3/2023
好吧,如果您知道错误是什么,那么您可以开始调试它不起作用的原因。这是你的起点。在不知道它崩溃的原因的情况下,我们无法为您提供帮助,就像您一样。
0赞 ADyson 10/3/2023
感谢您的更新。因此,您的 PHP 脚本已耗尽分配的内存。文件非常大吗?根据错误消息,您的 PHP 设置允许单个脚本使用多达 134MB 的 RAM。test.xlsx
0赞 Oleg 10/3/2023
@ADyson,没有。就像我在屏幕截图中显示的那样,它只填充了 1 个单元格。但出于某种原因,phpspreadsheet 试图处理整个工作表(1048576行和 AMJ 列)。

答: 暂无答案