我正在使用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时,它将破坏它们。

08-05 12:21