Динамическая загрузка Excel-файла, созданного с помощью PHPSpreadsheets

При заполнении различных отчетов на сайтах, часто появляется необходимость позволить пользователям загружать на свой ПК сформированный отчет в формате Excel.
В одной из прошлых статей мы обсуждали как создать файл Excel, используя библиотеку PHPSpreadsheet, а в этой я покажу, как при нажатии на ссылку сформировать Excel-файл и отправить его на загрузку в браузер пользователя.
Итак, для начала установим саму библиотеку PHPSpreadsheet:
$ composer require phpoffice/phpspreadsheet
Затем создадим файл script.php со следующим содержимым:
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
const REPORT_FILE_NAME = "отчет_по_закупкам.xlsx";
if (isset($_GET['report'])) {
// (1) создаем новую книгу
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// (2) здесь генерируется отчет
$sheet->setCellValue('A1', 'Отчет сформирован');
// (3) а здесь заголовки отправляются в браузер
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // формат файла
header('Content-Disposition: attachment;filename="' . REPORT_FILE_NAME .'"'); // название файла при загрзуке
header('Cache-Control: max-age=0');
header('Expires: Fri, 12 Nov 2012 12:11:22 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: cache, must-revalidate');
header('Pragma: public');
$writer->save('php://output'); // отправляем в браузер;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<a href="?report=<?php print(REPORT_FILE_NAME); ?>">Скачать</a>
</body>
</html>
Запустим пример на локальном сервере:
$ php -S localhost:9999 script.php
При нажатии на ссылку, PHP-скрипт динамически формирует Excel-таблицу и отправляет ее на загрузку в браузер. Пользователю лишь остается открыть файл.
-
-
Михаил Русаков
Комментарии (3):
Спасибо за статью. А есть ли вариант онлайн эксель документ редактировать как аналог гугл таблиц?.
Ответить
Здравствуйте. Для этого надо распарсить и загрузить Excel в окно браузера. Редактирование будет осуществляться средствами JavaScript, полученный результат отправлять на сервер, к примеру, для сохранения и последующей загрузки пользователем
Ответить
код не работает. В файл xls заносится код html и всё. Разобрался. После $writer->save('php://output'); надо обязательно поставить exit(); вот так. $writer->save('php://output'); // отправляем в браузер; exit(); Тогда будет работать. И после заголовков использовать ob_end_clean(); //чтобы очистить буфер
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.