在大部分情况下我们需要对导入数据的内容、格式进行合法性验证,验证不通过需要我们提示错误信息。


导入xls数据内容

姓名年龄科目分数
王老五12语文80
柯景腾13语文78
沈佳宜14语文88
王小贱15语文60
黄小仙12语文54
李大仁14语文76
程又青13语文58
陈寻12语文67
方茴12语文87
沈晓棠13语文89
林嘉茉14语文68
赵烨14语文50
苏凯12语文78
乔燃13语文90

我们需要导入的记录是分数大于等于60小于等于80。

Excel导入测试Demo

package example;


import java.io.File;

import java.io.FileInputStream;

import java.util.List;

import java.util.Map;


import model.Student;

import test.AbstractExcelTest;


import com.easyReport.read.checker.GEValuePropertyChecker;

import com.easyReport.read.checker.LEValuePropertyChecker;

import com.easyReport.read.checker.PropertyChecker;

import com.easyReport.read.temp.PropertyTemp;

import com.easyReport.read.temp.ReadTemp;


public class TestExcelProCheck extends AbstractExcelTest<Student> {

@Override

public void test() {

FileInputStream fileInputStream;

try {

fileInputStream = new FileInputStream(new File("testFile/test6.xls"));

testReadBean(fileInputStream);

//testReadMap(fileInputStream);

fileInputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}


@Override

protected ReadTemp bulidReadTemp() {

//模板批次设置构造方法,一次读取10行

ReadTemp readTemp = new ReadTemp(1,10);

readTemp.addPropertyTemp(new PropertyTemp("姓名", "name"));

readTemp.addPropertyTemp(new PropertyTemp("年龄", "age"));

readTemp.addPropertyTemp(new PropertyTemp("科目", "course.name"));

//大于等于60小于等于80

readTemp.addPropertyTemp(new PropertyTemp("分数", "course.score",new PropertyChecker[]{

new GEValuePropertyChecker(60),new LEValuePropertyChecker(80)

}));

return readTemp;

}


@Override

protected void writeBeanList(List<Student> modelLists) {

System.out.println("--------------bean---------------");

for (Student s : modelLists) {

System.out.println(s.getName() + "|"

+ s.getAge()+s.getCourse().getName()+"|"+s.getCourse().getScore());

}

}


@Override

protected void writeMapList(List<Map<String, Object>> mapLists) {

System.out.println("--------------map---------------");

for (Map<String, Object> m : mapLists) {

System.out.println(m.get("name") + "|" + m.get("age")+"|" + m.get("course.name")+"|" + m.get("course.score"));

}

}


}

BasicTest 添加错误提示

public void testReadBean(FileInputStream fis) throws Exception {

ConvertReader reader = buildReader();

//判断是否批次读取,若批次读取,写每批次数据

if(reader.getContext().getTemp().getBatch() == 0){

writeBeanList((List<T>) reader.readToBeanList(fis, getModelClass()));

}else{

//判断是否批次读取完成

while(!reader.isEnd()){

writeBeanList((List<T>) reader.readToBeanList(fis, getModelClass()));

}

}

writeErrorMsg(reader);

}


public void testReadMap(FileInputStream fis) throws Exception {

ConvertReader reader = buildReader();

writeMapList(reader.readToMapList(fis));

if(reader.getContext().getTemp().getBatch() == 0){

writeMapList(reader.readToMapList(fis));

}else{

while(!reader.isEnd()){

writeMapList(reader.readToMapList(fis));

}

}

writeErrorMsg(reader);

}

protected void writeErrorMsg(ConvertReader reader) {

if (reader.getContext().hasError()) {

System.out.print(reader.getContext().getErrorMsg());

}

}

运行结果:

--------------bean---------------

王老五|12语文|80.0

柯景腾|13语文|78.0

王小贱|15语文|60.0

李大仁|14语文|76.0

陈寻|12语文|67.0

--------------bean---------------

林嘉茉|14语文|68.0

苏凯|12语文|78.0

第4行,分数值必须小于等于80.0;第6行,分数值必须大于等于60.0;第8行,分数值必须大于等于60.0;第10行,分数值必须小于等于80.0;第11行,分数值必须小于等于80.0;第13行,分数值必须大于等于60.0;第15行,分数值必须小于等于80.0;

txt导入也是一样参加TestTxtProCheck运行结果。


分数大于等于60小于等于80,是我们系统定义属性验证器,我们可以自定义验证器。

package checker;


import java.util.Map;


import org.apache.commons.lang3.math.NumberUtils;


import com.easyReport.read.RowErrorContext;

import com.easyReport.read.checker.PropertyChecker;

import com.easyReport.read.temp.PropertyTemp;


public class GELEValueChecker extends PropertyChecker{

public GELEValueChecker() {

super();

}


public GELEValueChecker(Map<String, Object> checkMap) {

super(checkMap);

}


public GELEValueChecker(Object checkObj) {

super(checkObj);

}


public GELEValueChecker(Object[] checkObjs) {

super(checkObjs);

}


@Override

public boolean check(RowErrorContext rowErrorContext,

PropertyTemp propertyTemp, Object value) {

                Double geValue = ((Number) checkObjs[0]).doubleValue();

Double leValue = ((Number) checkObjs[1]).doubleValue();

if(!NumberUtils.isNumber(value.toString())){

putErrorMsg(rowErrorContext, propertyTemp.getTitle(), "值必须为数值类型");

return false;

}

Double dvalue = NumberUtils.toDouble(value.toString());

if(dvalue < geValue || dvalue > leValue){

putErrorMsg(rowErrorContext, propertyTemp.getTitle(), "值必须为大于等于60小于等于80");

return false;

}

return true;

}

}

readTemp.addPropertyTemp(new PropertyTemp("分数", "course.score",new PropertyChecker[]{

new GEValuePropertyChecker(60),new LEValuePropertyChecker(80)

}));

替换为

readTemp.addPropertyTemp(new PropertyTemp("分数", "course.score",new PropertyChecker[]{

new GELEValueChecker(new Object[]{60,80})

}));

运行结果:

--------------bean---------------

王老五|12语文|80.0

柯景腾|13语文|78.0

王小贱|15语文|60.0

李大仁|14语文|76.0

陈寻|12语文|67.0

--------------bean---------------

林嘉茉|14语文|68.0

苏凯|12语文|78.0

第4行,分数值必须为大于等于60小于等于80;第6行,分数值必须为大于等于60小于等于80;第8行,分数值必须为大于等于60小于等于80;第10行,分数值必须为大于等于60小于等于80;第11行,分数值必须为大于等于60小于等于80;第13行,分数值必须为大于等于60小于等于80;第15行,分数值必须为大于等于60小于等于80;


我们默认是有错误不中断,继续导入数据。我们可以设置ReadTemp readTemp = new ReadTemp(1,10)为ReadTemp readTemp = new ReadTemp(1,10,true);出错即中断导入操作。

运行结果:

--------------bean---------------

王老五|12语文|80.0

柯景腾|13语文|78.0

第4行,分数值必须为大于等于60小于等于80;


默认错误提示是一整行显示所有错误提示,当然我们可以自定义错误模板。

package errTemp;


import com.easyReport.read.ReaderContext;

import com.easyReport.read.RowErrorContext;

import com.easyReport.read.temp.IErrorMsgTemp;


public class ErrMsgTemp implements IErrorMsgTemp{


@Override

public String getErrorMsg(ReaderContext readerContext) {

StringBuffer sb = new StringBuffer();

for(RowErrorContext rowErrorContext : readerContext.getRowErrorList()){

Integer rowNum = rowErrorContext.getRowNum();

if (rowNum != null) {

sb.append("第" + (rowNum + 1) + "行");

}

for (String msg : rowErrorContext.getErrorMsgList()) {

sb.append(",".concat(msg));

}

sb.append(";\n");

}

return sb.toString();

}


}

在src目录下新建属性配置文件easyreport.properties

errorMsgTemp=errTemp.ErrMsgTemp

运行结果:

--------------bean---------------

王老五|12语文|80.0

柯景腾|13语文|78.0

王小贱|15语文|60.0

李大仁|14语文|76.0

陈寻|12语文|67.0

--------------bean---------------

林嘉茉|14语文|68.0

苏凯|12语文|78.0

第4行,分数值必须为大于等于60小于等于80;

第6行,分数值必须为大于等于60小于等于80;

第8行,分数值必须为大于等于60小于等于80;

第10行,分数值必须为大于等于60小于等于80;

第11行,分数值必须为大于等于60小于等于80;

第13行,分数值必须为大于等于60小于等于80;

第15行,分数值必须为大于等于60小于等于80;