使用POI3.5時(shí),為能兼容Excel2007而發(fā)生的異常
Posted on 2011-03-16 16:17 spinage 閱讀(12734) 評(píng)論(1) 編輯 收藏 剛開(kāi)始使用new HSSFWorkbook(new FileInputStream(excelFile))來(lái)讀取Workbook,對(duì)Excel2003以前(包括2003)的版本沒(méi)有問(wèn)題,但讀取Excel2007時(shí)發(fā)生如下異常:
org.apache.poi.poifs.filesystem.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)
該錯(cuò)誤意思是說(shuō),文件中的數(shù)據(jù)是用Office2007+XML保存的,而現(xiàn)在卻調(diào)用OLE2 Office文檔處理,應(yīng)該使用POI不同的部分來(lái)處理這些數(shù)據(jù),比如使用XSSF來(lái)代替HSSF。
于是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)來(lái)讀取Workbook,對(duì)Excel2007沒(méi)有問(wèn)題了,可是在讀取Excel2003以前(包括2003)的版本時(shí)卻發(fā)生了如下新異常(真是太悲劇了):
org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
該錯(cuò)誤是說(shuō),操作無(wú)效,不能打開(kāi)指定的xls文件。
下載POI的源碼后進(jìn)行單步調(diào)試,發(fā)現(xiàn)剛開(kāi)始的時(shí)候還是對(duì)的,但到ZipFile類后就找不到文件了,到網(wǎng)上查了下,原來(lái)是XSSF不能讀取Excel2003以前(包括2003)的版本,這樣的話,就需要在讀取前判斷文件是2003前的版本還是2007的版本,然后對(duì)應(yīng)調(diào)用HSSF或XSSF來(lái)讀取。
這是初步的想法,但這種做法比較麻煩,看了下API,發(fā)現(xiàn)XSSF和HSSF雖然在不同的包里,但卻引用了同一接口Workbook,于是想到了這樣的讀取方法:
Workbook book = null;
try {
book = new XSSFWorkbook(excelFile);
} catch (Exception ex) {
book = new HSSFWorkbook(new FileInputStream(excelFile));
}
在各版本的Excel中測(cè)試,沒(méi)有發(fā)生異常,問(wèn)題解決。
org.apache.poi.poifs.filesystem.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)
該錯(cuò)誤意思是說(shuō),文件中的數(shù)據(jù)是用Office2007+XML保存的,而現(xiàn)在卻調(diào)用OLE2 Office文檔處理,應(yīng)該使用POI不同的部分來(lái)處理這些數(shù)據(jù),比如使用XSSF來(lái)代替HSSF。
于是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)來(lái)讀取Workbook,對(duì)Excel2007沒(méi)有問(wèn)題了,可是在讀取Excel2003以前(包括2003)的版本時(shí)卻發(fā)生了如下新異常(真是太悲劇了):
org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
該錯(cuò)誤是說(shuō),操作無(wú)效,不能打開(kāi)指定的xls文件。
下載POI的源碼后進(jìn)行單步調(diào)試,發(fā)現(xiàn)剛開(kāi)始的時(shí)候還是對(duì)的,但到ZipFile類后就找不到文件了,到網(wǎng)上查了下,原來(lái)是XSSF不能讀取Excel2003以前(包括2003)的版本,這樣的話,就需要在讀取前判斷文件是2003前的版本還是2007的版本,然后對(duì)應(yīng)調(diào)用HSSF或XSSF來(lái)讀取。
這是初步的想法,但這種做法比較麻煩,看了下API,發(fā)現(xiàn)XSSF和HSSF雖然在不同的包里,但卻引用了同一接口Workbook,于是想到了這樣的讀取方法:
Workbook book = null;
try {
book = new XSSFWorkbook(excelFile);
} catch (Exception ex) {
book = new HSSFWorkbook(new FileInputStream(excelFile));
}
在各版本的Excel中測(cè)試,沒(méi)有發(fā)生異常,問(wèn)題解決。