Apache POI SXSSFWorkbook createSheet() возвращает исключение NullPointerException

#apache-poi #xlsx #xls

#apache-poi #xlsx #xls

Вопрос:

Я использую SXSSFWorkbook для потоковой передачи большого объема данных (~ 990 тыс. записей), которые должны быть записаны в файл XLS. Проблема со следующим кодом заключается в том, что он развертывается на сервере Linux. На моем локальном компьютере (win 10 x64) работает так, как ожидалось. Версия Apache POI — 4.1.2.

 Workbook wb = new SXSSFWorkbook(SXSSFWorkbook.DEFAULT_WINDOW_SIZE);
Sheet sheet = wb.createSheet(); <-- NPE
  

Вот фрагмент журнала

 at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:273)
at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:684)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:676)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:88)
at com.odfl.altair.controller.MyController.selectAll(MyController.java:211)
  

Как вы можете видеть в MyController в строке 211, у меня есть вызов метода createSheet(). Я пробовал createSheet() и createSheet(«Имя листа»).

Спасибо

Комментарии:

1. У вас все шрифты установлены в linux box? Похоже, что это может привести к сбою при попытке определить ширину столбцов на основе используемого шрифта

2. Вы правы. Я установил шрифты и теперь работает! Спасибо!

Ответ №1:

У меня была такая же проблема в моем контейнере docker на основе alpaine (там нет обязательных шрифтов). Миграция на образ на основе ubuntu устранила проблему.

для контейнера на основе alpaine вам следует добавить некоторые шрифты и библиотеки в ваш Dockerfile. У меня это сработало с:

 apk add curl bash wget fontconfig ttf-dejavu freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev freetype-dev libjpeg-turbo-dev libpng-dev
  

Комментарии:

1. Помощь в будущих поисках Google здесь: это Alpine Linux. Я столкнулся с той же проблемой в контейнере Docker. Решаемая путем установки fontconfig и ttf-dejavu через «apk add».

2. Не могли бы вы подробнее рассказать о том, как добавить эту строку в Dockerfile?