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