2012-09-27 141 views
2

我使用Apache讀取xls文件POI 3.8,但我得到異常:無法讀取整個標題; 0字節讀取;預期512個字節

 java.io.IOException: Unable to read entire header; 0 bytes read; expected 512 bytes 
     at org.apache.poi.poifs.storage.HeaderBlock.alertShortRead(HeaderBlock.java:226) 
     at org.apache.poi.poifs.storage.HeaderBlock.readFirst512(HeaderBlock.java:207) 
     at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104) 
     at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:138) 

使用的代碼示例:

 FileInputStream myInput = new FileInputStream(excelFilePathWithExtension); 
    logger.debug("FileInputStream::"+myInput); 

    POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput); 
    logger.debug("POIFSFileSystem::"+myFileSystem); 

    Workbook workbook = WorkbookFactory.create(myFileSystem); 

幫我嗎?

+0

你確定該文件不是空的嗎? – Thilo

+0

你可以在excel或openOffice中打開文件嗎?如果不是則文件損壞 –

+0

文件不爲空 –

回答

6

如果我們看一看在HeaderBlocks類,我們可以看到這些塊:

public HeaderBlock(InputStream stream) throws IOException { 
    // Grab the first 512 bytes 
    // (For 4096 sized blocks, the remaining 3584 bytes are zero) 
    // Then, process the contents 
    this(readFirst512(stream)); 
    ... 
} 

你使用會讀取第一個512個字節的InputStream的構造函數,然後調用私有構造。

如果沒有足夠的字節要讀取,readFirst512方法會拋出異常。

另外,POI's document表示POI文件系統結構開始於512字節的標題塊。

所以......看起來你的文件對POI來說不夠大。

+0

我有同樣的問題,但該文件是1,536字節...任何想法如何解決這個問題? – softwareplay

3

在MS-Excel中打開並保存爲不同的名稱。再試一次。

+0

即使打開文件,做一個小的編輯和保存工作。在我的情況下,我編輯了一個單元格,保存並撤消更改,再次保存,異常消失。因爲它可能是一個模板文件,它一路上被損壞了。 Excel可以解決問題POI崩潰。以編程方式,我將調整我的代碼,首先將模板文件複製到臨時目錄,然後執行任何操作。 –

0

如果您將正在讀取或寫入的文件放在不同的文件夾中,您可能不會收到錯誤消息。看起來像Mozilla的「下載」這樣的默認文件夾具有受限制的權限。