Книга SXSSF createSheet() не работает в средах Linux

Пытался реализовать функцию экспорта в Excel с помощью apache POI 3.17.

Все работало нормально на моем локальном сервере Tomcat и в среде разработки Windows. Однако метод SXSSFWorkbook workbook.createSheet() не работает на сервере tomcat linux без каких-либо значимых ошибок (он просто зависает).

Странно, но тот же метод класса XSSFWorkbook createSheet работает нормально. Ниже приведены фрагменты кода. Кто-нибудь сталкивался с подобной проблемой раньше?

    final SXSSFWorkbook workbook = new SXSSFWorkbook();
    workbook.setCompressTempFiles(true);
    SXSSFSheet sheet = workbook.createSheet("Sheet 1"); //this method fails

    final XSSFWorkbook workbook = new XSSFWorkbook();
    Sheet sheet = workbook.createSheet("Sheet 1"); // this works fine

редактировать

Я создал пользовательский TempFileCreationStrategy, чтобы tomcat записывал файл в каталог, к которому у него есть полный доступ. Я вижу, что файл создан, но он зависает, пытаясь записать в него какие-либо данные.

Я не могу понять это.

Edit2

Я включил ведение журнала POI, но я все еще не получаю ничего значимого, что я могу исследовать. На моем локальном сервере регистрация POI выдает следующее, когда начинается запись файла:

[20:13:05,005]DEBUG (?:?) - Save core properties part
[20:13:05,005]DEBUG (?:?) - Save package relationships
[20:13:05,005]DEBUG (?:?) - Save content types part
[20:13:05,005]DEBUG (?:?) - Save part 'docProps/app.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'docProps/core.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'xl/sharedStrings.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'xl/styles.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'xl/workbook.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'xl/worksheets/sheet1.xml'

На коробке Linux это даже не так далеко, как первый вывод журнала. Нужно найти способ получить более подробную информацию о сбое!

Edit3

Можно ли получить более подробное ведение журнала, помимо ведения журнала по умолчанию, которое я включил ниже?

System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.SystemOutLogger" );

String tmpDir = System.getProperty("java.io.tmpdir")+File.separator+"excelfiles";
ExcelFileCreationStrategy tfcs = new ExcelFileCreationStrategy();

try {
    tfcs.createTempDirectory(tmpDir);
} catch (IOException e) {
    e.printStackTrace();
    LOG.error(e);
}

TempFile.setTempFileCreationStrategy(tfcs);

final SXSSFWorkbook workbook = new SXSSFWorkbook();
workbook.setCompressTempFiles(true);

LOG.debug("creating work sheet - next line fails");
Sheet sheet = workbook.createSheet(); //hangs here
LOG.debug("It's worked!!!!");

1 ответ

Я проверял с помощью strace, что происходит под капотом, и соответствующий вывод был:

11924 openat(AT_FDCWD, "/tmp/out.bin", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 48
11924 openat(AT_FDCWD, "/tmp/poifiles/poi-sxssf-template2618545805950425148.xlsx", O_RDWR|O_CREAT|O_EXCL, 0666) = 49
11924 openat(AT_FDCWD, "/tmp/poifiles/poi-sxssf-template2618545805950425148.xlsx", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 49
11924 openat(AT_FDCWD, "/tmp/poifiles/poi-sxssf-template2618545805950425148.xlsx", O_RDONLY) = 49
11924 openat(AT_FDCWD, "/tmp/poifiles/poi-sxssf-sheet-xml261863645047955641.gz", O_RDONLY) = 21

Я думаю, вы должны убедиться, что /tmp/poifiles доступен для записи вашим пользователем. Однако в моем случае, когда я делаю его недоступным для записи, приложение не зависает, а вместо этого выдает IOException,

Или, если ваш java.io.tmpdir не является /tmpЯ думаю, вам нужно убедиться, что ваш poifiles подкаталог внутри java.io.tmpdir доступно для записи.

У меня была та же проблема, и после долгого времени отладки и анализа "ошибка" в том, что при потоковой передаче он пытается использовать шрифт для определения ширины символов для настройки столбцов. Это не удается без сообщения и просто прерывает создание, если шрифт не может быть создан / определен. Единственное решение, которое я смог найти, - это установить пакет fontconfig.

sudo apt-get update
sudo apt-get install fontconfig

К сожалению, без пакета java не может работать с java.awt.Fonts.

Другие вопросы по тегам