私は得ています:
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も)を試してみると、同じエラーが発生します。
私は完全にアイデアがないので、どんなヘルプ/ポインタも大歓迎です:)
署名番号を反転すると、ファイルの先頭のバイトが表示されます。
0x000201060000FFFE-> 0xFE 0xFF 0x00 0x00 0x06 0x01 0x02 00
最初の2バイトはUnicodeBOMのように見え、0xFEFFは16ビットのリトルエンディアンを意味します。次に、いくつかの下位制御バイトがあり、0、258、2の16進コードがあるため、結局のところ、テキストファイルではない可能性があります。
そのファイルは実際にはOLE2ファイルではなく、POIがエラーを表示するのは正しいことです。それが何であるかはわかりませんが、おそらくそれは外部のOLE2ラッパーなしでOLE2ファイルの一部である可能性があると思いますか?オフィスで開くことができる場合は、名前を付けて保存してください。POIで開くことができます。現状では、そのヘッダーはOLE2ファイルヘッダーではないため、POIはそれを開くことができません。
私の場合、ファイルは.xls
拡張子で保存されたCSVファイルでした。 Excelは問題なく開くことができましたが、POIはそうではありませんでした。
より良い/より一般的な解決策を見つけたら、戻ってきてここに書きます。
ファイルをExcel2013で保存したためです。ファイルとしてExcel97-2003形式で保存します。
直接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自体がファイルを読み取ることができます:-)
ソフトウェアによって生成されたxlsファイルでも同じ問題が発生しました。ApachePOIで読み取れるように、ファイルをExcel(同じ形式)で保存する必要があります。
.xlsの代わりに.xlsxファイルを使用していました。 Workbook、Sheet、Rowクラスを使用している場合は、.xlsファイルを使用する必要があります。私のファイルは.xlsxで、この問題が発生し、.xlsに変更しましたが、機能しました。