0

最初に私は家からこの質問をしています=-すべての情報源から離れて; 明日更新を試みます。

基本的に、私は次のようにNPOIFSFileSystemをインスタンス化しています。

NPOIFSFileSystem fs = new NPOIFSFileSystem(new File(this.getLocalFile()));

getLocalFile()メソッドは文字列をファイルパスに返します-ファイルがその場所に存在することはわかっています。ただし、インスタンスはエラーを返しています。

ArrayIndexOutOfBounds

誰かがこれについて何か考えを持っていますか?

問題のファイルはXLSファイルであり、アラビア文字が含まれているため、問題が発生する可能性があるのではないかと思います。

以前はPOIFSFileSystemを使用してこれを使用していましたが、問題のXLSファイルによっていくつかの問題が発生し、さまざまなフォーラムでNPOIFSFileSystemへの移行が推奨されました。

それで、誰かがこれを前に見たことがありますか?または、誰かが私にこれに関するいくつかのヒント/ポインタを提供できますか?

さらに明確にする必要がある場合は、明日、仕事に戻ったときに(そしてインターネット接続を修正したときに)この質問を更新します。

よろしくお願いしますネイサン

編集1 これが完全なスタックトレースです:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at org.apache.poi.poifs.filesystem.BlockStore$ChainLoopDetector.claim(BlockStore.java:95)
    at org.apache.poi.poifs.filesystem.NPOIFSStream$StreamBlockByteBufferIterator.next(NPOIFSStream.java:212)
    at org.apache.poi.poifs.filesystem.NPOIFSStream$StreamBlockByteBufferIterator.next(NPOIFSStream.java:186)
    at org.apache.poi.poifs.property.NPropertyTable.buildProperties(NPropertyTable.java:88)
    at org.apache.poi.poifs.property.NPropertyTable.<init>(NPropertyTable.java:66)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.readCoreContents(NPOIFSFileSystem.java:379)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:202)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:163)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:145)
    at com.turnitin.datamap.parser.standard.XLSParser.defineParsableObject(XLSParser.java:67)
    at com.turnitin.datamap.parser.standard.XLSParser.setUp(XLSParser.java:56)
    at com.turnitin.datamap.parser.standard.XLSParser.<init>(XLSParser.java:46)
    at com.turnitin.datamap.controller.DataMapController.parseData(DataMapController.java:255)
    at com.turnitin.datamap.controller.DataMapController.processControl(DataMapController.java:162)
    at com.turnitin.datamap.controller.DataMapController.processStart(DataMapController.java:130)
    at com.turnitin.datamap.controller.DataMapController.main(DataMapController.java:61)

POI3-8を実行しています

3.9にアップグレードして、もう一度やり直してお知らせします。

ネイサン、ありがとう

編集2

3.9にアップデートしました。すぐにもう一度テストします。テストする前に、他の項目が完了するのを待っています。結果を投稿します。

ありがとうネイサン

編集3 同じ奇妙な問題。これが、POI3.9を使用しているスタックトレースです。

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at org.apache.poi.poifs.filesystem.BlockStore$ChainLoopDetector.claim(BlockStore.java:95)
    at org.apache.poi.poifs.filesystem.NPOIFSStream$StreamBlockByteBufferIterator.next(NPOIFSStream.java:212)
    at org.apache.poi.poifs.filesystem.NPOIFSStream$StreamBlockByteBufferIterator.next(NPOIFSStream.java:186)
    at org.apache.poi.poifs.property.NPropertyTable.buildProperties(NPropertyTable.java:88)
    at org.apache.poi.poifs.property.NPropertyTable.<init>(NPropertyTable.java:66)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.readCoreContents(NPOIFSFileSystem.java:379)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:202)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:163)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:145)
    at com.turnitin.datamap.parser.standard.XLSParser.defineParsableObject(XLSParser.java:67)
    at com.turnitin.datamap.parser.standard.XLSParser.setUp(XLSParser.java:56)
    at com.turnitin.datamap.parser.standard.XLSParser.<init>(XLSParser.java:46)
    at com.turnitin.datamap.controller.DataMapController.parseData(DataMapController.java:264)
    at com.turnitin.datamap.controller.DataMapController.processControl(DataMapController.java:162)
    at com.turnitin.datamap.controller.DataMapController.processStart(DataMapController.java:130)
    at com.turnitin.datamap.controller.DataMapController.main(DataMapController.java:61)

ありがとうネイサン

編集 4NPOIFSFileSystemからPOIFSFileSystemに切り替えました。

FileInputStream fis = new FileInputStream(this.getFileToParse());
    POIFSFileSystem excelFile = new POIFSFileSystem(fis);
    Workbook wb = WorkbookFactory.create(excelFile);

これにより、次のスタックトレースが得られます。

    java.io.IOException: block[ 1273 ] already removed - does your POIFS have circular or duplicate block references?
    at org.apache.poi.poifs.storage.BlockListImpl.remove(BlockListImpl.java:89)
    at org.apache.poi.poifs.storage.RawDataBlockList.remove(RawDataBlockList.java:34)
    at org.apache.poi.poifs.storage.BlockAllocationTableReader.fetchBlocks(BlockAllocationTableReader.java:221)
    at org.apache.poi.poifs.storage.BlockListImpl.fetchBlocks(BlockListImpl.java:123)
    at org.apache.poi.poifs.storage.RawDataBlockList.fetchBlocks(RawDataBlockList.java:34)
    at org.apache.poi.poifs.property.PropertyTable.<init>(PropertyTable.java:63)
    at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:159)
    at com.turnitin.datamap.parser.standard.XLSParser.defineParsableObject(XLSParser.java:68)
    at com.turnitin.datamap.parser.standard.XLSParser.setUp(XLSParser.java:56)
    at com.turnitin.datamap.parser.standard.XLSParser.<init>(XLSParser.java:46)
    at com.turnitin.datamap.controller.DataMapController.parseData(DataMapController.java:264)
    at com.turnitin.datamap.controller.DataMapController.processControl(DataMapController.java:162)
    at com.turnitin.datamap.controller.DataMapController.processStart(DataMapController.java:130)
    at com.turnitin.datamap.controller.DataMapController.main(DataMapController.java:61)

ファイルが存在し、有効なXLSファイルであることを知っています。

私はJava1.7とPoi3.9を使用しています。

アプリケーションは/usr/ java / data_map_toolから実行され、ファイルは/ home / javaapp/data_map_filesにダウンロードされて処理されます。

アプリケーションは、問題のディレクトリの所有者であるjavaappユーザーの下で実行されます。

ある時点で、アプリケーションが実行されているディレクトリ内のディレクトリにファイルをダウンロードして、それが機能しましたが、ファイルサイズにより、ファイルストアとして使用することはできません。

私がこれで壁に頭をぶつけているので、誰かがこれについて何か考えを持っていますか?

4

1 に答える 1

0

さて、私はそれを割った!示唆されているように、問題は元のソース ファイルにありました。簡単に言うと、それは BOM でした。XSL ファイルの先頭にバイト オーダー マーカーがありました。Java アプリケーションがこれを FileInputStream で開くと、混乱が生じます。

そのため、コードを更新してファイルを開くようにしました

BOMInputStream();

Apache Commons io から。

これで問題は解決しました。

どうもありがとうネイサン

于 2012-12-17T13:02:06.073 に答える