Работа с Excel в PHP: библиотеки PhpSpreadsheet и PhpOffice
В современной веб-разработке часто возникает необходимость экспортировать данные в формат Excel, импортировать отчёты или обрабатывать таблицы на серверной стороне. PHP предлагает несколько мощных библиотек для работы с файлами .xlsx, .xls и .ods. В этой статье мы подробно рассмотрим PhpSpreadsheet — современную и активно развивающуюся библиотеку, которая пришла на смену устаревшей PHPExcel.
Что такое PhpSpreadsheet?
PhpSpreadsheet — это библиотека для чтения, записи и редактирования электронных таблиц в различных форматах: Excel, OpenDocument, CSV, HTML и PDF. Она написана на чистом PHP, не требует установки дополнительных расширений (кроме стандартных zip и xml) и поддерживает все основные возможности Excel: стили, формулы, диаграммы, условное форматирование, несколько листов и многое другое.
Установка
Установка производится через Composer:
composer require phpoffice/phpspreadsheet
После установки в проекте появляется папка vendor с автозагрузкой. Для начала работы достаточно подключить автозагрузчик:
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
Создание простого Excel-файла
Рассмотрим базовый пример: создадим файл с заголовками и несколькими строками данных.
// Создаём новый объект Spreadsheet
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Устанавливаем заголовки
$sheet->setCellValue('A1', 'Имя')
->setCellValue('B1', 'Email')
->setCellValue('C1', 'Дата регистрации');
// Заполняем данными
$sheet->setCellValue('A2', 'Иван Иванов')
->setCellValue('B2', 'ivan@example.com')
->setCellValue('C2', '2024-01-15');
$sheet->setCellValue('A3', 'Мария Петрова')
->setCellValue('B3', 'maria@example.com')
->setCellValue('C3', '2024-02-20');
// Сохраняем файл
$writer = new Xlsx($spreadsheet);
$writer->save('users.xlsx');
echo "Файл users.xlsx создан успешно!";
После запуска скрипта в корне проекта появится файл users.xlsx, который можно открыть в Excel или Google Sheets.
Чтение существующего Excel-файла
PhpSpreadsheet позволяет легко читать данные из любого формата. Пример загрузки и вывода содержимого:
$inputFileName = 'users.xlsx';
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
$sheet = $spreadsheet->getActiveSheet();
// Читаем все строки
$data = $sheet->toArray();
foreach ($data as $row) {
echo implode(' | ', $row) . "\n";
}
Метод toArray() возвращает двумерный массив, где первый элемент — строка с индексами 0,1,2… Вы можете обращаться к ячейкам по адресу: $sheet->getCell('A2')->getValue().
Работа со стилями и форматированием
Одна из сильных сторон PhpSpreadsheet — гибкое управление внешним видом таблицы.
$styleArray = [
'font' => [
'bold' => true,
'size' => 12,
'color' => ['argb' => 'FF2E4057'],
],
'fill' => [
'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
'startColor' => ['argb' => 'FFD9E2EC'],
],
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
],
],
];
// Применяем стиль к диапазону
$sheet->getStyle('A1:C1')->applyFromArray($styleArray);
// Автоширина колонок
foreach (range('A','C') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
Экспорт данных из базы в Excel
Часто требуется выгрузить результаты SQL-запроса. Пример с PDO:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT name, email, created_at FROM users');
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Заголовки
$sheet->setCellValue('A1', 'Имя')
->setCellValue('B1', 'Email')
->set