感受一下从excel表导入测试案例
本项目对excel表的操作主要用了jxl,首先在pom.xml文件下写上引入jxl的jar包的代码并导入
<dependency>
<groupId>net.sourceforge.jexcelapigroupId>
<artifactId>jxlartifactId>
<version>2.6.12version>
dependency>
ExcelUtil工具类代码参考了以下博文
导入导出Excel的Java工具类ExcelUtil
ExcelUtil工具类代码
public class ExcelUtil {
/**
* @MethodName : excelToList
* @Description : 将Excel转化为List
* @param in :承载着Excel的输入流
* @param entityClass :List中对象的类型(Excel中的每一行都要转化为该类型的对象)
* @param fieldMap :Excel中的中文列头和类的英文属性的对应关系Map
* @param uniqueFields :指定业务主键组合(即复合主键),这些列的组合不能重复
* @return :List
* @throws ExcelException
*/
public static List excelToList(
InputStream in,
String sheetName,
Class entityClass,
LinkedHashMap fieldMap,
String[] uniqueFields
) throws ExcelException {
//定义要返回的list
List resultList=new ArrayList();
try {
//根据Excel数据源创建WorkBook
Workbook wb=Workbook.getWorkbook(in);
//获取工作表
Sheet sheet=wb.getSheet(sheetName);
//获取工作表的有效行数
int realRows=0;
for(int i=0;iint nullCols=0;
for(int j=0;jif(currentCell==null || "".equals(currentCell.getContents().toString())){
nullCols++;
}
}
if(nullCols==sheet.getColumns()){
break;
}else{
realRows++;
}
}
//如果Excel中没有数据则提示错误
if(realRows<=1){
throw new ExcelException("Excel文件中没有任何数据");
}
Cell[] firstRow=sheet.getRow(0);
String[] excelFieldNames=new String[firstRow.length];
//获取Excel中的列名
for(int i=0;i//判断需要的字段在Excel中是否都存在
boolean isExist=true;
List excelFieldList= Arrays.asList(excelFieldNames);
for(String cnName : fieldMap.keySet()){
if(!excelFieldList.contains(cnName)){
isExist=false;
break;
}
}
//如果有列名不存在,则抛出异常,提示错误
if(!isExist){
throw new ExcelException("Excel中缺少必要的字段,或字段名称有误");
}
//将列名和列号放入Map中,这样通过列名就可以拿到列号
LinkedHashMap colMap=new LinkedHashMap();
for(int i=0;i//判断是否有重复行
//1.获取uniqueFields指定的列
Cell[][] uniqueCells=new Cell[uniqueFields.length][];
for(int i=0;iint col=colMap.get(uniqueFields[i]);
uniqueCells[i]=sheet.getColumn(col);
}
//2.从指定列中寻找重复行
for(int i=1;iint nullCols=0;
for(int j=0;j1,
uniqueCells[j][i].getColumn(),
uniqueCells[j][realRows-1].getRow(),
true);
if(sameCell!=null){
nullCols++;
}
}
if(nullCols==uniqueFields.length){
throw new ExcelException("Excel中有重复行,请检查");
}
}
//将sheet转换为list
for(int i=1;i//新建要转换的对象
T entity=entityClass.newInstance();
//给对象中的字段赋值
for(Map.Entry entry : fieldMap.entrySet()){
//获取中文字段名
String cnNormalName=entry.getKey();
//获取英文字段名
String enNormalName=entry.getValue();
//根据中文字段名获取列号
int col=colMap.get(cnNormalName);
//获取当前单元格中的内容
String content=sheet.getCell(col, i).getContents().toString().trim();
//给对象赋值
setFieldValueByName(enNormalName, content, entity);
}
resultList.add(entity);
}
} catch(Exception e){
e.printStackTrace();
//如果是ExcelException,则直接抛出
if(e instanceof ExcelException){
throw (ExcelException)e;
//否则将其它异常包装成ExcelException再抛出
}else{
e.printStackTrace();
throw new ExcelException("导入Excel失败");
}
}
return resultList;
}
/**
* @MethodName : setFieldValueByName
* @Description : 根据字段名给对象的字段赋值
* @param fieldName 字段名
* @param fieldValue 字段值
* @param o 对象
*/
private static void setFieldValueByName(String fieldName,Object fieldValue,Object o) throws Exception{
Field field=getFieldByName(fieldName, o.getClass());
if(field!=null){
field.setAccessible(true);
//获取字段类型
Class> fieldType = field.getType();
//根据字段类型给字段赋值
if (String.class == fieldType) {
field.set(o, String.valueOf(fieldValue));
} else if ((Integer.TYPE == fieldType)
|| (Integer.class == fieldType)) {
field.set(o, Integer.parseInt(fieldValue.toString()));
} else if ((Long.TYPE == fieldType)
|| (Long.class == fieldType)) {
field.set(o, Long.valueOf(fieldValue.toString()));
} else if ((Float.TYPE == fieldType)
|| (Float.class == fieldType)) {
field.set(o, Float.valueOf(fieldValue.toString()));
} else if ((Short.TYPE == fieldType)
|| (Short.class == fieldType)) {
field.set(o, Short.valueOf(fieldValue.toString()));
} else if ((Double.TYPE == fieldType)
|| (Double.class == fieldType)) {
field.set(o, Double.valueOf(fieldValue.toString()));
} else if (Character.TYPE == fieldType) {
if ((fieldValue!= null) && (fieldValue.toString().length() > 0)) {
field.set(o, Character
.valueOf(fieldValue.toString().charAt(0)));
}
}else if(Date.class==fieldType){
field.set(o, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(fieldValue.toString()));
}else{
field.set(o, fieldValue);
}
}else{
throw new ExcelException(o.getClass().getSimpleName() + "类不存在字段名 "+fieldName);
}
}
/**
* @MethodName : getFieldByName
* @Description : 根据字段名获取字段
* @param fieldName 字段名
* @param clazz 包含该字段的类
* @return 字段
*/
private static Field getFieldByName(String fieldName, Class> clazz){
//拿到本类的所有字段
Field[] selfFields=clazz.getDeclaredFields();
//如果本类中存在该字段,则返回
for(Field field : selfFields){
if(field.getName().equals(fieldName)){
return field;
}
}
//否则,查看父类中是否存在此字段,如果有则返回
Class> superClazz=clazz.getSuperclass();
if(superClazz!=null && superClazz !=Object.class){
return getFieldByName(fieldName, superClazz);
}
//如果本类和父类都没有,则返回空
return null;
}
/**
* @author xian
* @date 2018/7/30 16:35
* @param list 实体类列表
* List<实体类>转为List
static public List
ExcelException自定义excel异常类
public class ExcelException extends Exception {
public ExcelException() {
// TODO Auto-generated constructor stub
}
public ExcelException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public ExcelException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
public ExcelException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
}
在testng定义的数据源中导入excel表中的数据
// 定义数据源
@DataProvider(name = "list")
public Iterator<Object[]> createData() throws FileNotFoundException, ExcelException {
LinkedHashMap<String,String> fieldMap = new LinkedHashMap<String,String>();
fieldMap.put("手机","loanerPhone");
fieldMap.put("密码","loanerPassword");
LoanerLoginVo loanerLoginVo = new LoanerLoginVo();
//从excel中获取数据
return ExcelUtil.excelIn(fieldMap, "loanerLogin", "登录信息", loanerLoginVo.getClass());
}
有问题请留言。