Как работает «новый PhpOffice \ PhpSpreadsheet \ Spreadsheet ()» - PullRequest
0 голосов
/ 08 марта 2019

У меня есть простой код в следующем виде ( документы ):

// 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 в первой ячейке и первом столбце.

Что я пропустил?Этот код должен содержаться в своем собственном файле?

1 Ответ

1 голос
/ 08 марта 2019

Есть несколько проблем с вашим кодом.

Расположение кода

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

Кроме того, любой header() -вход должен быть перед любым выводом совсем.Сначала отправляются заголовки, затем контент.Поэтому, если вы уже вывели контент, вы не можете отправлять дополнительные заголовки.

Решения:
Переместите свой код в его собственный файл или переместите его в начало текущегофайл (перед любым другим выводом, таким как 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');
...