Работа с Excel в PHP: библиотеки PhpSpreadsheet и OpenSpout

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

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

Начать курс

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

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