gpt4 book ai didi

java - SXSSF 工作簿 createSheet() 在 Linux 环境中失败

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:41 26 4
gpt4 key购买 nike

正在尝试使用 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

编辑

我创建了一个自定义 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'

在 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!!!!");

最佳答案

我已经用 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 是可写的。

关于java - SXSSF 工作簿 createSheet() 在 Linux 环境中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com