При заполнении различных отчетов на сайтах, часто появляется необходимость позволить пользователям загружать на свой ПК сформированный отчет в формате Excel.

Динамическая загрузка 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-таблицу и отправляет ее на загрузку в браузер. Пользователю лишь остается открыть файл.