8

ローカル システムで 1 つの Excel ファイルを読み込んでいます。POI jar バージョン 3.7 を使用していますが、Invalid header signature; エラーが発生します。-2300849302551019537 または 16 進数 0xE011BDBFEFBDBFEF を読み取り、-2226271756974174256 または 16 進数 0xE11AB1A1E011CFD0 を想定。

Excelでxlsファイルを開くと正常に動作します。

それが発生するコードブロック: アイデアはありますか?

/**
 * create a new HeaderBlockReader from an InputStream
 *
 * @param stream the source InputStream
 *
 * @exception IOException on errors or bad data
 */
public HeaderBlockReader(InputStream stream) throws IOException {
    // At this point, we don't know how big our
    //  block sizes are
    // So, read the first 32 bytes to check, then
    //  read the rest of the block
    byte[] blockStart = new byte[32];
    int bsCount = IOUtils.readFully(stream, blockStart);
    if(bsCount != 32) {
        throw alertShortRead(bsCount, 32);
    }

    // verify signature
    long signature = LittleEndian.getLong(blockStart, _signature_offset);

    if (signature != _signature) {
        // Is it one of the usual suspects?
        byte[] OOXML_FILE_HEADER = POIFSConstants.OOXML_FILE_HEADER;
        if(blockStart[0] == OOXML_FILE_HEADER[0] &&
            blockStart[1] == OOXML_FILE_HEADER[1] &&
            blockStart[2] == OOXML_FILE_HEADER[2] &&
            blockStart[3] == OOXML_FILE_HEADER[3]) {
            throw new OfficeXmlFileException("The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)");
        }
        if ((signature & 0xFF8FFFFFFFFFFFFFL) == 0x0010000200040009L) {
            // BIFF2 raw stream starts with BOF (sid=0x0009, size=0x0004, data=0x00t0)
            throw new IllegalArgumentException("The supplied data appears to be in BIFF2 format.  "
                    + "POI only supports BIFF8 format");
        }

        // Give a generic error
        throw new IOException("Invalid header signature; read "
                              + longToHex(signature) + ", expected "
                              + longToHex(_signature));
    }
4

3 に答える 3

17

Mavenを使用している場合は、リソースタグのフィルタリングがfalseに設定されていることを確認してください。そうしないと、Mavenはコピーフェーズでxlsファイルを破損する傾向があります

于 2012-12-20T10:06:56.970 に答える
13

この例外は、ファイルが有効な OLE2 ベースの .xls ファイルではないことを示しています。

Excel でファイルを開くことができるということは、本当のガイドではありません。Excel は、拡張子が何であっても、認識しているすべてのファイルを喜んで開きます。.csv ファイルを取得して .xls に名前を変更した場合、Excel は引き続きファイルを開きますが、名前を変更しても魔法のように .xls 形式にはなっていないため、POI はファイルを開きません。

ファイルを Excel で開いて [名前を付けて保存] を実行すると、実際の Excel ファイルとして書き出すことができます。それが実際にどのファイルであるかを知りたい場合は、Apache Tikaを使用してみ--detectてください。

.

有効なファイルではないことを確認するにはどうすればよいですか? MicrosoftのOLE2 ファイル形式仕様ドキュメントを見て、セクション 2.2に進むと、次のように表示されます。

ヘッダー署名 (8 バイト): 複合ファイル構造の識別署名であり、値 0xD0、0xCF、0x11、0xE0、0xA1、0xB1、0x1A、0xE1 に設定する必要があります。

これらのバイトを反転すると (OLE2 はリトル エンディアン)、例外からのマジック ナンバーである 0xE11AB1A1E011CFD0 が得られます。実際には有効な OLE2 ドキュメントではないため、ファイルはそのマジック番号で始まっていないため、POI はその例外を与えます。

于 2012-12-19T11:22:36.767 に答える