4

Apache POIを使用して、Excel ファイルからデータを抽出しています。
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 の フィルタリングオプションのようです。
ポンポンがこんな感じなら

           <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)後者のドキュメントで示唆されているように、 を使用した 2 回目の試行と同様に動作する可能性があります。

ここで私が最初に考えたのは、そのようなファイルが見つからないということ-2300849302551019537でしたが、プログラムを実行するたびに一貫して同じ値 ( ) を読み取っている場合は、読み取られているファイルが実際にそこにあることを示唆しています。初期化後にステートメントをトラップInputStreamし、デバッガーでストリーム インスタンスを調べます。基になるファイル名への参照を見つけることができるはずです。最初はこれを簡単にするClassLoader#getResources(String)ために、返された一連の URL を使用して検査してみてください。

于 2009-11-11T04:14:44.077 に答える