首页 > 代码库 > java easyreport 导入excel、 txt 数据数据格式校验(六)

java easyreport 导入excel、 txt 数据数据格式校验(六)

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


导入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 = http://www.mamicode.com/((Number) checkObjs[0]).doubleValue();

Double leValue = http://www.mamicode.com/((Number) checkObjs[1]).doubleValue();

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

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

return false;

}

Double dvalue = http://www.mamicode.com/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;


本文出自 “菜鸟博博” 博客,请务必保留此出处http://zhangxiao2.blog.51cto.com/6342789/1590161

java easyreport 导入excel、 txt 数据数据格式校验(六)