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

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

时间: 2024-10-21 03:05:57

EXCEL解析之终极方法WorkbookFactory的相关文章

Net操作Excel(终极方法NPOI)

http://www.cnblogs.com/stone_w/archive/2012/08/02/2620528.html Net操作Excel(终极方法NPOI) 前言 Asp.net/C#操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等.NPOI是构建在POI 3.x版本之上的,它可以在

NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析

我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部分为表头部分,蓝色前面几行是博主项目的基础样式,称为元数据),这类excel的表头多为2-3行,甚至于5/6行 ,具有合并层级关系,看似复杂,但只需要在我们以前的基础上稍微做一下重构就可以完美实现解析. 我们以各地区户籍人口城乡构成表头为例: 其实,只要我们能准确解析这类表头所表达的意思,就能复用以

.NET导出Excel的四种方法及评测

.NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspose.Cells四个市面上常见的库,各完成一个导出Excel示例.然后对其代码风格和性能做一个横向比较.最后我将说出我自己的感想. 文中所有的示例代码可以在这里下载: https://github.com/sdcb/blog-data/tree/master/2019/20190824-dotnet

防止SSL劫持的终极方法

众所周知,我们正处在一个存在着各种诈骗.劫持的网络年代,我们的各种帐号密码很多时候都能很容易地被黑客窃取.由此很多网站使用HTTPS来保护用户的信息不被窃取.而HTTPS本身所使用的SSL协议也并不是完美无缺,即使能确保本机安全,也还存在着各种SSL劫持了,令人防不胜防.影史十大最性感丝袜美腿镜头 曾经发生过并被大众知晓的SSL劫持有:Comodo CA被黑客入侵用于伪造SSL证书.DigiNotar CA被黑客入侵用于伪造SSL证书.法国政府伪造CA证书用于劫持Gmail等.当然,还有广为流传

EXCEL快速自动填充方法集锦

EXCEL快速自动填充方法集锦 原文地址,转载请注明:http://www.cnblogs.com/croso/p/5396841.html 方法一: 名称框输入a1:a1000回车,1, ctrl+回车,单击A1,双击填充柄,“自动填充选项”--“填充序列” 方法二: 先在A1输入需填充的内容,然后点右上角的填充按钮,点击“系列”选项,输入终止值 方法三: 编辑 定位 输入需要输入数据的最后一个单元格的位置ctrl ↑(方向键的上箭头) 编辑栏输入公式=MOD(ROW()-1,2)+1按ctr

Asp.net导出Excel乱码的解决方法

通过跟踪Asp.net服务器代码,没有乱码,然而导出Excel到浏览器后,打开时出现乱码. 解决方法是添加编码格式的前缀字节码:Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble()); ? 1 2 3 4 5 6 7 8 9 10 11 12 13 Response.Clear(); Response.AddHeader("content-disposition","attachment;filenam

vbs 解析 json jsonp 方法

昨天说了下用 htmlfile 来解析 html,今天依然用他来解析,htmlfile 是一个 COM 版的 BOM 和 DOM,所以解析 html, 执行 js 完全不在话下,今天就继续解析 json 和 jsonp 吧. 我收集了三种常见 json jsonp 的格式,因为很多人找我说如何用正则提取某个字符串,我看了下,要么是json,要么是jsonp,正则简直浪费,比如那种空间里说说的数据,上百条的信息,你正则个P,而且还有回复里的格式也差不多的,所以最好的方法还是解析. 先来看看常见的三

十七.jQuery源码解析之入口方法Sizzle(1)

函数Sizzle(selector,context,results,seed)用于查找与选择器表达式selector匹配的元素集合.该函数是选择器引擎的入口. 函数Sizzle执行的6个关键步骤如下: 1.解析选择器表达式,解析出块表达式和关系符. 2.如果存在位置伪类,则从左向右查找: a.查找第一个块表达式匹配的元素集合,得到第一个上下文元素集合. b.遍历剩余的块表达式和块间关系符,不断缩小上下文元素集合. 3.否则从右向左查找: a.查找最后一个块表达式匹配的元素集合,得到候选集,映射集

Delphi 导出数据至Excel的7种方法【转】

转自:http://blog.csdn.net/zang141588761/article/details/52275948 一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean; const xlNormal=-4143; var y : integer; tsList : TStringList; s,filename :string; a