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/ ...
随机推荐
- android报错 Expected BEGIN_OBJECT but was STRING at line 1 column 39 path $
我在使用retrofit和Gson配合时,出现了这个问题,疑惑中乱七八糟瞎搞了一个下午没有解决.期间怀疑Gson解析不能使用泛型(因为我的解析使用了泛型),后来又觉得可能是我的关键字正好是解析器的某个 ...
- C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- 01_Nginx安装,nginx下部署项目,nginx.conf配置文件修改,相关文件配置
1.下载Nginx,进入Nginx下载地址:http://nginx.org/ 点击nginx-1.8.0,进入:http://nginx.org/en/download.html,下载文件: ...
- /dev、/sys/dev 和/sys/devices 和udev的关系
/dev,设备文件存储目录,应用程序通过对这些文件的读写和控制,可以访问实际的设备: /sys/devices目录,按照设备挂接的总线类型,组织成层次结构,保存了系统所有的设备:是文件系统管理设备的最 ...
- 传统定时器技术 Timer and TimerTask
本文为张孝祥java并发课程的学习笔记. java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个TimerTask实际上就是一个拥有run方法的类,需要定时 ...
- MySQL 5.6初始配置调优
原文链接: What to tune in MySQL 5.6 after installation原文日期: 2013年09月17日翻译日期: 2014年06月01日翻译人员: 铁锚 随着 大量默认 ...
- navicat为mysql建立索引
索引的目的是大大提高查询效率,还有读写效率. kettle向sql里面插入,更新时,也要建立索引,可以大大提升处理时间. 但是建立索引报错:Specified key was too long; ma ...
- SharePoint JS感悟-js脚本
最近有些迷恋js脚本,因为自己对Asp.net不够熟悉,又是Moss的一年级新生,不是对代码开发不感兴趣,面向对象自己也了解一些,代码也能大致读懂,个人觉得还是经验积累,作为代码开发人员,还是需要3- ...
- masm6.11的BUG?
mov eax,[ebp + eax] ;->DS: mov eax,[eax + ebp] ;->SS: 上述2行代码生成的机器码反了,据说masm8也有此问题,但是masm9是正常的.
- ftp实现普通账号和vip账号限速
ftp工作流程: ftp回话包含了两个通道,控制通道和数据通道,ftp的工作有两种模式,一种是主动模式,一种是被动模式,以ftpserver为参照物,主动模式,服务器主动连接客户端传输,被动模式,等待 ...