PHPOffice пишет новый файл фатальные ошибки - PullRequest
1 голос
/ 12 марта 2019

Я использую эту библиотеку для создания .xlsx файлов из моего PHP скрипта.

Следуя этому руководству, я попытался экспортировать некоторые данные в файл с именем hello.xlsx.

Однако, это ошибки с сообщениями ниже:

Предупреждение: ZipArchive :: close (): Ошибка создания временного файла: отказано в доступе в вендоре / phpoffice / phpspreadsheet / src / PhpSpreadsheet / Writer

Неустранимая ошибка: Uncaught PhpOffice \ PhpSpreadsheet \ Writer \ Exception: Не удалось закрыть zip-файл hello.xlsx. в вендоре / phpoffice / phpspreadsheet / src / PhpSpreadsheet / Writer / Xlsx.php в строке 399

PhpOffice \ PhpSpreadsheet \ Writer \ Exception: Не удалось закрыть zip-файл hello.xlsx. в /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php в строке 399

Файл не существует до выполнения, поэтому я вроде как получаю ошибки. Я всегда мог попытаться touch hello.xlsx и изменить свой сценарий, чтобы прочитать этот файл и добавить данные, но на самом деле я пытаюсь написать новый файл каждый раз, когда запускается сценарий.

Вот мой (упрощенный) код:

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.");
}

Для меня это не совсем полезное сообщение для отладки того, что идет не так.

Я нашел несколько ТАК сообщений на этом:

Принятый ответ, к сожалению, не сработал (изменил код на $writer->save($_SERVER['DOCUMENT_ROOT']. '/hello.xlsx')).

Я также попробовал функцию SaveFiaTempFile, но она просто выводит кучу забавных персонажей.

Я также не хочу устанавливать для моей папки / файла права доступа 777, поскольку это безумие в мембране.

Этот принятый ответ на самом деле не говорит о том, что правильно делать ИМО, кроме смены владельцев, но ... что менять на что?

Так, как мне решить проблему / устранить неполадку без особых усилий?

Спасибо:)

UPDATE

Так что я решил что-то перепроверить, я создал папку в моем project_root с именем tmp. Я изменил свой код для записи на $_SERVER['DOCUMENT_ROOT']. '/tmp/hello.xlsx', и он по-прежнему выдавал ошибки.

Тем не менее, я подумал: " Эй, давайте просто откроем это для шуток " и, к моему удивлению, все данные есть, все кажется нормальным ... но по какой-то причине он все равно получает ошибку вместо всплывающее окно загрузки в моем браузере ..

1 Ответ

2 голосов
/ 12 марта 2019

Я нашел решение для создания динамических файлов 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 и скачиваем файл.

...