Книга 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.