Работа с Excel в PHP: обзор лучших библиотек
Обработка электронных таблиц — одна из частых задач в веб-разработке. На PHP существует несколько проверенных инструментов для создания, чтения и редактирования файлов Excel. В этой статье мы рассмотрим две ключевые библиотеки: PhpSpreadsheet (преемник популярного PHPExcel) и легковесную OpenSpout, предназначенную для быстрой записи и чтения больших файлов.
1. Установка через Composer
Обе библиотеки устанавливаются стандартным менеджером пакетов Composer. Выполните в терминале в корне проекта:
# Для PhpSpreadsheet (полнофункциональная работа с Excel)
composer require phpoffice/phpspreadsheet
# Для OpenSpout (высокая производительность на больших данных)
composer require openspout/openspout
После установки подключите автозагрузку в начале скрипта:
require_once __DIR__ . '/vendor/autoload.php';
2. PhpSpreadsheet: создание и стилизация Excel-файлов
Библиотека поддерживает форматы XLSX, XLS, ODS, CSV и другие. Позволяет управлять стилями, объединять ячейки, вставлять изображения и формулы.
Пример: создание простого отчета
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Заголовки
$sheet->setCellValue('A1', 'Товар');
$sheet->setCellValue('B1', 'Количество');
$sheet->setCellValue('C1', 'Цена, руб.');
// Данные
$data = [
['Ноутбук', 5, 45000],
['Монитор', 10, 15000],
['Клавиатура', 20, 2500],
];
$row = 2;
foreach ($data as $item) {
$sheet->setCellValue("A{$row}", $item[0]);
$sheet->setCellValue("B{$row}", $item[1]);
$sheet->setCellValue("C{$row}", $item[2]);
$row++;
}
// Формула итога
$sheet->setCellValue("A{$row}", 'Итого');
$sheet->setCellValue("C{$row}", "=SUM(C2:C" . ($row-1) . ")");
// Стилизация заголовков
$styleHeader = [
'font' => ['bold' => true, 'size' => 12],
'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER],
'fill' => ['fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, 'color' => ['rgb' => 'E0E0E0']]
];
$sheet->getStyle('A1:C1')->applyFromArray($styleHeader);
// Автоширина столбцов
foreach (range('A', 'C') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
// Сохранение
$writer = new Xlsx($spreadsheet);
$writer->save('report.xlsx');
echo "Файл report.xlsx создан!";
Чтение существующего XLSX-файла
use PhpOffice\PhpSpreadsheet\IOFactory;
$inputFileName = 'example.xlsx';
$spreadsheet = IOFactory::load($inputFileName);
$sheet = $spreadsheet->getActiveSheet();
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
for ($row = 1; $row <= $highestRow; $row++) {
$rowData = $sheet->rangeToArray("A{$row}:{$highestColumn}{$row}", NULL, TRUE, FALSE);
echo implode(', ', $rowData[0]) . "<br>";
}
3. OpenSpout: быстрая работа с большими таблицами
OpenSpout оптимизирован для потоковой записи и чтения. Он не поддерживает стили и формулы, но идеален для экспорта тысяч строк данных (например, выгрузка из БД).
Пример: запись 10 000 строк в CSV/XLSX
use OpenSpout\Writer\XLSX\Writer;
use OpenSpout\Common\Entity\Row;
$writer = new Writer();
$writer->openToFile('big_export.xlsx');
// Заголовки
$headerRow = Row::fromValues(['ID', 'Имя', 'Email']);
$writer->addRow($headerRow);
for ($i = 1; $i <= 10000; $i++) {
$row = Row::fromValues([$i, "User{$i}", "user{$i}@example.com"]);
$writer->addRow($row);
}
$writer->close();
echo "Экспорт завершен!";
Чтение большого XLSX-файла построчно
use OpenSpout\Reader\XLSX\Reader;
$reader = new Reader();
$reader->