Обновить

Опасности 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

Теги:
Всего голосов 3: ↑2 и ↓1+2
Комментарии5

Разбираемся с витамином D — пить или нет?

Инженер производства приносит анализ:

25(OH)D — 22 нг/мл // ниже нормы

Лицо у него как у человека, которому сообщили, что в нём зародилась новая жизнь, и это глисты.

Казалось бы, пускай дойдёт до врача, ему там назначат витамин D по 50 тысяч единиц раз в неделю в капсуле, и пускай не страдает. Но прикол в том, что рекомендаций аж три штуки:

— Старые мирового эндокринологического сообщества, где витамин надо пить. Они в большинстве случаев основаны на наблюдательных исследованиях (корреляциях, а не причинно-следственных цепочках), и там есть конфликт интересов. Упрощая, они говорят, что витамин D лечит примерно всё. Простуда? Низкий D. Усталость, хандра, плохой сон? D. Рак, диабет, давление — D мог бы помочь. Раз у больных людей этого витамина в крови мало, значит, дефицит и есть проблема.

— Новые мирового эндокринологического сообщества, где убрали все наблюдательные исследования, и получилось, что пить надо при совсем уже лютых дефицитах. Упрощая — эти говорят, что если бы первые не производили эти добавки, их, возможно, и послушали бы. Организм сам синтезирует достаточно, а остальным вы просто дорого писаете. Но есть краевые случаи, по ним хорошая клиническая база.

— И наши отечественные рекомендации, которые сделаны с учётом того, что Россия — очень большая страна, в которой есть регионы с короткой солнечной активностью. Пить надо, но пороги другие.

Давайте разбираться.

Разбираемся с витамином D — пить или нет?

Публикации