В своей профессиональной деятельности я периодически сталкиваюсь с задачами экспорта/генерации данных в формате XLS/XLSX (Excel). Библиотека PhpSpreadsheet позволяет их решить.
Данная библиотека является логичным продолжением библиотеки PHPExcel, которая уже несколько лет не поддерживается.
Скачать и установить библиотеку предлагается с помощью composer:
composer require phpoffice/phpspreadsheet
Сайт: https://phpspreadsheet.readthedocs.io
Опишу реализацию типичных задач.
Обратите внимание, что для корректной работы XMLWriter (библиотеки PHP) необходима корректная его настройка:

Типовой Hello World
<?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 документа через Ajax запрос
Php обработчик генерации XLSX документа:
header('Content-Type: application/json');
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
//some code...
$writer = new Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
$xlsData = ob_get_contents();
ob_end_clean();
echo json_encode('data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,'.base64_encode($xlsData));
JS:
$.ajax({
type:'POST',
url:"...", // path to php handler
data: {...}, // some post data
dataType:'json'
}).done(function(data){
var $a = $("<a>");
$a.attr("href",data);
$("body").append($a);
$a.attr("download","Report.xlsx");
$a[0].click();
$a.remove();
});
Здесь кратко поясню:
PHP обработчик формирует Excel документ и кодирует его в base64. Далее JS создает временную ссылку и в тег «href» кладёт этот закодированный контент. После инициации клика по ссылке происходит скачивание XLSX документа, а сама ссылка удаляется со страницы. Этакая мгновенная генерация Excel документа.
Установка заголовка листа
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Some title');
Добавление текстового контента в ячейку
Можно добавлять по координатам (отчет начинается с единицы):
$sheet = $spreadsheet->getActiveSheet(); //$columnIndex - номер колонки //$row - номер строки //$data - текстовые данные для добавления $sheet->setCellValueByColumnAndRow($columnIndex, $row, $data);
Также можно воспользоваться символьными идентификаторами:
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Some data');
Выравнивание
По координатам:
$sheet->getStyleByColumnAndRow(1,1) ->getAlignment() ->setHorizontal(PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
Через идентификатор ячейки:
$sheet->getStyle('B1')
->getAlignment()
->setHorizontal(PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
Через интервал идентификаторов ячеек:
$sheet->getStyle('B1:B5')
->getAlignment()
->setHorizontal(PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
Установка стиля границы (border) ячейки/ячеек
$borderStyleArray = array(
'borders' => array(
'outline' => array(
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => array('rgb' => '000000'),
),
'horizontal' => array(
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => array('rgb' => '000000'),
),
'vertical' => array(
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => array('rgb' => '000000'),
),
),
);
$sheet->getStyle('F4:J4')->applyFromArray($borderStyleArray);
Объединение ячеек
$sheet->mergeCells('A4:E4');
Заливка ячейки/ячеек цветом
$sheet->getStyle('F4')
->getFill()
->setFillType(PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()
->setRGB('ecf9fd');
p.s. более подробную документацию по PhpSpreadsheet можно найти в самой библиотеке, скачанной с помощью composer-а:
