在大部分情况下我们需要对导入数据的内容、格式进行合法性验证,验证不通过需要我们提示错误信息。
导入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
java easyreport 导入excel、 txt 数据数据格式校验(六)
原文地址:http://zhangxiao2.blog.51cto.com/6342789/1590161