解析excel/讀取Excel檔案【絕對成功】
阿新 • • 發佈:2019-02-14
public class ReadExcel { public static void main(String[] args) throws IOException { // String filePath = "E:\\BBEandJFW\\BBE\\dingxaing.xls"; String filePath = "E:\\BBEandJFW\\BBE\\asd.xlsx"; boolean isExcel2003 = filePath.toLowerCase().endsWith("xls")?true:false; int sheetNum = 0;//工作區間 List<Object[]> datas = new ArrayList<Object[]>();//用來存資料 if(isExcel2003){ datas = readXLS(filePath, sheetNum); }else{ datas = readXLSX(filePath, sheetNum); } System.out.println(datas); // return datas;} private static List<Object[]> readXLS(String filePath, int sheetNum) throws IOException { FileInputStream inputStream = new FileInputStream(filePath); HSSFWorkbook workbook = new HSSFWorkbook(inputStream); List<Object[]> datas = new ArrayList<Object[]>();//用來存資料 /*** step1: 獲取Excel的工作區間總數*/ int sheetNo = workbook.getNumberOfSheets();//取得工作區間的個數(一個Excel預設的sheet有三個) for (int i = 0; i < sheetNo; i++) { if (i != sheetNum) {//判斷是否為需要取得工作區間 continue; } /*** step2:取得所需工作區間(下標從0開始) */ HSSFSheet sheet = workbook.getSheetAt(i); if (sheet == null) { return datas; } /*** step3:獲取總共有多少行資料因為中間空行的話,則讀取出來的資料不準確 */ int hasRowNum = sheet.getPhysicalNumberOfRows(); if(hasRowNum == 0){//sheet中所有行都沒有內容 return datas; } //已經處理了的行數 int procssedNum = 0; for (int j = 0; ; j++) { /** step4: 獲取每一行 */ HSSFRow row = sheet.getRow(j); System.out.println(j); /** step5 : 去除空行 */ if (row != null) { /** step6: 獲取每一行的長度 */ int length = row.getLastCellNum(); if (length > 0) { Object[] data = new Object[length];//定義一個集合,裝每一行的數值 for (int m = 0; m < length; m++) { /** step7: 獲取每一行的每一列的值 */ data[m] = row.getCell(m); } /** step8: 存資料 */ datas.add(data); } procssedNum++; if (procssedNum == hasRowNum) {//當處理完所有的資料,終止迴圈 break; } } } } /** step9: 關閉輸入流 */ inputStream.close(); /** step10: 返回資料 */ return datas; } private static List<Object[]> readXLSX(String filePath, int sheetNum) throws IOException { FileInputStream inputStream = new FileInputStream(new File(filePath)); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); List<Object[]> datas = new ArrayList<Object[]>();//定義一個list用來存資料 /*** step1: 獲取Excel的工作區間的數量*/ int sheetNo = workbook.getNumberOfSheets(); for(int i=0;i<sheetNo;i++){ if(i != sheetNum){ continue; } /** step2: 獲取某一工作區間 */ XSSFSheet sheet = workbook.getSheetAt(i); if(sheet == null){ return datas; } /** step3: 獲取總行數(含空行) */ int allRow = sheet.getPhysicalNumberOfRows(); if(allRow == 0){ return datas; } /** step4: 取每一行的資料 */ for(int j=0;j<allRow;j++){ XSSFRow row = sheet.getRow(j); /** step5: 去空行 */ if(row == null){ continue; } /** step6: 取每一行的長度 */ int length = row.getLastCellNum(); Object[] data = new Object[length];//定義一個數組用來存資料 /** step7: 取每一列的資料 */ for(int k=0; k<length; k++){ XSSFCell cell = row.getCell(k); data[k] = cell; } /** step8: 存資料 */ datas.add(data); } /** step9: 關閉輸入流 */ inputStream.close(); } /** step10: 返回資料 */ return datas; } }