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是可写的。
| 归档时间: |
|
| 查看次数: |
2533 次 |
| 最近记录: |