一、环境准备:pom.xml 导入依赖 poi-ooxml

 <dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
</dependencies>

二、Excel 读取 =》封装成对象

思路:将excel中的每一行row封装成对象cases,将对象cases保存到listCases集合方便后续调用!

1.创建对象cases

 1 package cn.xiaobing.pojo;
2
3 /**1.创建实体类
4 * 2.生成get和set方法
5 * 3.提供有参和无参构造器
6 * 4.重写toString方法
7 * @author Administrator
8 */
9 public class Cases {
10 private String caseId;
11 private String interfaceName;
12 private String url;
13 private String submitType;
14 private String dataType;
15 private String desc;
16 private String mobilephone;
17 private String pwd;
18 public String getCaseId() {
19 return caseId;
20 }
21 public void setCaseId(String caseId) {
22 this.caseId = caseId;
23 }
24 public String getInterfaceName() {
25 return interfaceName;
26 }
27 public void setInterfaceName(String interfaceName) {
28 this.interfaceName = interfaceName;
29 }
30 public String getUrl() {
31 return url;
32 }
33 public void setUrl(String url) {
34 this.url = url;
35 }
36 public String getSubmitType() {
37 return submitType;
38 }
39 public void setSubmitType(String submitType) {
40 this.submitType = submitType;
41 }
42 public String getDataType() {
43 return dataType;
44 }
45 public void setDataType(String dataType) {
46 this.dataType = dataType;
47 }
48 public String getDesc() {
49 return desc;
50 }
51 public void setDesc(String desc) {
52 this.desc = desc;
53 }
54 public String getMobilephone() {
55 return mobilephone;
56 }
57 public void setMobilephone(String mobilephone) {
58 this.mobilephone = mobilephone;
59 }
60 public String getPwd() {
61 return pwd;
62 }
63 public void setPwd(String pwd) {
64 this.pwd = pwd;
65 }
66 public Cases() {
67 super();
68 }
69 public Cases(String caseId, String interfaceName, String url, String submitType, String dataType, String desc,
70 String mobilephone, String pwd) {
71 super();
72 this.caseId = caseId;
73 this.interfaceName = interfaceName;
74 this.url = url;
75 this.submitType = submitType;
76 this.dataType = dataType;
77 this.desc = desc;
78 this.mobilephone = mobilephone;
79 this.pwd = pwd;
80 }
81 @Override
82 public String toString() {
83 return "Cases [caseId=" + caseId + ", interfaceName=" + interfaceName + ", url=" + url + ", submitType="
84 + submitType + ", dataType=" + dataType + ", desc=" + desc + ", mobilephone=" + mobilephone + ", pwd="
85 + pwd + "]";
86 }
87 }

2.读取readExcel方法实现

  1 package cn.xiaobing.excelUtil;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.lang.reflect.Method;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.List;
