3

.xls ファイルの読み取り中に次のコードを使用します。ここで、s はファイル ディレクトリです。

InputStream input = new FileInputStream(s);
Workbook wbs = new HSSFWorkbook(input);

次のエラー メッセージが表示されます。

Exception in thread "main" java.io.IOException: Invalid header signature; read 0x0010000000060809, expected 0xE11AB1A1E011CFD0

XLSX または XLS のいずれかで読み取ることができるプログラムが必要です。XSSF 用に調整されたまったく同じコードを使用すると、XLSX ファイルの読み取りにまったく問題はありません。

4

3 に答える 3

2

ファイルがxlsではなくxlsx形式の場合、このエラーが発生する可能性があります。一般的なワークブックオブジェクト(SSユーザーモデルとも呼ばれます)を使用してみます

WorkbookインターフェイスWorkbookFactoryオブジェクトを確認してください。ファクトリは、xlsxまたはxlsのいずれかから汎用ワークブックを作成できる必要があります。

これについては良いチュートリアルがあると思いましたが、見つからないようです。でも見続けます。

編集

SS Usermodelを使用した読み取りと書き換えについて、Apacheのサイトからこの小さなスニペットを見つけました。

これがお役に立てば幸いです。

于 2012-05-30T15:00:00.543 に答える
1

取得している例外は、提供しているファイルが有効な Excel バイナリ ファイルではなく、少なくとも 1990 年以降に生成された有効な Excel ファイルではないことを示しています。取得している例外は、POI が期待するものを示しています。代わりに、有効な.xlsファイルではなく、POIが検出できるものではない何かが見つかりました。

注意すべきことの 1 つは、Excel が .csv や .html などのさまざまなファイル形式を開くことです。また、ファイル拡張子についてもそれほどうるさいわけではないため、.xls ファイルに名前が変更された CSV ファイルを問題なく開くことができます。ただし、.csv の名前を .xls に変更しても、魔法のように形式が変更されるわけではないため、POI ではまだ開くことができません。

.

例外から、何が起こっているかがわかります。また、古いバージョンの Apache POI を使用していることもわかります。のヘッダー署名は0x0010000000060809、約 25 年前の Excel 4 ファイル形式に対応しています。より新しいバージョンの Apache POI を使用している場合は、提供されたファイルが古く、ほとんどサポートされていない Excel ファイルであることを示す役立つエラー メッセージが表示されます。POI の新しいバージョンには、これらの古い形式から一部の情報を引き出すことができるOldExcelExtractor ツールが含まれています。

それ以外の場合は、このタイプのすべての例外と同様に、Excel でファイルを開いて名前を付けて保存してみてください。これにより、現在のファイルが何であるかがわかります (例: .html は .xls として保存され、.csv は .xls として保存されます)。また、POI を読み込んで読み込むために、適切な .xls ファイルとして再保存することもできます。と連携。

于 2012-05-29T15:10:47.230 に答える
1

ヘッダー署名が無効です。0x342E312D46445025 を読み取り、0xE11AB1A1E011CFD0 を期待

破損した xls/xlsx ファイルをアップロードしたときにこのエラーが発生しました (破損したファイルをアップロードするために、sample.pdf の名前を sample.xls に変更しました)。次のような検証を追加します。

Workbook wbs = null;
try {
    InputStream input = new FileInputStream(s);
    wbs = new HSSFWorkbook(input);
} catch(IOException e) {
    // log "file is corrupted", show error message to user
}
于 2012-05-29T06:32:30.480 に答える