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/ ...
随机推荐
- 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之三
原文:Getting Started with Sencha Touch 2: Build a Weather Utility App (Part 3) 作者:Lee BoonstraLee is a ...
- 程序员的视角:java 线程
在我们开始谈线程之前,不得不提下进程. 无论进程还是线程都是很抽象的概念,有一个关于进程和线程很形象的比喻能帮我们更好的理解. 进程就像个房子,房子是一个包含了特定属性的容器,例如空间大小.卧室数量等 ...
- iOS中关于UIApplication的详细介绍
UIApplication 什么是UIApplication? UIApplication对象是应用程序的象征.每一个应用都有自己的UIApplication对象,这个对象是系统自动帮我们创建的, 它 ...
- Understanding Android Security(安卓安全的理解)
论文作者: Enck, William Ongtang, MacHigar McDaniel, Patrick 下一代的开放操作系统不会在个人主机和大型主机上出现,而是在只能手机上.新环境的开放性将会 ...
- vector的简易实现
vector的简易实现整理自<数据结构与算法分析–C++描述(第3版)>3.4节“向量的实现”.详细可参考<STL源码分析>4.2节. 具体实现代码如下: #ifndef VE ...
- 【Visual C++】游戏编程学习笔记之五:单一背景滚动
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...
- TCP/IP概述
1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节. 2) 网络层,有时也称作互联网层, ...
- D-BUS详细分析
转:http://blog.csdn.net/yclzh0522/article/details/7090599 一.概述 官方网站:http://www.freedesktop.org/wiki/S ...
- "《算法导论》之‘图’":最小生成树(无向图)
本文主要参考自<算法>. 加权图是一种为每条边关联一个权值或是成本的图模型.这种图能够自然地表示许多应用.在一幅航空图中,边表示航线,权值则可以表示距离或是费用.在一幅电路图中,边表示导线 ...
- Leetcode_217_Contains Duplicate
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46271159 Given an array of inte ...