Excel в PHP: читать, писать или заполнять шаблоны — как выбрать инструмент
Вы завели тикет «сделать выгрузку в Excel» (или «принять Excel от пользователя»), пошли в поиск — и первым же ответом получили PhpSpreadsheet. Он умеет всё сразу, и поэтому кажется очевидным выбором. Проблема в том, что «умеет всё» здесь означает «загружает весь файл в объектную модель в памяти» — и на реальных объёмах или в цикле это быстро превращается в Allowed memory size exhausted.
Прежде чем выбирать библиотеку, полезно понять: «работа с Excel» — это не одна задача, а три разные. И под каждую нужен свой инструмент.
Три разные задачи, которые все называют «Excel в PHP»
1. Прочитать чужой файл
Пользователь загрузил прайс, выгрузку из 1С или отчёт — вам нужно достать из него данные: пройтись по строкам, сложить в базу, провалидировать. Здесь важны скорость и память: файл может быть на сотни тысяч строк, а вам нужны только значения.
Вам не нужна вся книга в памяти — нужен потоковый разбор строка за строкой.
2. Создать файл с нуля
У вас есть массив данных из базы, и нужно сложить его в таблицу: заголовки, строки, немного стилей, автоширина, может быть, формулы и диаграмма. Структуру вы задаёте сами из кода — «пишем сверху вниз».
Здесь тоже критична потоковость: отчёт на миллион строк не должен ронять процесс по памяти.
3. Заполнить готовый бланк
А вот это — отдельный случай, который часто пытаются решить не тем инструментом. У вас есть готовый XLSX-бланк (счёт, акт, договор, справка), который нарисовал бухгалтер или дизайнер: с логотипом, рамками, объединёнными ячейками, форматами и формулами. Вам не надо строить документ — надо подставить в него данные, ничего не сломав в оформлении.
Если пытаться решать это через «создать файл с нуля», вы будете вручную переписывать кодом всё оформление, которое уже нарисовано в файле. Это долго, хрупко и бессмысленно.
Семейство FastExcelPhp: по инструменту на задачу
Вместо одного комбайна здесь три лёгкие библиотеки, каждая заточена под свою задачу и построена вокруг потоковой обработки (не держит весь лист в памяти):
- FastExcelReader — задача №1, читать. Потоковый разбор XLSX (а в свежих версиях — и старого
.xls, и CSV). - FastExcelWriter — задача №2, писать с нуля. Стили, формулы, диаграммы, автофильтры — всё из кода.
- FastExcelTemplator — задача №3, заполнять шаблоны. Наш герой в этой статье.
(Есть ещё FastExcelLaravel — обёртка над семейством для Laravel: фасады, импорт-экспорт моделей и коллекций.)
Когда ваша задача — шаблон
Признаки того, что вам нужен именно Templator, а не Writer:
- документ имеет фиксированный фирменный вид, и этот вид проще нарисовать в Excel, чем описать кодом;
- оформлением владеет не программист — бухгалтер, аналитик, — и он должен править бланк сам, без релиза;
- в документе есть логотип, примечания, хитрые рамки, объединения — то, что муторно воспроизводить в коде;
- нужно много одинаковых документов из одного бланка (счета, справки, договоры).
Идея простая: бланк — это обычный XLSX, который вы рисуете руками и размечаете плейсхолдерами. Код только подставляет значения:
use avadim\FastExcelTemplator\Excel;
// Открываем шаблон и указываем, куда писать результат
$excel = Excel::template('invoice-tpl.xlsx', 'invoice-out.xlsx');
$sheet = $excel->sheet();
// Подставляем данные вместо плейсхолдеров в шапке
$sheet->fill([
'{{COMPANY}}' => 'ООО «Ромашка»',
'{{NUMBER}}' => 128,
]);
// Переносим строки шаблона в вывод и сохраняем
$sheet->transferRows();
$excel->save();
Всё оформление — шрифты, рамки, логотип, формат чисел — библиотека переносит из шаблона сама, потому что она сохраняет исходный файл и лишь заменяет в нём значения.
Честная развилка: что взять
Чтобы не ошибиться с выбором, держите короткий чек-лист:
- Надо прочитать данные из чужого файла →
fast-excel-reader. Templator этого не делает. - Надо построить таблицу целиком из кода, готового бланка нет →
fast-excel-writer. Это его работа, а не Templator. - Есть готовый XLSX-бланк, надо подставить в него данные →
fast-excel-templator. - Нужен старый
.xlsкак шаблон → так нельзя: Templator работает только с XLSX (Office 2007+). Пересохраните исходник в.xlsx. - Проект на Laravel и хочется импорт-экспорт моделей → посмотрите
fast-excel-laravelповерх нужной библиотеки.
Ключевая мысль: не тащите комбайн туда, где хватит отвёртки. Если вы поймали себя на том, что кодом воспроизводите оформление уже существующего файла, — вам нужен шаблонный подход, и дальше стоит смотреть в сторону FastExcelTemplator. Как он заполняет бланк по шагам — тема отдельного разбора.