POI 读写Excel

来源:互联网 发布:linux 查看总cpu使用率 编辑:程序博客网 时间:2024/06/01 11:51

许多自动化测试工具都是支持数据驱动的,容许你去自动运行测试用例,输入和输出数据放在Excel 中,

 

如何从Excel 中读取数据

在Selenium 框架中可能需要从Excel 中读取测试数据,下面来介绍下用JAVA 如何读取Excel 中的数据

首先下载并导入以下jar 包




导入之后新建一个EXCEL 的包

再新建一个Read 的类

再在当前工程下新建一个TestData.xlsx 文件

之后在Sheet 1中增加以下内容





在编写代码之前我们先来理清下我肉眼是如何读到用户名信息的

1:第一步打开TESTDATA.XLSX文件

2:切换到Sheet1 

3:光标移动到第二行

4:光标移动到第二行第二列

5: 读取二行二列中的值

在理清了上述流程之后,我们编写代码时也按这流程来写就行了

 

第一步实现打开EXCEL 

在这里是用二进制文件流的方式处理文件

先创建文件流

FileInputStream ExcelFile=newFileInputStream(“Excel路径)

ExcelWBook=newXSSFWorkbook(ExcelFile);

第二步切换到对应Sheet文件

ExcelWSheet=ExcelWBook.getSheet(SheetName);

第三步指定行号

ROW=ExcelWSheet.getRow(RowNum)

第四步指定列号

Cell= ROW. getCell(ColNum)

第五步:

读取单元格中的值

现在将以上步骤写到一个方法中就变成读取某个单元格中的值了

实现代码如下

 



现在结果已取到了

在上面是最理想的方式,实际上我们是要做一些异常的设想,比如我可能在读文件时文件不存在,系统要如何处理呢,比如指定的Sheet不存在又要如何处理呢,还有指定行,指定列不存在如何处理呢,各单元格中存放的数据又有不同类型等等,这些我们都是需要做一些处理的,好了,下面就讲解下如何处理Excel中的异常

 

 

第一种异常

我现在将文件名的后缀删除掉,再次运行时肯定会报错,现在我们来试下






出现文件没找到异常,


那我们可以用Try{}Catch(FileNotFoundException){}去埔捉是否有该异常




现在我们考量如果Sheet1找不到的情形,现在我们再将代码修改下,将Sheet1改成Sheet10

执行后发现第30行是空值,为什么会空值呢,是因为他的前一行代码没有找到Sheet10的原因

所以这个时候我们可以在29行之后先判断下有没有空值,如果是空值就跳过不执行或抛错



在这找到空值就没有再执行32的内容了

 

同样的方式行号,与列号都有可能出现没找到的情形,我们将所有条件都加上

最终的代码是这样的



在获取单元格中的值时又会出不同数据格式

在这也需要做一次判断




 

上述代码结构不清,代码混乱,为了让代码简洁我们将代码实现分离,并用参数的方式传递Sheet名,行号,列号之类的

现在我们来改进下

 

将打开Excel的操作抽取出来




将指定行与列的一系统操作放在一个方法内,这种比较常见,经常需要按行按列读取数据



这样假如我要读取22列的数据,就可以用ReadData11获取到了

实际上我们有时可能会出现这种情况,每个Sheet中有很多行,很多列,事实上我也不可能全部像上面那样用常量方式取值,一般的做法是先找到我测试用例所在的行号,之后用在这一行去找其它相关的数据



那如何实现呢

第一步:先获取Sheet中最大行号

第二步:遍历所有行,匹配与指定测试用例相同的字符串,获得行号

第三步:依据行号用 ReadDataxxx1)获得相关数据

代码实现如下:

第一,第二步的实现代码如下



到这里我们就基本上了解如何读取Excel了,那比如我们在测试过程中需要将结果保存起来如何办呢,这时我们会想到需要对Excel进行写操作,下面我来介绍如何写入Excel

 

同样我们一开始先来想下手工写入数据流程

1:打开EXCEL 

2:指定Sheet

3:指定行号

4:指定列号

5:写入数据

6:保存数据

 

了解了操作流程,我们就将思想转为成代码

 

其实1234我们在读Excel时就已写过,但这里要注意下,我们在读Excel时是不是已有数据,那也就是说每个单元格中已有内容,我们用

getRow (行号)不是空值对吗,如果我们要往一个没有值的单元格写值时一开始那个行号是空值,所以我们第三步应改为创建一个行号,第四步改为创一个列号

创建行号我们可以用CreateRow(行号)

在创建行号时我们要想一个问題,我们一开始创建了第一行,并写入一个值到单元格中,比如我想写入一个结果到第一行第二个单元格时

也是先创建一行吗,如果再用创建方式生成第一行,那前一次写入的数据会不会不存在呢,实际上是会被删掉的,这个自已可以去试试

所以我们代码实现应是这样

一开始用getrow(1)如果反回的值是空值,那就用CreateRow的方式,如果不是空值我就用GetRow(1)




我们来看在苏宁易实际运行时如何获取用户名和密码的





0 0
原创粉丝点击