EXCEL解析之终极方法WorkbookFactory 兼容2003 2007以后

xiaoxiao2021-02-28  64

其中:  a)Workbook、Sheet、Row、Cell等为接口;  b)HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell为97-2003版本对应的处理实现类;  c)XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell为2007+版本对应的处理实现类;

Selenium做自动化测试当然不能避免和Excel打交道。

由于Excel版本的关系,文件扩展名分xls和xlsx,

以往的经验都是使用HSSFWorkbook和XSSFWorkbook来分别处理。具体的方式就是先判断文件的类型,然后根据文件扩展名来选择方法。

大概处理方式如下:

1 2 3 4 5 6 7 8 9 10 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两个方法。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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;           }

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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方法。

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 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();      }

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 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。

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

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

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

转载请注明原文地址: https://www.6miu.com/read-72203.html

最新回复(0)