4

我正在使用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)是不正确的。
任何的想法?

4

2 回答 2

4

问题似乎是maven的 过滤选项。
如果 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 时,它​​会损坏它们。

于 2009-11-11T09:44:36.470 回答
0

你试过ClassLoader#getResourceAsStream(String)吗?Class#getResource(String)正如后者的文档中所提到的,它的行为可能与您使用 的第二次尝试类似。

我的第一个想法是没有找到这样的文件,但是如果-2300849302551019537每次运行程序时它始终读取相同的值 (),则表明确实有一个文件正在被读取。InputStream在调试器中初始化并检查流实例后捕获语句。您应该能够找到对基础文件名的引用。为了使这更容易,请尝试使用ClassLoader#getResources(String)并检查返回的 URL 序列。

于 2009-11-11T04:14:44.077 回答