一、数据驱动测试环境搭建
1、下载jar包,用于读取Excel文件。
http://poi.apache.org/download.html
2、解压下载的文件,将图中圈起来的包都build path到eclipse项目中。(前面的章节有讲到如何build path)
注:对03版Excel和07版以上的Excel操作时代码实现有一定的区别。
二、从Excel文件中读数据(以下以07版Excel为例)
注:对03版Excel和07版以上的Excel进行读取操作时代码实现有一定的区别。
1 package excel; 2 3 import java.io.FileInputStream; 4 5 import org.apache.poi.xssf.usermodel.XSSFCell; 6 import org.apache.poi.xssf.usermodel.XSSFSheet; 7 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 8 9 public class ExcelRead { 10 11 public static void main(String[] args) { 12 // 识别Excel 13 XSSFWorkbook excelWBook; 14 // 识别Excel表单 15 XSSFSheet excelWSheet; 16 // 识别要读取的单元格 17 XSSFCell cell; 18 19 // 定义一个变量用于存放需要被读取的excel的位置 20 String path = "C:\\Users\\acer\\Desktop\\dd\\07.xlsx"; 21 // 因为一个表格中有多个sheet表单,所以此处定义一个变量存放需要操作的sheet名称 22 String sheetName = "Sheet1"; 23 24 try{ 25 // 读取指定文件字节流,以便于传给XSSFWorkbook 26 FileInputStream excelFile = new FileInputStream(path); 27 // 初始化XSSFWorkbook对象时,带上了excelFile文件字节流,实例化Excel表对象 28 excelWBook = new XSSFWorkbook(excelFile); 29 // 实例化表单XSSFSheet 30 // 通过excelWBook对象调用getSheet方法返回excelWSheet对象,返回表中的表单对象,通过定义的表单的名字变量sheetName来获取表单 31 excelWSheet = excelWBook.getSheet(sheetName); 32 // 获取单元格 33 // 在指定Excel表单中从指定的行和列开始读取数据,此处设置从第一行第一列开始读取(索引位从0开始,因此读取第一行第一列均填写为0) 34 cell = excelWSheet.getRow(0).getCell(0); 35 // getStringCellValue()方法能够取到单元格中的数据 36 String cellData = cell.getStringCellValue(); 37 // 打印获取到的值 38 System.out.println("获取到的cell data单元格数据是:"+cellData); 39 40 41 }catch(Exception e){ 42 e.printStackTrace(); 43 } 44 } 45 }
运行结果:
二、从Excel文件中读多套数据
1、首先新建一个Excel表格存放需要读取的数据。
1 package excel; 2 3 import java.io.FileInputStream; 4 5 import org.apache.poi.ss.usermodel.Cell; 6 import org.apache.poi.ss.usermodel.DataFormatter; 7 import org.apache.poi.ss.usermodel.Row; 8 import org.apache.poi.xssf.usermodel.XSSFCell; 9 import org.apache.poi.xssf.usermodel.XSSFSheet; 10 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 11 12 public class ExcelUtility { 13 14 //表 15 private static XSSFWorkbook ExcelWBook; 16 //表单 17 private static XSSFSheet ExcelWSheet; 18 19 /* 20 * 设置文件路径,打开Excel 文件 21 * 22 * @params - Excel 路径 and 表单名字 23 * */ 24 public static void setExcelFile(String path,String sheetName) throws Exception { 25 try { 26 // 打开Excel文件,进行读取 27 FileInputStream ExcelFile = new FileInputStream(path); 28 // 访问excel表 29 ExcelWBook = new XSSFWorkbook(ExcelFile); 30 ExcelWSheet = ExcelWBook.getSheet(sheetName); 31 }catch(Exception e){ 32 throw(e); 33 } 34 } 35 36 // 读取多组数据 37 // 定义tableName用于存放读取的表格中标识开始和结束的值 38 public static String[][] getTestData(String tableName){ 39 String[][] testData = null; 40 41 try { 42 // 处理单元格中的数字和字符串 43 DataFormatter formatter = new DataFormatter(); 44 // BoundaryCells 数组里放的是第一列和最后一列的两个元素 45 // 根据第一列和最后一列可以知道读那些行数据,findCelles()方法是自己定义创建的,通过findCelles获取第一列和最后一列的两个元素 46 // 定义XSSFCell类型的数组来接收findCelles方法的返回值 47 XSSFCell[] boundaryCells = findCelles(tableName); 48 // 单元格开始处 49 // 将findCelles方法返回的数组中的第一个元素取出来放到startCell中 50 XSSFCell startCell = boundaryCells[0]; 51 // 单元格结束处 52 // 将findCelles方法返回的数组中的第二个元素取出来放到endCell中 53 XSSFCell endCell = boundaryCells[1]; 54 55 // 根据单元格开始出找到行开始处,开始读取我们真正需要用到的数据给单元格行赋值,找出单元格索引位 56 // 给单元格的起始行索引位加一 57 int startRow = startCell.getRowIndex()+1; 58 // 给单元格的结尾行索引位减一 59 int endRow = endCell.getRowIndex()-1; 60 // 给单元格的起始列索引位加一 61 int startCol = startCell.getColumnIndex()+1; 62 // 给单元格的结尾列索引位减一 63 int endCol = endCell.getColumnIndex()-1; 64 65 // 在通过上面的startRow等变量获取到了我们实际需要读取数据的索引位后,我们需要告诉程序真正需要读取的数据一共有多少行、多少列 66 /* 67 * 程序如何知道我们有多少行多少列的数据需要被真正读取到? 68 * 69 */ 70 // 新建字符串类型的二维数组, 71 // testData中存有读取的数据范围 72 // 行:endRow - startRow + 1 表示第一维的维度有多少行 ,endCol - startCol + 1表示第二维的长度有多少列 73 // 例如我们加上表头和末尾结束行一共有4行,其中2行是我们实际需要读取的数据,上面获取到的endRow=3,startRow=1,因此3-2后还需要加1才是我们实际读取数据的行数 74 testData = new String[endRow - startRow + 1][endCol - startCol + 1]; 75 // 遍历每一行,从行开始索引位startRow开始读取(测试表表头、单元格的下一行),在endRow行结束,endRow(结束行的前一行)需要加1是因为用的是< 76 for(int i = startRow; i < endRow +1;i++) { 77 // 遍历每一行里面的没一列 78 for(int j=startCol;j<endCol+1;j++) { 79 // 该读取方式只能读取字符串类型的数据 80 // testData[i-startRow][j-startCol]= 81 // ExcelWSheet.getRow(i).getCell(j).getStringCellValue(); 82 // 该读取方式能够读取字符串和数字类型的数据 83 // 读取每一行里面每一列的值,存放读取到的行和列值 84 Cell cell = ExcelWSheet.getRow(i).getCell(j); 85 // 将值传给formatCellValue,formatCellValue将取到的值都转换为字符串存放到testData这个二维数组中 86 testData[i-startRow][j-startCol]=formatter.formatCellValue(cell); 87 } 88 } 89 }catch(Exception e) { 90 91 } 92 93 return testData; 94 } 95 96 // 该方法用来查找单元格中标识开始读取数据和结束读取数据的标识并赋值给定义的XSSFCell数组 97 public static XSSFCell[] findCelles(String tableName) { 98 // DataFormatter:数据格式 99 DataFormatter formatter = new DataFormatter(); 100 // 定义一个变量,用来检查tablename的值 101 String pos = "begin"; 102 // 定义一个XSSFCell类型的数组 103 // 数组中存放单元格类型的元素,长度为2 104 XSSFCell[] cells = new XSSFCell[2]; 105 106 // 嵌套for循环读取表格中的数据 107 // 第一层for循环遍历的是Row类型,变量名为row,在ExcelWSheet中遍历,操作行 108 for(Row row:ExcelWSheet) { 109 // 第二层for循环遍历的是Cell类型,变量名为cell,在row中遍历,操作列 110 for(Cell cell:row) { 111 // if判断tableName的值和单元格中取到的值是否一致,一致就继续向下执行 112 /* 113 * 被注释的if和未被注释的if都是用了判断值是否相等,只是getStringCellValue()方法只处理单元格中是文本格式的数据, 114 * 而formatCellValue()方法不管是文本还是数值都可以处理转换成字符串类型然后传给程序 115 */ 116 // 只能处理字符,用于读取标识开始和结束的字符串 117 // if(tableName.equals(cell.getStringCellValue())){ 118 // 数字和字符都能处理 119 if(tableName.equals(formatter.formatCellValue(cell))) { 120 // 如果pos的值等于begin 121 // equalsIgnoreCase表示忽略大小写 122 if(pos.equalsIgnoreCase("begin")) { 123 // 找到开始单元格,用作边界单元格 124 // 如果pos的值等于begin,就把找到的单元格中标识开始读取数据的值赋到数组中的第一个元素 125 cells[0] = (XSSFCell) cell; 126 // 数组一赋值完成后把pos的值改为end 127 pos = "end"; 128 }else { 129 // 找到结束单元格,用作边界单元格 130 // 把找到的单元格中标识结束读取数据的值赋到数组中的第一个元素 131 cells[1] = (XSSFCell) cell; 132 } 133 } 134 } 135 } 136 // 返回单元格数组,数组中存放的就是循环中获取到的标识开始和结束的单元格位置值 137 return cells; 138 } 139 140 }
断更了7个月实在抱歉,家中有些事情需要处理,以后会不定时更新直到全部自动化流程结束
下一节实操case读取多组数据登录邮箱
如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。
内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。
欢迎关注,转载请注明来源。