java-Apache POI SXSSFWorkbook无法创建工作表
在我的项目中,在一个更大的代码流中,我试图创建一个空白的SXSSFWorkbook,创建工作表并向其中写入数据,但我无法这样做,因为它给了我一个运行时异常:没有这样的文件或目录。我不明白为什么会这样。我检查了代码,找不到任何原因 使用的罐子:java-Apache POI SXSSFWorkbook无法创建工作表,java,excel,apache-poi,Java,Excel,Apache Poi,在我的项目中,在一个更大的代码流中,我试图创建一个空白的SXSSFWorkbook,创建工作表并向其中写入数据,但我无法这样做,因为它给了我一个运行时异常:没有这样的文件或目录。我不明白为什么会这样。我检查了代码,找不到任何原因 使用的罐子: poi-3.10-FINAL.jar poi-ooxml-3.10-FINAL.jar java.lang.RuntimeException:java.io.IOException:没有这样的文件或目录 位于org.apache.poi.xssf.str
poi-3.10-FINAL.jar
poi-ooxml-3.10-FINAL.jar
java.lang.RuntimeException:java.io.IOException:没有这样的文件或目录
位于org.apache.poi.xssf.streaming.sxsfworkbook.createandregistersxsfsheet(sxsfworkbook.java:568)
在org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:584)上
代码:
csvDataWorkbook = new SXSSFWorkbook(-1);
Sheet sheet = csvDataWorkbook.createSheet("csvDataSheet");
上面的第二行抛出该异常。听起来可能有点奇怪,但这在昨天之前一直运作良好,但从今天起就停止了
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>
com公司
项目
0.0.1-快照
战争
.......
org.apache.poi
poi
3.10-决赛
org.apache.poi
poi草稿行
3.10-决赛
org.apache.poi
poi ooxml
3.10-决赛
dom4j
dom4j
1.6.1
org.apache.poi
poi ooxml模式
3.10-决赛
如果在Apache上运行,请检查临时文件夹是否存在
可以在tomcat bin文件夹内的tomcat7w.exe中找到
参考下图,
-Djava.io.tmpdir=
如果该选项不可用,请尝试创建它 如果在Apache上运行,请检查临时文件夹是否存在 可以在tomcat bin文件夹内的tomcat7w.exe中找到 参考下图, -Djava.io.tmpdir=
如果该选项不可用,请尝试创建它 在使用不同上下文运行集成测试时,我遇到了一个确切的问题 POI中有一个bug SXSSF在使用org.apache.poi.util.TempFile类保存时创建临时文件。首次创建tempfile时,目录名保存在此类中的静态singleton DefaultTempFileCreationStrategy对象中。此目录仅在第一次保存时创建,并在虚拟机退出时自动删除,并且从不检查此目录是否仍然存在
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();
}
因此,如果有两个应用程序同时加载和保存excels,然后关闭其中一个,则此目录将自动删除。现在两个应用程序使用完全相同的临时目录。因此,如果您试图将文件保存在第二个仍处于打开状态的应用程序中,当它试图在不再存在的目录中创建tmp文件时,会引发IOException
有关更多详细信息,请检查-SXSSF保存有时会失败,因为临时文件创建失败
可能的解决办法:
- 使用临时文件夹“java.io.tmpdir”而不是其子文件夹“poifiles”
- 为每个进程使用唯一的临时文件夹名称,而不是“poifiles”
- 永远不要删除子文件夹“poifiles”李>
- 仅当用户明确设置了相应的系统属性(例如“poi.Delete.tmp.dirs”)时,才删除文件夹“poifiles”(设置此属性还必须删除包含的临时文件,即使指定了“poi.keep.tmp.files”)
在使用不同上下文运行集成测试时,我遇到了一个确切的问题 POI中有一个bug SXSSF使用类org.apache.poi.util.TempFile保存临时文件时会创建一个临时文件。首次创建TempFile时,目录名保存在此类中的静态singleton DefaultTempFileCreationStrategy对象中。此目录仅在第一次保存时创建,并在虚拟机退出时自动删除它从不检查这个目录是否仍然存在
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();
}
因此,如果有两个应用程序同时加载和保存excels,然后关闭其中一个,则此目录将自动删除。现在两个应用程序使用的临时目录完全相同。因此,如果您尝试在第二个仍处于打开状态的应用程序中保存文件,则会在尝试在t中创建tmp文件时引发IOException他不再存在目录
有关更多详细信息,请检查-SXSSF保存有时会失败,因为临时文件创建失败
可能的解决办法:
- 使用临时文件夹“java.io.tmpdir”而不是其子文件夹“poifiles”
- 为每个进程使用唯一的临时文件夹名称,而不是“poifiles”
- 永远不要删除子文件夹“poifiles”
- 仅当用户明确设置了相应的系统属性(例如“poi.Delete.tmp.dirs”)时,才删除文件夹“poifiles”(设置此属性还必须删除包含的临时文件,即使指定了“poi.keep.tmp.files”)
如果在同一台服务器上有多个jvm,我建议您使用3.12版,并指出您要在哪里编写: File generateTempDir = ... //OR File generateTempDir = new File(System.getProperty("java.io.tmpdir"),"poifiles"); TempFile.setTempFileCreationStrategy(new TempFile.DefaultTempFileCreationStrategy(generateTempDir)); 文件generateTempDir=。。。 //或者File generateTempDir=新文件(System.getProperty(“java.io.tmpdir”),“poifiles”); setempfilecreationstrategy(new TempFile.DefaultTempFileCreationStrategy(generateTempDir));
(或为每个jvm设置java.io.tmpdir属性)如果您在同一台服务器上有多个jvm,我建议您使用3.12版,并指出您要在哪里编写: File generateTempDir = ... //OR File generateTempDir = new File(System.getProperty("java.io.tmpdir"),"poifiles"); TempFile.setTempFileCreationStrategy(new TempFile.DefaultTempFileCreationStrategy(generateTempDir)); 文件generateTempDir=。。。 //或者File generateTempDir=新文件(System.getProperty(“java.io.tmpdir”),“poifiles”); setempfilecreationstrategy(new TempFile.DefaultTempFileCreationStrategy(generateTempDir));
(或为每个jvm设置java.io.tmpdir属性)如果改用Apache POI 3.12 beta 1会发生什么?对于所有不同的JAR?431错误-java.io.IOException:没有这样的文件或目录java.lang.RuntimeE