轉載:https://blog.csdn.net/zb0567/article/details/71248817/
剛開始使用new HSSFWorkbook(new FileInputStream(excelFile))來讀取Workbook,對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)
該錯誤意思是說,文件中的數據是用Office2007+XML保存的,而現在卻調用OLE2 Office文檔處理,應該使用POI不同的部分來處理這些數據,比如使用XSSF來代替HSSF。
於是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)來讀取Workbook,對Excel2007沒有問題了,可是在讀取Excel2003以前(包括2003)的版本時卻發生了如下新異常:
org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
該錯誤是說,操作無效,不能打開指定的xls文件。
下載POI的源碼后進行單步調試,發現剛開始的時候還是對的,但到ZipFile類后就找不到文件了,到網上查了下,原來是XSSF不能讀取Excel2003以前(包括2003)的版本,這樣的話,就需要在讀取前判斷文件是2003前的版本還是2007的版本,然后對應調用HSSF或XSSF來讀取。
簡而言之:由於HSSFWorkbook只能操作excel2003一下版本,XSSFWorkbook只能操作excel2007以上版本,所以利用Workbook接口創建對應的對象操作excel來處理兼容性
@Test
public void test6() throws Exception{
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream( new File("c://123.xls")));
HSSFSheet sheet = workbook.getSheetAt(0);
HSSFRow row =sheet.getRow(0);
HSSFCell cell= row.getCell(0);
System.out.println(cell.toString());
}
@Test
public void test7() throws Exception{
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream( new File("c://456.xlsx")));
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row =sheet.getRow(0);
XSSFCell cell= row.getCell(0);
System.out.println(cell.toString());
}
@Test //利用Workbook接口和判斷excel版本創建相應版本HSSFWorkbook/XSSFWorkbook對象
public void test8() throws Exception{
String file = "c://456.xlsx";
boolean isExcel2003 = file.toLowerCase().endsWith("xls")?true:false;
Workbook workbook = null;
if(isExcel2003){
workbook = new HSSFWorkbook(new FileInputStream(new File(file)));
}else{
workbook = new XSSFWorkbook(new FileInputStream(new File(file)));
}
Sheet sheet = workbook.getSheetAt(0);
Row row =sheet.getRow(0);
Cell cell= row.getCell(0);
System.out.println(cell.toString());
}