Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 通过ApachePOI读取excel文件(位于类路径中)_Java_Excel_Maven_Apache Poi_Classpath - Fatal编程技术网

Java 通过ApachePOI读取excel文件(位于类路径中)

Java 通过ApachePOI读取excel文件(位于类路径中),java,excel,maven,apache-poi,classpath,Java,Excel,Maven,Apache Poi,Classpath,我正在尝试读取(使用ApachePOI).xlsx文件,该文件不在文件系统中,而是在类路径中。我正在使用maven,所以它在参考资料文件夹中 我的代码是- InputStream resourceAsStream = MyReader.class.getClassLoader().getResourceAsStream("test.xlsx"); Workbook wb = new XSSFWorkbook(resourceAsStream); 我得到了这个例外 Caused by: j

我正在尝试读取(使用ApachePOI).xlsx文件,该文件不在文件系统中,而是在类路径中。我正在使用maven,所以它在参考资料文件夹中

我的代码是-

InputStream resourceAsStream = MyReader.class.getClassLoader().getResourceAsStream("test.xlsx");
   Workbook wb = new XSSFWorkbook(resourceAsStream);
我得到了这个例外

Caused by: java.lang.IllegalArgumentException: MALFORMED
        at java.util.zip.ZipCoder.toString(ZipCoder.java:58) ~[?:1.7.0_51]
        at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:297) ~[?:1.7.0_51]
        at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:121) ~[?:1.7.0_51]
        at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:51) ~[poi
a3]
        at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:88) ~[poi-ooxml-3.11-beta3.jar:3.11-beta3]
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:272) ~[poi-ooxml-3.11-beta3.jar:3.11-beta3]
        at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37) ~[poi-ooxml-3.11-beta3.jar:3.11-beta3]

谢谢

文件是否位于类路径的顶部,即在WEB-INF/classes中

Classloader.getResource()的API文档说明资源名称为:

“资源的名称是标识资源的“/”分隔路径名。”


因此,如果您的文件位于某个子目录中,则该路径应该是资源名称的一部分。

在这个问题上花了几天时间后,我在stackoverflow()中找到了答案。

maven资源插件过滤中的问题,它会破坏excel文件

You should not filter binary files like excel and use two mutually exclusive resource sets as described at the bottom of this page 

将更多信息添加到@user1321466-answer,您可以按照maven resources插件站点中的说明进行筛选:

如果您同时拥有文本文件和二进制文件作为资源,它就是 建议使用两个单独的文件夹。一个文件夹 未筛选资源的src/main/resources(默认值) 和另一个文件夹src/main/resources,该文件夹筛选出 被过滤

或者仅从筛选中排除文件:

<resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <excludes>
        <exclude>**/*.xsd</exclude>
        <exclude>**/*.xml</exclude>
    </excludes>
</resource>
<resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <includes>
        <include>**/*.xsl</include>
        <include>**/*.xslx</include>
    </includes>
</resource>

src/main/resources
真的
**/*.xsd
**/*.xml
src/main/resources
假的
**/*.xsl
**/*.xslx

文件如何进入资源文件夹/类路径?你确定那个进程没有破坏它吗?基本上,它是在web应用程序中,所以它部署在Tomcat7上。我不认为它会被破坏。但是如果您有什么想法,请告诉我。在部署之前计算文件的md5哈希,以及在webapp中部署的同一文件的md5哈希?它是Oracle jdk1.7.0 3我仍然认为您的maven打包有损坏文件的风险。请计算部署前和部署后文件的md5校验和,confirmfile位于maven resources文件夹中。我可以得到InputStream。与ApachePOIAPI相关的问题,我不知道为什么它不“喜欢”流并抛出异常。但无论如何,谢谢你的回答
<resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <excludes>
        <exclude>**/*.xsd</exclude>
        <exclude>**/*.xml</exclude>
    </excludes>
</resource>
<resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <includes>
        <include>**/*.xsl</include>
        <include>**/*.xslx</include>
    </includes>
</resource>