2012-05-28 82 views
2

使用下面的代碼,而在一個.xls文件,其中s是文件目錄閱讀:的Apache POI HSSF XLS讀數誤差

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文件中的讀取沒有任何問題。

+0

創建'input'或'wbs'變量時發生異常? –

回答

1

如果文件是xlsx格式而不是xls,則可能會出現此錯誤。我會嘗試使用通用工作簿對象(也稱爲SS Usermodel)

檢查出Workbook interfaceWorkbookFactory object。工廠應該能夠爲xlsx或xls創建一個通用工作簿。

我以爲我有一個很好的教程,但我似乎無法找到它。我會繼續尋找。

編輯

我發現this little tiny snippet從Apache的網站的閱讀與使用SS的usermodel改寫。

我希望這有助於!

+1

如果您將.xlsx文件提供給HSSF,則至少在最近的版本中不會出現此錯誤,您將得到一個特定的通知,告知您您的錯誤。這是POI不知道的一般錯誤... – Gagravarr

+0

@Gagravarr Ahh我懷疑這個唯一原因是因爲問題的最後部分,他說當他使用XSSF時沒有問題。他們還要求一種方式來訪問xlsx和xls,所以我認爲這對他們來說仍然是一個很好的信息,但我不會期待任何upvotes。 – Shaded

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 
} 
1

你得到一個是告訴你,你在供應文件不是一個有效的Excel二進制文件,至少不會因爲1990年左右產生的一個有效的Excel文件除外你得到的異常告訴你什麼是POI期望的,並且它發現了其他的東西,而不是有效的.xls文件,並且沒有其他POI可以檢測到的東西。

有一點需要注意的是,Excel打開了各種不同的文件格式,包括.csv和.html。它對文件擴展名也不是很挑剔,所以會很高興地打開一個已被重命名爲.xls的CSV文件。但是,由於將.csv重命名爲.xls不會奇蹟般地更改格式,因此POI仍然無法打開它!

從例外情況來看,我可以告訴發生了什麼,我也可以告訴你使用的是古老版本的Apache POI!標題簽名0x0010000000060809對應於大約25年前的Excel 4文件格式!如果您使用的是更新版本的Apache POI,它會爲您提供一條有用的錯誤消息,告訴您所提供的文件是舊的且基本上不受支持的Excel文件。新版本的POI包括OldExcelExtractor tool,它可以從這些古代格式中提取一些信息。

否則,與此類型的所有例外情況一樣,請嘗試在Excel中打開文件並執行另存爲。這會讓你知道目前的文件是什麼(例如,.html保存爲.xls,.csv保存爲.xls等),並且還可以讓你重新保存爲一個正確的.xls文件,以便POI加載和與...合作。

相關問題