問題描述:在使用poi包進行excel解析時,發現對Excel2003以前(包括2003)的版本沒有問題,但讀取Excel2007時發生如下異常:
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)。
原因分析:XSSF不能讀取Excel2003以前(包括2003)的版本,如果遇到2007版本的Excel文件就需要在讀取前判斷文件是2003前的版本還是2007的版本,然后對應調用HSSF或XSSF來讀取。
解決方式:目前只能通過后綴名來判斷文件版本,代碼如下:(如果有高手知道別的解決方法,請告知,謝謝!)
1 public static boolean isExcel2003(String filePath) 2 { 3 4 return filePath.matches("^.+\\.(?i)(xls)$"); 5 6 }
獲得版本號之后,根據版本號的不同創建不同的對象,代碼如下:
1 /** 根據版本選擇創建Workbook的方式 */ 2 3 Workbook wb = null; 4 5 if (isExcel2003) 6 { 7 wb = new HSSFWorkbook(inputStream); 8 } 9 else 10 { 11 wb = new XSSFWorkbook(inputStream); 12 }