PhpSpreadsheet - скачать файл вместо его сохранения - PullRequest
0 голосов
/ 21 ноября 2019

Мне нужно сгенерировать файл Excel (xls) и инициировать загрузку после его создания. Я нашел этот пример в документации .

<?php

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');

$writer = new Xlsx($spreadsheet);
$writer->save('hello world.xlsx');

. Здесь показано, как создать файл Excel и сохранить его на сервере. Как я могу вместо этого передать результат клиенту и «заставить» его загрузить? Мне нужно как-то получить данные $writer.

Я сейчас решаю их без PhpSpreadsheet:

// Excel Export 
    $filename = 'export_'.date('d-m-y').'.xls';
    $filename = $validator->removeWhitespace($filename);

    header('Content-type: application/ms-excel');
    header('Content-Disposition: attachment; filename='.$filename);
    exit($response["output"]);  // <-- contains excel file content

Но это не работает с моим разделителем (точка с запятой). Точка с запятой не интерпретируется, и все записывается в один столбец.

enter image description here

Если я экспортирую его как .csv, то это сработает. Но мне нужно это как .xls или .xlsx

1 Ответ

0 голосов
/ 21 ноября 2019

Я решил это с обходным путем. Я временно сохраняю файл на сервере, затем загружаю содержимое в переменную и выполняю функцию файла загрузки. Затем я удаляю файл с сервера.

Обходной путь:

$date = date('d-m-y-'.substr((string)microtime(), 1, 8));
$date = str_replace(".", "", $date);
$filename = "export_".$date.".xlsx";

try {
    $writer = new Xlsx($response["spreadsheet"]);
    $writer->save($filename);
    $content = file_get_contents($filename);
} catch(Exception $e) {
    exit($e->getMessage());
}

header("Content-Disposition: attachment; filename=".$filename);

unlink($filename);
exit($content);
...