EXCEL解析之終極方法WorkbookFactory


Selenium做自動化測試當然不能避免和Excel打交道。

由於Excel版本的關系,文件擴展名分xls和xlsx,

以往的經驗都是使用HSSFWorkbook和XSSFWorkbook來分別處理。具體的方式就是先判斷文件的類型,然后根據文件擴展名來選擇方法。

大概處理方式如下:

String extention= getExtention(path);
             if (!EMPTY.equals(extention)) {
                 if (XLS.equals(extention)) {
                     return readXlsForAllSheets(path);
                 } else if (XLSX.equals(extention)) {
                     return readXlsxForAllSheets(path);
                 }
             } else {
                 System.out.println(path + " is not a excel file.");
             }

 再接着實現readXlsForAllSheets和readXlsxForAllSheets兩個方法。

public Object[][] readXlsxForAllSheets(String path) throws IOException{
         System.out.println(path);
         FileInputStream is = new FileInputStream(path);
		XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
		System.out.println("There are totally "+xssfWorkbook.getNumberOfSheets()+" sheets in the workbook.");
         // Read the Sheet
        List<Object[]> records1=new ArrayList<Object[]>();
         for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
             XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
             int rowCount=xssfSheet.getLastRowNum()-xssfSheet.getFirstRowNum();
             List<Object[]> records=new ArrayList<Object[]>();
        	 String[] separative={"This is sheet "+xssfWorkbook.getSheetName(numSheet)};
        	 records.add(separative);
             for(int rowNum =1;rowNum<rowCount+1; rowNum++){
            	 XSSFRow xssfRow=xssfSheet.getRow(rowNum);
            	 String fields[]=new String[xssfRow.getLastCellNum()];
            	 for (int colNum=0;colNum<xssfRow.getLastCellNum();colNum++){
            		XSSFCell xssfCell=xssfRow.getCell(colNum);
            		 fields[colNum]=this.getXssfCellValue(xssfCell);
            	 }
            	 records.add(fields);
             }
             records1.addAll(records);
             }
         Object[][] results=new Object[records1.size()][];
         for(int i=0;i<records1.size();i++){
         	 results[i]=records1.get(i);
         }
         if (xssfWorkbook!=null){xssfWorkbook.close();}
         return results;
         }

 

public Object[][] readXlsForAllSheets(String path) throws IOException{
         System.out.println(PROCESSING + path);
         FileInputStream is = new FileInputStream(path);
		HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
		System.out.println("There are totally "+hssfWorkbook.getNumberOfSheets()+" sheets in the workbook.");
         // Read the Sheet
        List<Object[]> records1=new ArrayList<Object[]>();
         for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
             HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
             int rowCount=hssfSheet.getLastRowNum()-hssfSheet.getFirstRowNum();
             List<Object[]> records=new ArrayList<Object[]>();
        	 String[] separative={"This is sheet "+hssfWorkbook.getSheetName(numSheet)};
        	 records.add(separative);
             for(int rowNum =1;rowNum<rowCount+1; rowNum++){
            	 HSSFRow xssfRow=hssfSheet.getRow(rowNum);
            	 String fields[]=new String[xssfRow.getLastCellNum()];
            	 for (int colNum=0;colNum<xssfRow.getLastCellNum();colNum++){
            		HSSFCell xssfCell=xssfRow.getCell(colNum);
            		 fields[colNum]=this.getHssfCellValue(xssfCell);
            	 }
            	 records.add(fields);
             }
             records1.addAll(records);
             }
         Object[][] results=new Object[records1.size()][];
         for(int i=0;i<records1.size();i++){
         	 results[i]=records1.get(i);
         }
         if (hssfWorkbook!=null){hssfWorkbook.close();}
         return results;
         }

 再實現上兩個方法中調用的getXssfCellValue和getHssfCellValue方法。

 

private String getXssfCellValue(XSSFCell xssfCell) {
		String cellvalue="";
        DataFormatter formatter = new DataFormatter();
        if (null != xssfCell) {   
            switch (xssfCell.getCellType()) {   
            case XSSFCell.CELL_TYPE_NUMERIC: // 數字   
            	if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(xssfCell)) {
                  cellvalue = formatter.formatCellValue(xssfCell);
              } else {
                  double value = xssfCell.getNumericCellValue();
                  int intValue = (int) value;
                  cellvalue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);
              }
            	break;
			case XSSFCell.CELL_TYPE_STRING: // 字符串   
				cellvalue=xssfCell.getStringCellValue(); 
                break;   
            case XSSFCell.CELL_TYPE_BOOLEAN: // Boolean   
            	cellvalue=String.valueOf(xssfCell.getBooleanCellValue()); 
                break;   
            case XSSFCell.CELL_TYPE_FORMULA: // 公式   
            	cellvalue=String.valueOf(xssfCell.getCellFormula());   
                break;   
            case XSSFCell.CELL_TYPE_BLANK: // 空值   
            	cellvalue="";   
                break;   
            case XSSFCell.CELL_TYPE_ERROR: // 故障   
            	cellvalue="";   
                break;   
            default:   
            	cellvalue="UNKNOWN TYPE";   
                break;   
            }   
        } else {   
            System.out.print("-");   
        }
        return cellvalue.trim();
    }

 

private String getHssfCellValue(HSSFCell hssfCell) {
		String cellvalue="";
        DataFormatter formatter = new DataFormatter();
        if (null != hssfCell) {   
            switch (hssfCell.getCellType()) {   
            case HSSFCell.CELL_TYPE_NUMERIC: // 數字   
            	if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(hssfCell)) {
                    cellvalue = formatter.formatCellValue(hssfCell);
                } else {
                    double value = hssfCell.getNumericCellValue();
                    int intValue = (int) value;
                    cellvalue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);
                }
            	break;
			case HSSFCell.CELL_TYPE_STRING: // 字符串   
				cellvalue=hssfCell.getStringCellValue(); 
                break;   
            case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean   
            	cellvalue=String.valueOf(hssfCell.getBooleanCellValue()); 
                break;   
            case HSSFCell.CELL_TYPE_FORMULA: // 公式   
            	cellvalue=String.valueOf(hssfCell.getCellFormula());   
                break;   
            case HSSFCell.CELL_TYPE_BLANK: // 空值   
            	cellvalue="";   
                break;   
            case HSSFCell.CELL_TYPE_ERROR: // 故障   
            	cellvalue="";   
                break;   
            default:   
            	cellvalue="UNKNOWN TYPE";   
                break;   
            }   
        } else {   
            System.out.print("-");   
        }
        return cellvalue.trim();
    }

 最終整個解析Excel文件的功能才算完成,我們需要實現4個方法readXlsForAllSheets和readXlsxForAllSheets,getXssfCellValue和getHssfCellValue,那么有沒有更加簡單實用的方法呢?

下面要介紹的是POI jar包提供的WorkbookFactory類。需要加載poi-ooxm-3.15.jar到build path。

只需要兩行就可以實例化workbook,而不用管它是xls還是xlsx。

            inStream = new FileInputStream(new File(filePath));
            Workbook workBook = WorkbookFactory.create(inStream);

 后續可以直接操作sheet,Row,Cell,也不用管文件類型。

目前還沒有發現這種方法的缺點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM