我正在使用apache POI从Excel文件中提取一些数据。
我需要一个InputStream来实例化POI HSSFWorkbook类HSSFWorkbook wb = new HSSFWorkbook(inputStreamX);
如果尝试像构造InputStream对象,我会发现差异
InputStream inputStream = new FileInputStream(new File("/home/xxx/workspace/myproject/test/resources/importTest.xls"));
InputStream inputStream2 = new FileInputStream(getClass().getResource("/importTest.xls").getFile());
InputStream inputStream3 = new ClassPathResource("importTest.xls").getInputStream();
如果我用inputStream构造POI对象,则可以正常工作。
但是inputStream2和inputStream3抛出此异常
java.io.IOException: Invalid header signature; read -2300849302551019537, expected -2226271756974174256
at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:100)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:84)
二进制文件的标头似乎不同,并且库无法将其识别为Excel文件。我不明白为什么。
我看到的唯一区别是inputStream2&3正在使用类加载器来定位文件。 (ClassPathResource是Spring类)。
我想将文件路径与系统分开。所以我更喜欢inputStream2或3。
您是否知道为什么会这样?
谢谢
更新:
我尝试将inputStream和inputStream2写入磁盘。 inputStream随附的excel文件是可以的。 inputStream2包含一个excel文件,其中包含一些包裹实际内容的奇怪字符。
看来maven在构建过程中以某种方式破坏了excel文件。
因此,基本上,这是我使用classLoader(在
/home/xxx/workspace/myproject/target/test-classes/importTest.xls
下)检索的文件,无法正常运行。任何想法?
最佳答案
问题似乎是maven的filtering选项。如果pom像这样
<testResource>
<directory>${basedir}/src/test/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.sql</include>
<include>**/*.xls</include>
</includes>
<filtering>true</filtering>
</testResource>
当在xls文件上将筛选选项设置为true时,它将破坏它们。