Работа с Excel в PHP: библиотеки PhpSpreadsheet, PhpOffice и генерация XLSX

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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                    

Рекомендаций