11 import java.util.Map;
12
13 import org.apache.poi.ss.usermodel.Cell;
14 import org.apache.poi.ss.usermodel.CellType;
15 import org.apache.poi.ss.usermodel.Row;
16 import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
17 import org.apache.poi.ss.usermodel.Sheet;
18 import org.apache.poi.ss.usermodel.Workbook;
19 import org.apache.poi.ss.usermodel.WorkbookFactory;
20
21 import cn.xiaobing.pojo.Cases;
22
23 /**读取Excel
24 * @author Administrator
25 */
26 public class ReadExcel {
27 /**加载cases类添加到list集合
28 * @return
29 */
30 public static List<Cases> loadCase(){
31 //创建存放cases的List列表,将excel中每行的数据封装成对象再添加到list集合
32 List listCases = new ArrayList();
33 //创建workbook工作薄对象
34 //文件目录写相对于项目的相对路径
35 File file = new File("src/test/resources/cases.xls");
36 InputStream inputStream = null;
37 Workbook workbook = null;
38 try {
39 inputStream = new FileInputStream(file);
40 workbook = WorkbookFactory.create(inputStream);
41 } catch (Exception e) {
42 e.printStackTrace();
43 }finally {
44 //finally必须执行的方法,利用finally关闭IO流
45 if(inputStream != null) {
46 try {
47 inputStream.close();
48 } catch (IOException e) {
49 e.printStackTrace();
50 }
51 }
52 }
53 //创建sheet表单对象
54 Sheet sheet = workbook.getSheetAt(0);//根据sheet下标获取
55 // Sheet sheet = workbook.getSheet("接口用例");//根据sheet名获取
56 //拿到excel的实际行数:返回行数下标=》Returns:last row contained n this sheet (0-based)
57 int rowNum = sheet.getLastRowNum();
58 //获取标题行index=0的列数
59 int cellNum = sheet.getRow(0).getLastCellNum();
60 //获取标题列索引和标题名的映射关系
61 Map<Integer, String> indexAndCellNameMap = indexAndCellNameMap(sheet);
62 //获取行,第一行为标题列,所以从下标1开始取行数据
63 //循环取出每一行
64 Object obj = null;
65 for (int i = 1; i <= rowNum; i++) {
66 try {
67 //每一行对应一个数据对象.调用一个newInstance方法得到一个对象
68 obj = Cases.class.newInstance();
69 } catch (Exception e1) {
70 e1.printStackTrace();
71 }
72 Row row = sheet.getRow(i);
73 for (int j = 0; j < cellNum; j++) {
74 //如果row为空,跳过继续
75 if(row == null) {
76 continue;
77 }
78 //获取列,同时设置空列的处理策略MissingCellPolicy.CREATE_NULL_AS_BLANK
79 Cell cell = row.getCell(j, MissingCellPolicy.CREATE_NULL_AS_BLANK);
80 //取出前设置列的类型,所有的列都当做是字符串来处理
81 cell.setCellType(CellType.STRING);
82 String cellValue = cell.getStringCellValue();
83 //获取要反射的方法名即:列标题前面拼接一个set就得到了此列要反射的方法名
84 String methodName = "set"+ indexAndCellNameMap.get(j);
85 //拿到方法对象
86 Method method =null;
87 try {
88 method = Cases.class.getMethod(methodName, String.class);
89 //反射调用方法
90 method.invoke(obj, cellValue);
91 } catch (Exception e) {
92 e.printStackTrace();
93 }
94 }
95 listCases.add(obj);
96 }
97 return listCases;
98 }
99 /**获取标题行,取出cell值,将标题列索引和其标题存到Map,构成映射关系
100 * @param sheet
101 * @return
102 */
103 public static Map<Integer, String> indexAndCellNameMap(Sheet sheet) {
104 //将标题行索引和标题行列名添加到indexAndCellNameMap保存后续使用
105 Map<Integer, String> indexAndCellNameMap = new HashMap<Integer, String>();
106 //获取第一行titleRow,由titleRow获取行列数cellNum
107 Row titleRow = sheet.getRow(0);
108 //拿到execl的实际列数cellNum,返回列数 1-based
109 int cellNum =titleRow.getLastCellNum();
110 //获取标题行每一列
111 for (int i = 0; i < cellNum; i++) {
112 Cell titleCell = titleRow.getCell(i);
113 titleCell.setCellType(CellType.STRING);
114 //取出列名
115 String cellValue = titleCell.getStringCellValue();
116 //将列索引和其标题存到map,构成映射
117 indexAndCellNameMap.put(i, cellValue);
118 }
119 return indexAndCellNameMap;
120 }
121 public static void main(String[] args) {
122 List<Cases> lst= ReadExcel.loadCase();
123 for (Cases cases : lst) {
124 System.out.println(cases);
125 }
126 }
127 }
Console:
Cases [caseId=1, interfaceName=Register, url=https://www.zhihu.com/signup?next=%2F, submitType=post, dataType=form, desc=手机号, mobilephone=18335198888, pwd=]
Cases [caseId=2, interfaceName=Register, url=https://www.zhihu.com/signup?next=%2F, submitType=post, dataType=form, desc=密码, mobilephone=, pwd=123456]
Cases [caseId=3, interfaceName=Register, url=https://www.zhihu.com/signup?next=%2F, submitType=post, dataType=form, desc=错误手机号+密码, mobilephone=123, pwd=123456]
Cases [caseId=4, interfaceName=Register, url=https://www.zhihu.com/signup?next=%2F, submitType=post, dataType=form, desc=正确手机号+错密码, mobilephone=18813989449, pwd=12345]
Cases [caseId=5, interfaceName=Register, url=https://www.zhihu.com/signup?next=%2F, submitType=post, dataType=form, desc=合格手机号+合格密码, mobilephone=18813989449, pwd=123456]

三、Excel 写入

1.例如用例执行结果回写到Excel中的Result列:

2.修改实体类Cases,添加result属性

 1 package cn.xiaobing.pojo;
2
3 /**1.创建实体类
4 * 2.生成get和set方法
5 * 3.提供有参和无参构造器
6 * 4.重写toString方法
7 * @author Administrator
8 */
9 public class Cases {
10 private String caseId;
11 private String interfaceName;
12 private String url;
13 private String submitType;
14 private String dataType;
15 private String desc;
16 private String mobilephone;
17 private String pwd;
18 private String result;
19 public String getCaseId() {
20 return caseId;
21 }
22 public void setCaseId(String caseId) {
23 this.caseId = caseId;
24 }
25 public String getInterfaceName() {
26 return interfaceName;
27 }
28 public void setInterfaceName(String interfaceName) {
29 this.interfaceName = interfaceName;
30 }
31 public String getUrl() {
32 return url;
33 }
34 public void setUrl(String url) {
35 this.url = url;
36 }
37 public String getSubmitType() {
38 return submitType;
39 }
40 public void setSubmitType(String submitType) {
41 this.submitType = submitType;
42 }
43 public String getDataType() {
44 return dataType;
45 }
46 public void setDataType(String dataType) {
47 this.dataType = dataType;
48 }
49 public String getDesc() {
50 return desc;
51 }
52 public void setDesc(String desc) {
53 this.desc = desc;
54 }
55 public String getMobilephone() {
56 return mobilephone;
57 }
58 public void setMobilephone(String mobilephone) {
59 this.mobilephone = mobilephone;
60 }
61 public String getPwd() {
62 return pwd;
63 }
64 public void setPwd(String pwd) {
65 this.pwd = pwd;
66 }
67 public String getResult() {
68 return result;
69 }
70 public void setResult(String result) {
71 this.result = result;
72 }
73
74 public Cases() {
75 super();
76 }
77 public Cases(String caseId, String interfaceName, String url, String submitType, String dataType, String desc,
78 String mobilephone, String pwd, String result) {
79 super();
80 this.caseId = caseId;
81 this.interfaceName = interfaceName;
82 this.url = url;
83 this.submitType = submitType;
84 this.dataType = dataType;
85 this.desc = desc;
86 this.mobilephone = mobilephone;
87 this.pwd = pwd;
88 this.result = result;
89 }
90 @Override
91 public String toString() {
92 return "Cases [caseId=" + caseId + ", interfaceName=" + interfaceName + ", url=" + url + ", submitType="
93 + submitType + ", dataType=" + dataType + ", desc=" + desc + ", mobilephone=" + mobilephone + ", pwd="
94 + pwd + ", result=" + result + "]";
95 }
96 }

3.写入实现类WriteExcel

 1 package cn.xiaobing.excelUtil;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.io.OutputStream;
9
10 import org.apache.poi.ss.usermodel.Cell;
11 import org.apache.poi.ss.usermodel.CellType;
12 import org.apache.poi.ss.usermodel.Row;
13 import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
14 import org.apache.poi.ss.usermodel.Sheet;
15 import org.apache.poi.ss.usermodel.Workbook;
16 import org.apache.poi.ss.usermodel.WorkbookFactory;
17
18 /**实现测试结果result回写excel
19 * @author Administrator
20 */
21 public class WriteExcel {
22 /**实现测试结果result回写excel的方法
23 * @param sheetNum 回写sheet下标数
24 * @param rowNum 回写行下标数
25 * @param cellNum 回写列下标数
26 * @param Result 回写表单列result内容
27 */
28 public static void writeExcel(int sheetNum,int rowNum,int cellNum,String Result) {
29 ////文件目录写相对于项目的相对路径
30 File file = new File("src/test/resources/cases.xls");
31 //输入流
32 InputStream inputStream = null;
33 Workbook workbook = null;
34 try {
35 inputStream = new FileInputStream(file);
36 //创建workbook工作薄对象
37 workbook =WorkbookFactory.create(inputStream);
38 } catch (Exception e) {
39 e.printStackTrace();
40 }finally {
41 if(inputStream != null) {
42 try {
43 inputStream.close();
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47 }
48 }
49 //根据传入的表单下标获取表单
50 Sheet sheet = workbook.getSheetAt(sheetNum);
51 //根据传入的行索引rowNum获取行
52 Row row = sheet.getRow(rowNum);
53 //根据传入的列索引cellNum获取列cell,同时设置空列的处理策略MissingCellPolicy.CREATE_NULL_AS_BLANK
54 Cell cell = row.getCell(cellNum,MissingCellPolicy.CREATE_NULL_AS_BLANK);
55 //取出前设置列的类型,所有的列都当做是字符串来处理
56 cell.setCellType(CellType.STRING);
57 //set执行结果result到cell列
58 cell.setCellValue(Result);
59 OutputStream outputStream = null;
60 try {
61 //准备输出流对象
62 outputStream = new FileOutputStream(file);
63 //将数据写入文件
64 workbook.write(outputStream);
65 } catch (Exception e) {
66 e.printStackTrace();
67 }finally {
68 if(outputStream != null) {
69 try {
70 outputStream.close();
71 } catch (IOException e) {
72 // TODO Auto-generated catch block
73 e.printStackTrace();
74 }
75 }
76 }
77 }
78
79 public static void main(String[] args) {
80 /**例如实际执行自动化测试中
81 * 已知写入的sheet表单下标
82 * 已知本条用例的caseID可以获取rowNum
83 * 已知写入列名可以获取cellNum
84 * 已知测试结果result
85 */
86 WriteExcel.writeExcel(0, 1, 8, "不通过,测试失败!");
       System.out.println("执行成功!");
87 }
88 }

总结:亲测后总结,分享给需要的人,不足之处后续修改补充! 

Excel 读写的更多相关文章

  1. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  2. python excel 读写

    python操作Excel读写--使用xlrd xlwt python中使用xlrd.xlwt操作excel表格详解

  3. Java学习---Excel读写操作

    1.1.1. 简介 Apache POI 使用Apache POI 完成Excel读写操作 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API ...

  4. JXL.jar简单封装Excel读写操作

    1.分析 一个excel文件能够有多页,每页excel中能够有多行,每行中能够有多列.用面向对象的思想能够把一行中的某列看作是一个String对象,一行看作是一个包括多个列的对象.一页是包括多行的对面 ...

  5. NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

    NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...

  6. NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))

    在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article ...

  7. EXCEL读写NPOI

    1.第一步: 可以使用ExcelAutomation进行EXCEl文件的读写,但是需要电脑上安装EXCEL,对EXCEL版本有要求,速度慢,有安全性,并发性问题,不适合网站类项目. 第二种方法: NP ...

  8. unity下跨平台excel读写

    这是以前写的跨windows和ios读写excel的工具,因为原来导表工具引用的第三方读写excel的dll只能在windos下使用,造成要在mac机器上跑PC端或者打包的时候,每次都要先在windo ...

  9. Excel读写方案XLSReadWriteII使用技巧总结

    XLSReadWriteII是一个读写Excel的组件.他的一般已用只要按照Demo操作基本都能实现,只要不是非常复杂的应用,XLSReadWriteII还是能够胜任的. 最近被派了一个写入图库的应用 ...

  10. Apache POI:Excel读写库

    1)Apache POI 简介 Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写 ...

随机推荐

  1. $.ajax 常用的套路

    $.ajax 常用的套路 (function(){ window.webApi = new Object(); webApi.get = function(url,data,callback){ $. ...

  2. 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 百篇博客分析OpenHarmony源码 | v65.01

    百篇博客系列篇.本篇为: v65.xx 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  3. 鸿蒙内核源码分析(调度故事篇) | 用故事说内核调度 | 百篇博客分析OpenHarmony源码 | v9.07

    百篇博客系列篇.本篇为: v09.xx 鸿蒙内核源码分析(调度故事篇) | 用故事说内核调度过程 | 51.c.h .o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...

  4. pdb的插拔测试

    pdb的插拔测试:将pdb从一个cdb中,插拔到另一个cdb中. 源端pdb unplug SQL> select instance_name from v$instance; INSTANCE ...

  5. Docker小白到实战之Docker Compose在手,一键足矣

    前言 Docker可以将应用程序及环境很方便的以容器的形式启动,但当应用程序依赖的服务比较多,或是遇到一个大系统拆分的服务很多时,如果还一个一个的根据镜像启动容器,那就有点累人了,到这有很多小伙伴会说 ...

  6. Python异常代码含义对照表

    Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是 ...

  7. 微服务+异步工作流+ Serverless,Netflix 决定弃用稳定运行 7 年的旧平台

    作者 | Frank San Miguel 策划 | 田晓旭 2021 年,Netflix 会将大部分的工作负载从 Reloaded 转移到 Cosmos 平台.Cosmos 是一个计算平台,它将微服 ...

  8. SudokuSolver 2.0:用C++实现的数独解题程序 【一】

    SudokuSolver 2.0 实现效果 H:\Read\num\Release>sudoku.exe Order please: Sudoku Solver 2.0 2021/10/2 by ...

  9. C++手动加载CLR运行托管程序(CLR Hosting)

    转载自:http://www.linuxidc.com/Linux/2012-10/72293.htm 机制介绍 有些时候主程序是通过C/C++实现的,但是我们希望通过托管代码来扩展非托管程序,从而也 ...

  10. 基于Apache Zookeeper手写实现动态配置中心(纯代码实践)

    相信大家都知道,每个项目中会有一些配置信息放在一个独立的properties文件中,比如application.properties.这个文件中会放一些常量的配置,比如数据库连接信息.线程池大小.限流 ...