【发布时间】:2018-08-05 23:01:23
【问题描述】:
正在尝试在使用 apache POI 3.17 的应用上实现 excel 导出功能。
在我的本地 tomcat 服务器和 Windows 开发环境上一切正常。但是,SXSSFWorkbook workbook.createSheet() 方法在 linux tomcat 服务器上失败,没有抛出任何有意义的错误(它只是挂起)。
奇怪的是,XSSFWorkbook createSheet 类上的相同方法可以正常工作。下面是代码的sn-ps。有没有人遇到过类似的问题?
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!!!!");
【问题讨论】:
-
你可以在问题挂起时添加堆栈跟踪吗? IE。通过 jstack
? -
某处一定有例外。浏览所有相关的日志文件。
SXSSFWorkbook默认使用System.getProperty("java.io.tmpdir")中的临时文件。也许访问这是问题所在? -
SXSSF 在 Linux 上运行良好,因为这是所有 Apache POI 持续集成单元测试的默认平台!您一定是在该特定机器上错误配置了 Tomcat 或 Java
-
@AxelRichter 所有日志都转储到 catalina.out 文件中,但我确实没有看到任何异常。我将其配置为写入我自己的自定义目录,确保 tomcat 具有完全的 rw 访问权限。它创建一个 .xml 文件,该文件是流操作的一部分,但似乎没有将任何数据写入文件。它在这一点上挂起。我被难住了!
-
“它创建了一个 .xml 文件”:这令人惊讶。由于您使用的是
workbook.setCompressTempFiles(true);,它应该创建一个*.gz文件而不是*.xml文件。确定我们在谈论相同的代码?
标签: java logging apache-poi sxssf