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,也不用管文件类型。
目前还没有发现这种方法的缺点。
EXCEL解析之终极方法WorkbookFactory的更多相关文章
- Asp.net操作Excel(终极方法NPOI)(转)
原文:Asp.net操作Excel(终极方法NPOI) 先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中 ...
- Android EXCEL 解析 xls 和 xlsx,方法其实很简单
前言 Excel 解析,一般来说是在服务端进行的,但是如果移动端要实现解析Excel的功能,那也是有实现的方法的. 不过由于Android 原生用Java/Kotlin实现,所以也可以参考服务端解析E ...
- NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析
我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...
- Excel解析easyexcel工具类
Excel解析easyexcel工具类 easyexcel解决POI解析Excel出现OOM <!-- https://mvnrepository.com/artifact/com.alibab ...
- Excel解析工具easyexcel全面探索
1. Excel解析工具easyexcel全面探索 1.1. 简介 之前我们想到Excel解析一般是使用POI,但POI存在一个严重的问题,就是非常消耗内存.所以阿里人员对它进行了重写从而诞生了eas ...
- 导入Excel——解析Excel
读取Excel 思路:先读取整个Excel,即工作簿,再依次读取其中的每个工作表Sheet,最后读取工作表内的表格. 一.读取工作簿利用流读取指定目录中的工作簿,并写入内存. /** * Constr ...
- [C#] NPOI Excel解析
通过NPOI解析Excel,将数据保存到DataTable中. #region excel解析 public DataTable ImportExcelFile(string filePath) { ...
- EXCEL快速自动填充方法集锦
EXCEL快速自动填充方法集锦 原文地址,转载请注明:http://www.cnblogs.com/croso/p/5396841.html 方法一: 名称框输入a1:a1000回车,1, ctrl+ ...
- Linux中强制结束一个进程的终极方法
在 Linux Ubuntu 服务器上用 dnx 基于 Kestrel 成功运行一个 ASP.NET 5 站点后,怎么也无无法退出. 运行的命令如下: /data/git/dnx/artifacts/ ...
随机推荐
- mysql大小写敏感(默认为1,不敏感)
在 MySQL 中,数据库和表其实就是数据目录下的目录和文件,因而,操作系统的敏感性决定数据库和表命名的大小写敏感.这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Un ...
- iOS监听模式系列之通知中心
补充--通知中心 对于很多初学者往往会把iOS中的本地通知.推送通知和iOS通知中心的概念弄混.其实二者之间并没有任何关系,事实上它们都不属于一个框架,前者属于UIKit框架,后者属于Foundati ...
- 两种方法 更改 EBS R12界面LOGO以及内容
from:metalink more: Note 174219.1 - How To Change The Logo In The Oracle Application Menu Note 84975 ...
- RHEL6.4安装nginx
RHEL6.4安装nginx 下载nginx-1.6.1.tar.gz, 解压进入目录: $ yum install pcre-devel $ ./configure --with-http_ssl_ ...
- 【6】-BAT面试之操作系统内存详解
本文主要参考两篇博客,读后整理出来,以供大家阅读,链接如下: http://blog.jobbole.com/95499/?hmsr=toutiao.io&utm_medium=toutiao ...
- c#实例化继承类,必须对被继承类的程序集做引用
0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Culture=neutral, PublicKeyTo ...
- 大型B2C网站高性能可伸缩架构技术探秘
大型B2C网站高性能可伸缩架构技术探秘 2010-07-21 08:51 狂放不羁 JavaEye 字号:T | T 向您介绍大型B2C网站高性能的网站架构技术,包括缓存的使用.应用程序和数据库的拆分 ...
- Python-网站页面代码获取
Python3.6 库:urllib3, bs4 主程序是抓取亚马逊图书销售排名数据,但是亚马逊应该是加了反爬虫,拒绝疑似机器人的请求,这部分暂时以百度代替. 其实简单的页面抓取,常用的urllib. ...
- SystemJS to Webpack – Before You Begin
http://angularfirst.com/systemjs-to-webpack-before-you-begin/ This is a primer discussing why to mov ...
- CSS后代选择器“空格”和“>”的使用辨析
要点: 1. "空格":包含子孙 2. ">":含子不含孙 举个栗子: html代码如下 <body> <div class=" ...