首页 > 代码库 > EXCEL解析之终极方法WorkbookFactory
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 = http://www.mamicode.com/formatter.formatCellValue(xssfCell);""; break; case XSSFCell.CELL_TYPE_ERROR: // 故障 cellvalue=""; break; default: cellvalue="http://www.mamicode.com/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 = http://www.mamicode.com/formatter.formatCellValue(hssfCell);""; break; case HSSFCell.CELL_TYPE_ERROR: // 故障 cellvalue=""; break; default: cellvalue="http://www.mamicode.com/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,也不用管文件类型。
目前还没有发现这种方法的缺点。
EXCEL解析之终极方法WorkbookFactory
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。