web-dev-qa-db-ja.com

無効なヘッダー署名。 ExcelドキュメントでのApachePOIによるIOException

私は得ています:

Java.io.IOException:無効なヘッダー署名。読み取り0x000201060000FFFE、予想0xE11AB1A1E011CFD0

apache POIHPSFを使用してExcelドキュメントにいくつかのカスタムプロパティを追加しようとしたとき。

ファイルがExcelOLE2であると完全に確信しています(HTML、XML、またはExcelが文句を言わない他のものではありません)。

これは私のコードの関連部分です:

try {
     final POIFSFileSystem poifs = new POIFSFileSystem(event.getStream());
     final DirectoryEntry dir = poifs.getRoot();
     final DocumentEntry dsiEntry = (DocumentEntry)
             dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME);

     final DocumentInputStream dis = new DocumentInputStream(dsiEntry);
     final PropertySet props = new PropertySet(dis);
     dis.close();
     dsi = new DocumentSummaryInformation(props);
    }
    catch (Exception ex) {
        throw new RuntimeException
            ("Cannot create POI SummaryInformation for event: " + event +
              ", path:" + event.getPath() + 
              ", name:" + event.getPath() +
              ", cause:" + ex);
    }

Wordファイルとパワーポイントファイル(OLE2も)を試してみると、同じエラーが発生します。

私は完全にアイデアがないので、どんなヘルプ/ポインタも大歓迎です:)

13
Simeon

署名番号を反転すると、ファイルの先頭のバイトが表示されます。

0x000201060000FFFE-> 0xFE 0xFF 0x00 0x00 0x06 0x01 0x02 00

最初の2バイトはUnicodeBOMのように見え、0xFEFFは16ビットのリトルエンディアンを意味します。次に、いくつかの下位制御バイトがあり、0、258、2の16進コードがあるため、結局のところ、テキストファイルではない可能性があります。

そのファイルは実際にはOLE2ファイルではなく、POIがエラーを表示するのは正しいことです。それが何であるかはわかりませんが、おそらくそれは外部のOLE2ラッパーなしでOLE2ファイルの一部である可能性があると思いますか?オフィスで開くことができる場合は、名前を付けて保存してください。POIで開くことができます。現状では、そのヘッダーはOLE2ファイルヘッダーではないため、POIはそれを開くことができません。

6
Gagravarr

私の場合、ファイルは.xls拡張子で保存されたCSVファイルでした。 Excelは問題なく開くことができましたが、POIはそうではありませんでした。

より良い/より一般的な解決策を見つけたら、戻ってきてここに書きます。

5
Fabio

ファイルをExcel2013で保存したためです。ファイルとしてExcel97-2003形式で保存します。

1
S.M_Emamian

直接csvファイルとして保存し、opencsvを使用して操作してください。
opencsvについて知るには、次のリンクを使用してください。
http://opencsv.sourceforge.net/#what-is-opencsv

Excelは、xlsとして保存されたcsv、xls、またはhtmlテーブルを開くことができます。

したがって、ファイルをfile_name.csvとして保存し、opencsvを使用してコード内のファイルを読み取ることができます。

または、Excel 97-2003ブックとして保存することにより、Excelでファイルを1回作成できます。

そして、POI自体がファイルを読み取ることができます:-)

1
sridhar

ソフトウェアによって生成されたxlsファイルでも同じ問題が発生しました。ApachePOIで読み取れるように、ファイルをExcel(同じ形式)で保存する必要があります。

0
user3244162

.xlsの代わりに.xlsxファイルを使用していました。 Workbook、Sheet、Rowクラスを使用している場合は、.xlsファイルを使用する必要があります。私のファイルは.xlsxで、この問題が発生し、.xlsに変更しましたが、機能しました。

0
Amal lal T L