Java 通过ApachePOI读取excel文件(位于类路径中)
我正在尝试读取(使用ApachePOI).xlsx文件,该文件不在文件系统中,而是在类路径中。我正在使用maven,所以它在参考资料文件夹中 我的代码是-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
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>