Работа с Excel в PHP: обзор библиотек PhpSpreadsheet и OpenSpout
Работа с электронными таблицами Excel — одна из самых частых задач в веб-разработке на PHP. Будь то генерация отчётов, импорт данных из бухгалтерских систем или экспорт статистики для клиентов — без инструментов для работы с форматами .xlsx и .xls не обойтись. В этой статье мы рассмотрим две самые популярные PHP-библиотеки: PhpSpreadsheet (преемник знаменитой PHPExcel) и OpenSpout (лёгкая альтернатива для больших файлов).
PhpSpreadsheet — мощный и функциональный инструмент
PhpSpreadsheet — это библиотека от проекта PHPOffice, которая позволяет читать, создавать и модифицировать файлы Excel (XLSX, XLS, ODS, CSV и другие). Она поддерживает стилизацию ячеек, формулы, диаграммы, условное форматирование и даже работу с макросами.
Установка PhpSpreadsheet
Установка выполняется через Composer:
composer require phpoffice/phpspreadsheet
Пример: создание простого Excel-файла
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Заполняем данные
$sheet->setCellValue('A1', 'ID');
$sheet->setCellValue('B1', 'Имя');
$sheet->setCellValue('C1', 'Email');
$sheet->setCellValue('A2', 1);
$sheet->setCellValue('B2', 'Иван Петров');
$sheet->setCellValue('C2', 'ivan@example.com');
// Стилизация заголовка
$styleArray = [
'font' => ['bold' => true, 'size' => 14],
'fill' => ['fillType' => 'solid', 'startColor' => ['rgb' => 'E0E0E0']]
];
$sheet->getStyle('A1:C1')->applyFromArray($styleArray);
// Сохраняем файл
$writer = new Xlsx($spreadsheet);
$writer->save('users.xlsx');
echo "Файл users.xlsx создан!";
?>
Чтение существующего Excel-файла
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
$inputFileName = 'users.xlsx';
$spreadsheet = IOFactory::load($inputFileName);
$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getRowIterator() as $row) {
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);
$rowData = [];
foreach ($cellIterator as $cell) {
$rowData[] = $cell->getValue();
}
echo implode(' | ', $rowData) . "<br>";
}
?>
OpenSpout — лёгкость и скорость для больших данных
OpenSpout — это библиотека, созданная для работы с большими объёмами данных (сотни тысяч строк). В отличие от PhpSpreadsheet, она не загружает весь файл в память, а обрабатывает его потоково. Это делает её идеальной для экспорта/импорта объёмных отчётов. OpenSpout поддерживает форматы XLSX, CSV и ODS.
Установка OpenSpout
composer require openspout/openspout
Пример: экспорт 100 000 строк в XLSX
<?php
require 'vendor/autoload.php';
use OpenSpout\Writer\XLSX\Writer;
$writer = new Writer();
$writer->openToFile('big_export.xlsx');
// Заголовки
$writer->addRow(['ID', 'Имя', 'Email']);
for ($i = 1; $i <= 100000; $i++) {
$writer->addRow([$i, "Пользователь $i", "user$i@example.com"]);
}
$writer->close();
echo "Файл big_export.xlsx с 100 000 строк создан!";
?>
Чтение большого файла с OpenSpout
<?php
require 'vendor/autoload.php';
use OpenSpout\Reader\XLSX\Reader;
$reader = new Reader();
$reader->open('big_export.xlsx');
foreach ($reader->getSheetIterator() as $sheet) {
foreach ($sheet->getRowIterator() as $row) {
$cells = $row->getCells();
echo implode(' | ', array_map(function($cell) {
return $cell->getValue();
}, $cells)) . "<br>";
}
}
$reader->close();
?>
Сравнение PhpSpreadsheet и OpenSpout
-
<