SXSSF 工作簿 createSheet() 在 linux 环境中失败

sha*_*o86 6 java logging apache-poi sxssf

试图在使用 apache POI 3.17 的应用程序上实现 excel 导出功能。

在我的本地 tomcat 服务器和 Windows 开发环境中一切正常。但是,SXSSFWorkbook workbook.createSheet() 方法在 linux tomcat 服务器上失败,而不会抛出任何有意义的错误(它只是挂起)。

奇怪的是,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
Run Code Online (Sandbox Code Playgroud)

编辑

我创建了一个自定义TempFileCreationStrategy以确保 tomcat 将文件写入它具有完全访问权限的目录。我可以看到文件已创建,但它在尝试将任何数据写入文件时挂起。

我无法弄清楚这一点。

编辑2

我已经启用了 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'
Run Code Online (Sandbox Code Playgroud)

在 Linux 机器上,它甚至没有达到第一个日志输出。需要找到一种方法来获取有关失败的更多详细信息!

编辑3

除了我在下面启用的默认日志记录之外,是否可以获得更详细的日志记录?

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!!!!");
Run Code Online (Sandbox Code Playgroud)

小智 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
Run Code Online (Sandbox Code Playgroud)

我想您需要确保/tmp/poifiles您的用户可写。然而,就我而言,当我将其设置为不可写时,应用程序不会挂起,而是抛出IOException.

或者,如果你的java.io.tmpdir不是/tmp,我想你需要确保你的poifiles子目录java.io.tmpdir是可写的。