PHPOffice 写入新文件时出现致命错误
PHPOffice write a new file fatal errors
我正在使用 this 库从我的 PHP
脚本创建 .xlsx
文件。
按照 this 指南,我尝试将一些数据导出到名为 hello.xlsx
.
的文件中
但是,此错误会显示以下消息:
Warning: ZipArchive::close(): Failure to create temporary file: Permission denied in vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer
Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Writer\Exception: Could not close zip file hello.xlsx. in vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 399
PhpOffice\PhpSpreadsheet\Writer\Exception: Could not close zip file hello.xlsx. in /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 399
该文件在执行前不存在,所以我得到了一些错误。我总是可以尝试 touch hello.xlsx
并更改我的脚本以读取该文件并附加数据,但实际上,每次脚本为 运行.[=25= 时我都在尝试编写一个新文件]
这是我的(简化)代码:
require_once 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'foo');
$sheet->setCellValue('B1', 'bar');
$sheet->setCellValue('C1', 'foobar');
$sheet->setCellValue('D1', 'trey is the best');
$writer = new Xlsx($spreadsheet);
$writer->save('hello.xlsx');
转到错误中的那些行显示此代码片段:
// Close file
if ($zip->close() === false) {
throw new WriterException("Could not close zip file $pFilename.");
}
对我来说,这并不是一条有用的消息来调试问题所在。
我在这方面找到了各种 SO 帖子:
- PHPExcel_Writer_Exception with message Could not close zip file php://output.
很遗憾,已接受的答案无效(将代码更改为 $writer->save($_SERVER['DOCUMENT_ROOT']. '/hello.xlsx')
)。
我也尝试了 SaveFiaTempFile
函数,但它只会输出一堆有趣的字符。
我也不想将我的 folder/file 权限设置为 777,因为这在膜中太疯狂了。
- PHPExcel exception: Could not close zip file …
这个被接受的答案并没有真正表明除了改变所有权之外,IMO 应该做的正确的事情是什么,但是..把什么变成什么?
那么我该如何解决 fixing/debugging 这个没有太多要继续下去的问题呢?
谢谢:)
更新
所以我想我应该仔细检查一下,我在 project_root 中创建了一个名为 tmp
的文件夹。我更改了我的代码以写入 $_SERVER['DOCUMENT_ROOT']. '/tmp/hello.xlsx'
,但它仍然给出错误。
然而,我想“嘿,让我们开个玩笑吧”,令我惊讶的是数据都在那里,一切似乎都很好..但无论出于什么原因,它仍然收到错误,而不是在我的浏览器中出现下载弹出窗口..
我找到了创建动态 Xlsx 文件的解决方案:
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="hello.xlsx"');
header('Cache-Control: max-age=0');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
在这里,我们实际上只是将浏览器重定向到 php://output
并下载文件。
我正在使用 this 库从我的 PHP
脚本创建 .xlsx
文件。
按照 this 指南,我尝试将一些数据导出到名为 hello.xlsx
.
但是,此错误会显示以下消息:
Warning: ZipArchive::close(): Failure to create temporary file: Permission denied in vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer
Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Writer\Exception: Could not close zip file hello.xlsx. in vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 399
PhpOffice\PhpSpreadsheet\Writer\Exception: Could not close zip file hello.xlsx. in /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 399
该文件在执行前不存在,所以我得到了一些错误。我总是可以尝试 touch hello.xlsx
并更改我的脚本以读取该文件并附加数据,但实际上,每次脚本为 运行.[=25= 时我都在尝试编写一个新文件]
这是我的(简化)代码:
require_once 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'foo');
$sheet->setCellValue('B1', 'bar');
$sheet->setCellValue('C1', 'foobar');
$sheet->setCellValue('D1', 'trey is the best');
$writer = new Xlsx($spreadsheet);
$writer->save('hello.xlsx');
转到错误中的那些行显示此代码片段:
// Close file
if ($zip->close() === false) {
throw new WriterException("Could not close zip file $pFilename.");
}
对我来说,这并不是一条有用的消息来调试问题所在。
我在这方面找到了各种 SO 帖子:
- PHPExcel_Writer_Exception with message Could not close zip file php://output.
很遗憾,已接受的答案无效(将代码更改为 $writer->save($_SERVER['DOCUMENT_ROOT']. '/hello.xlsx')
)。
我也尝试了 SaveFiaTempFile
函数,但它只会输出一堆有趣的字符。
我也不想将我的 folder/file 权限设置为 777,因为这在膜中太疯狂了。
- PHPExcel exception: Could not close zip file …
这个被接受的答案并没有真正表明除了改变所有权之外,IMO 应该做的正确的事情是什么,但是..把什么变成什么?
那么我该如何解决 fixing/debugging 这个没有太多要继续下去的问题呢?
谢谢:)
更新
所以我想我应该仔细检查一下,我在 project_root 中创建了一个名为 tmp
的文件夹。我更改了我的代码以写入 $_SERVER['DOCUMENT_ROOT']. '/tmp/hello.xlsx'
,但它仍然给出错误。
然而,我想“嘿,让我们开个玩笑吧”,令我惊讶的是数据都在那里,一切似乎都很好..但无论出于什么原因,它仍然收到错误,而不是在我的浏览器中出现下载弹出窗口..
我找到了创建动态 Xlsx 文件的解决方案:
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="hello.xlsx"');
header('Cache-Control: max-age=0');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
在这里,我们实际上只是将浏览器重定向到 php://output
并下载文件。