Пакет Fast Excel зазнав суттєвих змін з моменту огляду Laravel News у 2020 році. Тоді йшлося про версію 2.2 з можливістю експорту колекцій, завантаження файлів у браузері та роботи з багатоаркушними книгами. Fast Excel 5 тепер включає ледачий імпорт, інструменти для розподілу роботи зі spreadsheet між джобами, вибір аркушів і колонок, а також безпечнішу обробку експортованих значень, які контролюються користувачами.
Останні релізи роблять Fast Excel більш придатним для великих операційних імпортів, а не лише простих звітів. Пакет як і раніше використовує OpenSpout замість спроб охопити всі можливості формату Excel, що дозволяє зосередитися на читанні та записі рядків з низьким споживанням пам'яті.
Ключові можливості версії 5.x
importLazy() - читає рядки через LazyCollection
headerRow(), startRow() та limitRows() - підтримують chunked імпорт
sheet() та onlyColumns() - вибирають потрібні дані для імпорту
escapeFormulas() - записує формулоподібні значення як текст
Ледачий імпорт для великих файлів
Метод import() повертає колекцію, що містить усі імпортовані рядки. Для великого завантаження це може використовувати більше пам'яті, ніж доступно PHP-процесу. importLazy() видає рядки через LazyCollection, тому застосунок може батчити роботу з базою даних без утримання всього файлу в пам'яті:
use App\Models\Contact;
use Illuminate\Support\LazyCollection;
use Rap2hpoutre\FastExcel\FastExcel;
(new FastExcel)->importLazy('contacts.xlsx')
->chunk(1_000)
->each(function (LazyCollection $contacts) {
Contact::insert($contacts->all());
});
Fast Excel 5.12 представив importLazy() разом зі змінами потокового експорту. Власний бенчмарк пакета порівнює експорт через генератор з матеріалізованою колекцією. Для імпорту CSV такий підхід може замінити частину ручного парсингу, який використовується при обробці великих CSV-файлів.
Chunked імпорт зі стабільними заголовками
Новіші засоби імпорту допомагають, коли один queued джоб повинен обробити частину spreadsheet. headerRow() зчитує ключі з фактичного рядка заголовків, тоді як startRow() вибирає, де починається поточний chunk, а limitRows() обмежує його розмір:
use Rap2hpoutre\FastExcel\FastExcel;
$rows = (new FastExcel)
->headerRow(1)
->startRow(2 + ($page * 1_000))
->limitRows(1_000)
->import('orders.xlsx');
До Fast Excel 5.17 метод startRow() також трактував обраний рядок як заголовки. Тому наступний chunk міг використовувати рядок даних як ключі. headerRow() розділяє ці позиції та залишає стару поведінку startRow() незмінною, якщо ви не активуєте нову логіку явно. Метод додано в pull request #418.
Вибір аркушів та колонок
Пакет може вибирати аркуш за назвою та зберігати лише потрібні для імпорту колонки:
use Rap2hpoutre\FastExcel\FastExcel;
$orders = (new FastExcel)
->sheet('Orders')
->onlyColumns(['A', 'B', 'H'])
->import('customer-export.xlsx');
onlyColumns() приймає літери колонок або позиції на основі одиниці. Це дозволяє уникнути повернення порожніх полів з аркушів, де форматування було застосовано далеко за межами реальних даних. limitColumns() доступний, коли імпорт потребує всіх колонок до певної позиції. Ці опції з'явилися у Fast Excel 5.16, яка також додала можливість передавати екземпляр OpenSpout cell як значення експорту (pull request #419).
Екранування spreadsheet формул
Додатки для роботи з електронними таблицями можуть інтерпретувати значення, що починаються з =, +, - або @, як формули. Коли ці значення походять із завантаженого CSV або поля бази даних, контрольованого користувачами, експорт звіту може перетворити простий текст на формулу при відкритті файлу.
Викличте escapeFormulas() перед експортом, щоб записати ці значення як текст:
use Rap2hpoutre\FastExcel\FastExcel;
(new FastExcel($rows))
->escapeFormulas()
->export('orders.xlsx');
Fast Excel 5.17 додав цей метод у pull request #411.
Сумісність та встановлення
Fast Excel 5 вимагає PHP 8.0 або новішої версії та Laravel 6 або новішої. Поточний реліз підтримує Laravel 6-13 і використовує OpenSpout 4. Застосунки, які все ще використовують Laravel 5 або PHP 7, підтримувані Fast Excel 2, повинні окремо планувати оновлення залежностей.
Історія основних версій включає перехід від box/spout до openspout/openspout та вимогу PHP 8 у Fast Excel 5. Проєкти, що використовують ранні релізи Fast Excel, повинні перевірити ці зміни залежностей перед оновленням.
Встановлення Fast Excel через Composer:
composer require rap2hpoutre/fast-excel
Документація та вихідний код доступні в репозиторії GitHub проєкту.