Опасности Apache POI 📍
Наверняка многие из вас юзают Apache POI. Для тех, кто не знает: это джаванская либа для работы с файлами Microsoft Office и OOXML — всякие Excel, Word и прочее.
А в чём опасность?
При генерации Excel-файла эта библиотека позволяет включить отслеживание ширины данных в колонках и автоподгонку ширины столбцов под содержимое (чтобы данные не скрывались из-за маленькой ширины столбца по умолчанию).
Включается это так:
// Отслеживаем ширину для автосайзинга
sheet.trackAllColumnsForAutoSizing();
// ... генерируем строки Excel-файла
// Автосайзим столбцы
sheet.autoSizeColumn(columnIndex);
Проблема: эта тема крайне ресурсоёмкая на больших объёмах данных. На тесте с 100 строками — всё быстро. На проде с 600К строк — 20 минут превращаются в 4 часа. 4 часа, Карл! Чего оно там делает вообще?!)
У нас такое не раз уезжало в прод и штука эта совсем неприятная я вам скажу:
Отчёт не собирается вовремя;
Заказчик негодует;
Паника, крики — в общем, ну его этот трекинг! 😅
Что делать?
В 99% случаев: достаточно автосайзинга только для заголовков:
// Включаем автосайзинг
sheet.trackAllColumnsForAutoSizing();
// Генерируем заголовки
//...
// Автосайзим колонки
sheet.autoSizeColumn(columnIndex);
// Выключаем трекинг
sheet.untrackAllColumnsForAutoSizing();
//... продолжаем генерацию
В 1% случаев: нужно отавтосайзить 1-2 столбца из сотен. Тогда делаем точечный трекинг:
// Трекинг только нужных колонок
sheet.trackColumnForAutoSizing(columnIndex);
// ... генерация данных
// Автосайзим
sheet.autoSizeColumn(columnIndex);
Ну и можно конечно вручную задавать ширину столбцов, но это не всегда удобно.
P.S. Метод autoSizeColumn() очень тяжёлый. Выдержка из джавадоки:
Этот процесс может быть медленным на больших листах, поэтому его стоит вызывать только один раз для каждого столбца в конце обработки.
P.S.S. Еще кстати поя умеют не буферизовать весь excel’ник в память при генерации, надеюсь вы все этим пользуетесь ибо обратное дико некармическая тема)) Знаете ж как?
Приходите к телегу, там обсуждаем наши кровавые энтерпрайзы: https://t.me/umenyarabotaet