- 一、背景
接口测试的测试数据一般保存在表格中,方便维护。POI框架能解决读入Excel中的测试数据并将测试结果回写到表格中。本次讨论的重点是读入,解决如何读入一个表格中的测试数据,用Object[] []进行保存。 -
二、预置条件
1、准备一个存放测试数据的表格,表格的内容如图所示,Excel取消了网址的超链接。不确定是否要取消
image.png
1.1 并将该表格放到Maven工程中,在已放入工程后本地修改Excel不会同步。
image.png
2、在Maven工程中下载poi的jar包
在Pom.xml配置依赖,如下
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
2.1 设置保存后,Pom.xml报错,下载poi的jra包失败
image.png
首行报错如下:
image.png
在下载到的本地路径下查看,只下载了一个文件,一般要有7个
image.png
2.1.1 怀疑依赖的脚本写错了---无拼写错误
和正确的逐字比较,没有拼写错误,没有多没有少。使用网页上查询到依赖,还是不行。
2.1.2 怀疑版本不对
将版本改为3.7 3.8 4.10也不行
2.1.3 观察fail信息,估计是网络慢下载失败
解决办法:将Maven工程里下载到本地的文件全部删除,重新下载。Pom.xml的首行不报错了,但是pom.xml和工程名前都有红叉叉,pom.xml的报错信息为Project read error。解决办法右键该工程强制更新,解决(具体步骤为:https://jingyan.baidu.com/article/b2c186c82e5b56c46ef6ff0f.html,只用了其中的第3步骤,不支持mvn命令就没有纠结做1和2)。之后下载jar包都会出现这个问题,都可以强制更新解决。
2.1.4 总结下解决办法
将Maven工程中下载到本地的jar包删除了,重新下载。
重新下载可能会出现pom Dependency Hierarchy project read error错误,按照https://jingyan.baidu.com/article/b2c186c82e5b56c46ef6ff0f.html中的步骤3就能解决。
- 三、代码
1 思路
工厂--》拿出workbook(也就是一个Excel)-->获取表单sheet--》获取Row(行)--》获取列(也就是一个单元格)
2 调用poi中相关的类和方法
2.1 方法的参数和返回值
2.1.1 获取workbook对象:WorkbookFactory.create(File) 注意book不要写成了Book,
---参数为一个文件对象,new File("src/test/resources/testDate.xls"),File对象里的参数为文件所在的相对路径
---返回值为一个Workbook对象
2.1.2 获取表单对象:workBook.getSheetAt(int)
--参数为一个整数,表示一个workbook中第几个sheet.从0开始
--返回值为一个Sheet对象
2.1.3 获取行对象:sheet.getRow(int),从0开始
2.1.4 获取列对象:row.getCell(int,MissingCellPolicy),从0开始
--参数策略,MissingCellPolicy.CREATE_NULL_AS_BLANK
解决单元
--返回值为一个Row对象
格为空时读入数据的策略,避免在使用该cell的值时出现空指针异常
2.1.5 设置列的类型:cell.setCellType(CellType)
--参数为CellType对象,CellType.STRING
--无返回值
2.1.6 获取一个列中的值:cell.getStringCellValue()
--返回值为String
3 获取某个单元格内容的代码
//从工厂里获取一个workbook对象
Workbook workbook = WorkbookFactory.create(new File("src/test/resources/testDate.xls"));
//从workbook中获取第sheetNum个sheet对象,sheetNum从0开始计数
Sheet sheet = workbook.getSheetAt(sheetNum - 1 );
//从Sheet对象中获取需要的Row,从0开始计数。实际我们看到的表格行数从1开始,
//参数要减去1
Row row = sheet.getRow(rowNum - 1);
//从Row对象中获取指定的列,确定为某个单元格,同上减去1
Cell cell = row.getCell(columnNum -1);
//设置Cell对象的值类型
cell.setCellType(CellType.STRING);
//获取cell对象的值
String value = cell.getStringCellValue();
4 用Object[][]对单元格内容进行存储,代码如下
package inputDemo;
import java.io.File;
import java.io.IOException;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
/*import org.apache.poi.ss.usermodel.WorkbookFactory;*/
public class ExcelUtil {
public static Object[][] read(int sheetNum,int starRow,int endRow,int starCell,int endCell){
//创建一个Object 二维数组存放cell的值
Object[][] datas = new Object[endRow-starRow+1][endCell-starCell+1];
try {
try {
//从工厂里获取一个workbook对象
Workbook workbook = WorkbookFactory.create(new File("src/test/resources/testDate.xls"));
//从workbook中获取第sheetNum个sheet对象,sheetNum从0开始计数
Sheet sheet = workbook.getSheetAt(sheetNum - 1 );
for(int i=starRow;i<=endRow;i++){
//从Sheet对象中获取需要的Row,从0开始计数。实际我们看到的表格行数从1开始,
//参数要减去1
Row row = sheet.getRow(i - 1);
for(int j=starCell;j<=endCell;j++){
//从Row对象中获取指定的列,确定为某个单元格,同上减去1
Cell cell = row.getCell(j -1,MissingCellPolicy.CREATE_NULL_AS_BLANK);
//设置Cell对象的值类型
cell.setCellType(CellType.STRING);
//获取cell对象的值
String value = cell.getStringCellValue();
//将单元格的值存入二维度数组
datas[i-starRow][j-starCell] = value;
/*System.out.println("i-starRow = "+(i-starRow));
System.out.println("i-starRow = "+(i-starRow));*/
}
}
} catch (EncryptedDocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return datas;
}
}
5 测试数据读入功能是否正常的代码
package inputDemo;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//int sheetNum,int starRow,int endRow,int starCell,int endCell
Object[][] datas = ExcelUtil.read(1,2,9,4,7);
for(Object[] objects : datas){
for(Object object : objects){
System.out.print("【"+object+"】");
}
System.out.println();
}
}
}
6 运行结果
【https://hao.360.cn/?a1004】【post】【1】【1】
【https://hao.360.cn/?a1004】【post】【2】【2】
【https://hao.360.cn/?a1004】【post】【3】【3】
【https://hao.360.cn/?a1004】【post】【4】【4】
【https://hao.360.cn/?a1004】【post】【5】【5】
【https://hao.360.cn/?a1004】【post】【6】【6】
【https://hao.360.cn/?a1004】【post】【7】【7】
【https://hao.360.cn/?a1004】【post】【8】【8】
网友评论