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

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

转载于:https://www.cnblogs.com/clarke157/p/6340609.html

EXCEL解析之终极方法WorkbookFactory相关推荐

  1. android excel 筛选功能,Android 实现 Excel 解析 xls 和 xlsx,方法也可以很简单

    Excel 解析,一般来说是在服务端进行的,但是如果移动端要实现解析Excel的功能,那也是有实现的方法的. 不过由于Android 原生用Java/Kotlin实现,所以也可以参考服务端解析Exce ...

  2. vb.net读取写入EXCEl的终极方法-NOPI

    据我浅薄的知识,之前只知道两种操作excel的方法: 一.ODBC操作excel 看下图: 1.ODBC 由于初期连接不同的数据库通过各种不同的API,ODBC就是将各种不同的API封装成统一的接口. ...

  3. (转).NET导出Excel的四种方法及评测

    .NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...

  4. Java中操作Excel的3种方法,太好用了!

    一.介绍 在平时的业务系统开发中,少不了需要用到导出.导入excel功能,今天我们就一起来总结一下,如果你正为此需求感到困惑,那么阅读完本文,你一定会有所收获! 二.poi 大概在很久很久以前,微软的 ...

  5. python中xml Excel解析编码小结

    python语言语法什么的还是比较简单的,像我这个学c语言的人学了半个月就敢在公司的项目中使用就可以看出python入门还是比较简单的.当然,作为一个菜鸟,使用中肯定是遇到很多问题的,比如令我相当头疼 ...

  6. easyexcel一个很棒的Excel解析工具

    easyexcel一个很棒的Excel解析工具 前言 Excel格式 核心原理对比 理解与使用 总结 前言 最近手头上有一个项目,其中有一个需求就是要Excel表格导入导出,之前有过类似的经验,不过当 ...

  7. js-xlsx 读取Excel解析

    近期公司开始做绩效,某一天上午 HR 妹纸发了份 Excel 模板过来,让我下发给小组内成员填写.当天下午下班前,组内的绩效表就收齐了,接下来我就开始进入下一个环节,逐一打开每个 Excel 表为每个 ...

  8. Excel解析工具easyexcel全面探索

    1. Excel解析工具easyexcel全面探索 1.1. 简介 之前我们想到Excel解析一般是使用POI,但POI存在一个严重的问题,就是非常消耗内存.所以阿里人员对它进行了重写从而诞生了eas ...

  9. EasyExcel实现Excel解析并返回解析失败数据思路

    EasyExcel实现Excel解析并返回解析失败数据思路 需求说明 项目中需要使用到Excel文件上传,处理解析Excel表格数据落库,并返回处理失败的统计数据: 相关技术及插件 这里选择使用阿里开 ...

最新文章

  1. 递归/回溯:subsets求子集
  2. 消息队列 RabbitMQ
  3. python3 使用psutil 查看内存占用
  4. 第三方软件源_两款电视盒子软件。涵盖电视直播,电影,电视剧,你值得拥有。...
  5. Vim键盘图/Vim快捷键
  6. jenkins部署三种构建方式的详细步骤
  7. js系列教程5-数据结构和算法全解
  8. Lightroom Classic 教程,如何在 Lightroom 中使用面部识别整理照片?
  9. 只有极少数人能通过的「超级多任务」测试(文末附测试地址)
  10. Eclipse问题解决
  11. Quartz 知识点汇总
  12. 关于SETUP FACTORY %AppFolder%写入注册表问题
  13. Algorithm:数学建模大赛(CUMCM/NPMCM)之CUMCM之2006B之2006之B题《艾滋病疗法的评价及疗效的预测》
  14. python 代码生成器_Python代码生成器(代码生成工具)V1.1 正式版
  15. 语音计算机怎么切换音乐模式,如何把微信里收藏的语音音乐转换成mp3格式?
  16. 思科2960交换机 - 配置命令大全
  17. 第三集 怪物学院 第十六章
  18. 广州小程序开发公司哪家好?广州小程序开发公司排行前十?
  19. 聊天室登录php,聊天室技术(二)-- 登录_PHP
  20. linux 离线地图开发包,Mapbox本地离线部署

热门文章

  1. 带你自学Python系列(十六):Python中类的用法(二)
  2. 分布式系统 c语言,C语言分布式系统中的进程标识!
  3. 100级大橙武升级流程_DNF:女气功升级100级无暇手套,前后伤害对比。
  4. 最详细的Eigen笔记
  5. VMware虚拟化/云计算
  6. java判断是否换行_如何检测java中的换行符
  7. excel不显示0_【周一实用技巧】绝密,保护公式不被修改。Excel单元格保护可以输入但不能修改公式,隐藏不显示公式内容...
  8. Java中的堆和栈的区别
  9. split出现得问题
  10. Javascript 闭包何时回收?