• 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,也不用管文件类型。

    目前还没有发现这种方法的缺点。

  • 相关阅读:
    新思路:Exception Handle
    转战github了
    矩阵内积和Schur补
    原子范数及线谱估计
    次梯度方法
    机器学习——推荐系统
    机器学习——异常值检测
    机器学习——聚类分析和主成分分析
    常用不等式集锦
    机器学习——支持向量机(SVM)
  • 原文地址:https://www.cnblogs.com/clarke157/p/6340609.html
Copyright © 2020-2023  润新知