Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-Apache POI SXSSFWorkbook无法创建工作表_Java_Excel_Apache Poi - Fatal编程技术网

java-Apache POI 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

在我的项目中,在一个更大的代码流中,我试图创建一个空白的SXSSFWorkbook,创建工作表并向其中写入数据,但我无法这样做,因为它给了我一个运行时异常:没有这样的文件或目录。我不明白为什么会这样。我检查了代码,找不到任何原因

使用的罐子:

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”)
我已经通过“从不删除子文件夹。创建文件夹,不使用dir.deleteOnExit()”修复了它


在使用不同上下文运行集成测试时,我遇到了一个确切的问题

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”)
我通过“从不删除子文件夹”修复了它。创建文件夹,不要使用dir.deleteOnExit()


如果在同一台服务器上有多个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