前面介绍了POI可以操作excel,也简单的提到另一个操作excle的工具,本篇介绍一个其他的可以操作excel的工具,但是这个工具有一个前提,excel文件版本只能是97-2003版本,如果是2007或者以上版本是操作不了的,所以,还是建议掌握POI操作excel文件。不管这个Jexcel只能操作2003版本的excel,我们先来看看如何读取一个2003版本excel内的数据。
目前常见读写Excel的工具类开源javaAPI有两种方式:
一个是JXL(Java Excel API) 官网地址:http://jexcelapi.sourceforge.net/
一个是Apache的POI(Poor Obfuscation Implementation)官网地址:http://poi.apache.org/
POI支持微软的OLE2格式文件Office 2003及以下版本;同时支持微软的OOXML(Office Open XML)标准,也就是Office 2007以上版本。JXL只能实现对Excel 2003以下版本的支持。
POI使用HSSF对象操作OLE2格式Excel,文件后缀为.xls的;使用XSSF、SXSSF对象操作OOXML格式Excel,文件后缀为.xlsx的。
对于OLE2版本的Excel,一个Sheet工作表它的行最多支持到65536行,列支持到256列;
对于OOXML版本的Excel,一个Sheet工作表它的行支持到1048576行,列支持到16384列。
1.打开网站http://www.java2s.com/Code/Jar/j/Downloadjxl2612jar.htm,选择下面2.6.12版本下载。如下图所示:
2.点击“jxl/jxl-2.6.12.jar.zip( 672 k)”,开始下载,如下图所示:
3.下载完后解压,文件结构如下图所示:
1.把JXL文件添加在你Selenium当前项目的library中,具体添加方法,宏哥在这里就不赘述了,不清楚的可以看一下上一篇文章是怎么添加的。
1. 准备一个2003版本的excel文件:test-data.xls:桌面新建一个test-data.xlsx,然后输入如下内容,如下图所示:
2.把这个文件放到eclipse项目中,如下图所示:
1.新建一个ReadExcel.java的文件,输入如下代码。
package lessons;
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
/**
* @author 北京-宏哥
*
* @公众号:北京宏哥
*
* 《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 -下篇(详细教程)
*
* 2022年2月12日
*/
public class OperateExcle {
public static void main(String[] args) {
//File src = new File(".\\Files\\test-data1.xls");
try {
//从指定位置的文件创建工作簿对象;根据计算机上的位置更改文件的路径。
Workbook wrk1 = Workbook.getWorkbook(new File(".\\Files\\test-data1.xlsx"));
//获取工作簿中第一个工作表的引用
Sheet sheet1 = wrk1.getSheet(0);
//使用工作表的getCel(int col, int row)方法获取对单元的引用
Cell colArow1 = sheet1.getCell(0, 0);
Cell colBrow1 = sheet1.getCell(1, 0);
Cell colArow2 = sheet1.getCell(0, 1);
//使用单元格引用的getContents()方法获取单元格的内容,返回值为一个字符串
String str_colArow1 = colArow1.getContents();
String str_colBrow1 = colBrow1.getContents();
String str_colArow2 = colArow2.getContents();
// 显示单元格内容
System.out.println("Contents of cell Col A Row 1: \"" + str_colArow1 + "\"");
System.out.println("Contents of cell Col B Row 1: \"" + str_colBrow1 + "\"");
System.out.println("Contents of cell Col A Row 2: \"" + str_colArow2 + "\"");
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
1)下面一行创建封装Excel文件的Workbook对象。 本例中,getWorkbook()方法接受指向位于“.\\Files\\test-data1.xls”处的Excel文件的File对象。
Workbook wrk1 = Workbook.getWorkbook(new File(".\\Files\\test-data1.xls"));
2)下面的行用于获取Excel文件中第一个工作表。 以类似方式,如果您正在处理的Excel文件有多个工作表,则可以获取任何其他工作表。
Sheet sheet1 = wrk1.getSheet(0);
3)下面的代码根据传递给getCell方法的参数为我们提供了对工作表中特定单元格的引用。 第一个参数表示列,第二个参数表示行。 确保只访问非空单元格,否则此方法将抛出ArrayIndexOutOfBoundsException。
Cell colArow1 = sheet1.getCell(0, 0);
4)下面这行调用getContents()方法提取Cell的内容。 内容以字符串形式返回。
String str_colArow1 = colArow1.getContents();
1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:
1.读入Excel报jxl.read.biff.BiffException: Unable to recognize OLE stream,如下图所示:
解决办法:
说明导入的excel不是jxl认定的标准的OLE file,可是打开的看起来是Excle,然后我把这个Excel重新另存为一个Excel,发现他默认的保存类型是“单个文件网页”(通过EditPlus打开Excle可以看到是网页文件),然后把他保类型修改为Microsoft Office Excel,保存导入,就可以正确导入了。
另外一个可能的原因是:excel的版本问题,另存为的时候,我们要选择2003,如下图所示: