Чтобы ответить на ваш вопрос, да, POI всегда будет использовать очень большой объем памяти при работе с большими файлами XLSX, который намного больше размера файлов XLSX. Я не думаю, что это изменится в ближайшее время, и для этого есть довольно очевидные причины: XLSX - это, в основном, множество zipped-файлов XML, а XML очень хорошо сжат (около 10x). Получение этого XML просто для того, чтобы сидеть в несжатой памяти, уже увеличило бы потребление памяти в десять раз, поэтому, если вы добавите все накладные расходы структур данных, вы не сможете ожидать увеличения объема памяти в размере XLSX на 10%.
Теперь хорошая новость заключается в том, что, как упоминалось в комментариях, Apache POI представил SXSSF для потоковой передачи очень большого объема данных в электронной таблице с очень хорошей производительностью и низким объемом использования памяти. Файлы XLSX, созданные таким образом, по-прежнему передаются на жесткий диск, где они могут в конечном итоге занимать довольно много места, но по крайней мере вы не рискуете OOME при написании сотен тысяч строк.
Проблема в том, что вы не сможете заставить JETT напрямую работать с SXSSF, поскольку для выполнения заполнения шаблона требуется весь документ, загруженный в память. Автор JETT быстро обсудил этот вопрос here.
У меня была такая же проблема, и в конечном итоге делает создание XLSX двухступенчатый:
Стандартный шаблон Джетт XLSX для создания заголовков и форматирования. Последняя строка первого листа содержит ячейки с $$ tokens $$, по одному на ячейку. Я не использую JETT для вставки большого количества строк.
После того, как JETT выполнил свою работу, я снова открываю книгу, читаю, а затем удаляю $$ tokens $$ в последней строке первой электронной таблицы и запускаю потоковые данные с помощью строки SXSSF.
Конечно, есть ограничения этого подхода: - Вы не можете использовать Джетта на любом из потоковых строк при вставке строк (но вы можете перед тем, чтобы динамически выбрать порядок $$ лексем $$ например) - Формат ячеек не будет скопирован, если вы сами не позаботитесь об этом с помощью API POI. Я лично предпочитаю форматировать целые столбцы в моем XLSX-файле, и он будет применяться к потоковым данным.
Это также работает, если вы хотите отображать диаграммы с использованием данных, вставленных в SXSSF: вы можете определить Именованный диапазон с функциями OFFSET и COUNTA, а затем создать сводную таблицу & Сводная диаграмма, которая будет обновлена при открытии XLSX в Excel ,
Этот вопрос очень расплывчатый, но убедитесь сами, что произошло в выпуске: http://poi.apache.org/changes.html. Похоже, он не был явно рассмотрен. –
Независимо от того, что вы делаете, для работы с '.xlsx' потребуется больше файлов памяти или temp, чем' .xls', поскольку накладные расходы всего XML и сжатия выше, чем двоичные форматы. – Gagravarr
@James: знайте, как быть менее расплывчатым. Накладные расходы около 10% кажутся разумными, накладные расходы на 10 000% - нет. Я пытаюсь выяснить, есть ли накладные расходы памяти примерно на 10 000%, как раньше, или если он ближе к 10%. –