Добавить в корзинуПозвонить
Найти в Дзене

Опасности Apache POI

Опасности Apache POI 📍 Наверняка многие из вас юзают Apache POI. Для тех, кто не знает: это джаванская либа для работы с файлами Microsoft Office и OOXML — всякие Excel, Word и прочее. А в чём опасность? При генерации Excel-файла эта библиотека позволяет включить отслеживание ширины данных в колонках и автоподгонку ширины столбцов под содержимое (чтобы данные не скрывались из-за маленькой ширины столбца по умолчанию). Включается это так: // Отслеживаем ширину для автосайзинга sheet.trackAllColumnsForAutoSizing(); // ... генерируем строки Excel-файла // Автосайзим столбцы sheet.autoSizeColumn(columnIndex); Проблема: эта тема крайне ресурсоёмкая на больших объёмах данных. На тесте с 100 строками — всё быстро. На проде с 600К строк — 20 минут превращаются в 4 часа. 4 часа, Карл! Чего оно там делает вообще?!) У нас такое не раз уезжало в прод и штука эта совсем неприятная я вам скажу: - Отчёт не собирается вовремя; - Заказчик негодует; - Паника, крики — в общем, ну его этот трекинг!

Опасности 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’ник в память при генерации, надеюсь вы все этим пользуетесь ибо обратное дико некармическая тема)) Знаете ж как?