您的位置:首页 > 编程语言 > Java开发

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

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

导入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;

本文出自 “菜鸟博博” 博客,请务必保留此出处http://zhangxiao2.blog.51cto.com/6342789/1590161
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: