由于觉得公司对于导入数据处理的五花八门有特别啰嗦,所以写着这么一个工具方法供大家用,专门处理导入的excel数据
/**
* 标准化导入,我不敢保证我写的就是导入的标准,只是希望这件事能标准起来
* @param list excal中读取出的数据
* @param keylist 数据校验索引,目前支持的规则:含"*"的列为必填项,含"?"的列为必填项且不可重复,含"%"的列只能为整数,含"[]"的列只填写[]中的内容(注:选项用","隔开,","必须为<b style="color: red;">英文</b>且选项两边<b style="color: red;">没有</b>空格)
* @param importDataHandler 扩展类,其中包含两个方法:一个是需要对数据进行特殊验证的方法, 另一个操作整理后的数据
*/
public String standardImport(List<Map<String, Object>> list, Map<String, String> keylist, ImportDataHandler importDataHandler) throws Exception {
Map<String, Object> rejson = new HashMap<String, Object>();
rejson.put("code", "1");
rejson.put("msg", "sucess");
//记录整理后的数据
List<Map<String, Object>> insertlist = new ArrayList<Map<String,Object>>();
//记录数据重复的结果
Map<String, Map<String, List<String>>> repeatdata = new HashMap<String, Map<String, List<String>>>();
List<String> errlog = new ArrayList<String>();
for(int i=0;i<list.size();i++) {
int excelRow = i+2;
Map<String, Object> importitem = new HashMap<String, Object>();
//整理excel中的数据并对数据进行标准验证
for(String key : keylist.keySet()) {
String keyname = keylist.get(key);
String val = list.get(i).get(keyname).toString();
importitem.put(key, val==null?"":val);
//是否不可为空
boolean isnotnull = keyname.indexOf("*") > -1;
//是否不可重复
boolean isnotrepeat = keyname.indexOf("?") > -1;
//值是否为空
boolean isnoval = "".equals(val);
//非空验证
if((isnotnull || isnotrepeat) && isnoval) {
String err = "第"+excelRow+"行错误:\""+keylist.get(key)+"\"不能为空!";
errlog.add(err);
}
//对于值的判断只在有内容时才做判断
if(!isnoval) {
//数据重复情况的记录
if(isnotrepeat && !isnoval) {
Map<String, List<String>> map = new HashMap<String, List<String>>();
if(repeatdata.containsKey(key)) {
map = repeatdata.get(key);
} else {
repeatdata.put(key, map);
}
if(repeatdata.get(key).containsKey(val)) {
List<String> repeatval = map.get(val);
repeatval.set(0, repeatval.get(0)+", 第"+excelRow+"行");
repeatval.set(1, (Integer.parseInt(repeatval.get(1)) + 1) + "");
repeatval.set(2, "false");
} else {
List<String> repeatval = new ArrayList<String>();
repeatval.add("第"+excelRow+"行");
repeatval.add("1");
repeatval.add("true");
map.put(val, repeatval);
}
}
//整数验证
if(keyname.indexOf("%") > -1) {
try {
Integer.parseInt(val);
} catch (Exception e) {
String err = "第"+excelRow+"行错误:\"" + keylist.get(key)+"\"列只能填写整数!";
errlog.add(err);
}
}
//选项验证
if(keyname.indexOf("[") > -1 && keyname.indexOf("]") > -1) {
String options = keyname.substring(keyname.indexOf("[")+1,keyname.indexOf("]"));
String[] optionlist = options.split(",");
boolean ishas = false;
for(String option : optionlist) {
if(option.equals(val)) {
ishas = true;
break;
}
}
if(!ishas) {
String err = "第"+excelRow+"行错误:\"" + keylist.get(key)+"\"列所填写的值(" + val + ")不在选项[" + options +"]中!";
errlog.add(err);
}
}
}
}
//特殊验证
importDataHandler.checkData(importitem, errlog, excelRow);
insertlist.add(importitem);
}
//分析数据重复记录
for(String colkey : repeatdata.keySet()) {
for(String valkey : repeatdata.get(colkey).keySet()) {
if("false".equals(repeatdata.get(colkey).get(valkey).get(2))) {
String err = "值("+valkey+")在\""+keylist.get(colkey)+"\"列共重复出现了"+repeatdata.get(colkey).get(valkey).get(1)+"次,分别在:"+repeatdata.get(colkey).get(valkey).get(0)+"!";
errlog.add(err);
}
}
}
if(errlog.size() > 0) {
//如果错误日志中有内容则返回错误信息
rejson.put("code", "2");
rejson.put("msg", "err");
rejson.put("data", errlog);
} else {
//否则的化插入数据
importDataHandler.insertData(insertlist);
}
return JSONValue.toJSONString(rejson);
}
public interface ImportDataHandler {
/**
* 需要特殊验证部分字段
* @param importitem 导入的一行数据
* @param errlog 错误日志,验证失败记录在这里
* @param excelRow 当前验证的行数
*/
void checkData(Map<String, Object> importitem, List<String> errlog, int excelRow) throws Exception;
/**
* 插入导入的数据
* @param insertlist 整理后的数据
*/
void insertData(List<Map<String, Object>> insertlist) throws Exception;
}
使用示例:
//导入学生
@Override
public String tx_importStudentPerson(final User user, final Map<String, Object> data,
List<Map<String, Object>> list) throws Exception {
//建立数据校验索引
final Map<String, String> keylist = new HashMap<String, String>();
keylist.put("personname", "*姓名");
keylist.put("majorname", "*专业");
keylist.put("sexname", "*性别[男,女]");
keylist.put("idcard", "?身份证号");
keylist.put("academicdegree", "学位");
keylist.put("email", "邮箱*");
keylist.put("gradeyear", "%届别(例如:2018)");
keylist.put("highestdegree", "学历[无,大专,本科,研究生]");
keylist.put("hospital", "所属医院");
keylist.put("jobnum", "?工号");
keylist.put("nation", "民族");
keylist.put("phoneno", "?手机号码");
keylist.put("school", "所属学校");
keylist.put("sourceatudenttype", "*学员类型[单位人,研究生,社会人]");
keylist.put("studentyears", "*学年");
keylist.put("tutor", "导师");
keylist.put("roundversion", "*大纲版本");
return toolstservice.standardImport(list, keylist, new ImportDataHandler() {
@Override
public void checkData(Map<String, Object> importitem, List<String> errlog, int excelRow) throws Exception {
//身份证号验证
if(basicDataService.checkIdcard(importitem)) {
String err = "第"+excelRow+"行错误:\""+keylist.get("idcard")+"\"列所填写的"+importitem.get("idcard")+"与系统已有人员重复!";
errlog.add(err);
}
//专业名称验证
List<Map<String, Object>> majorlist = basicDataService.getmajorbymajorname(importitem);
if(majorlist.size() == 1) {
importitem.put("majorid", majorlist.get(0).get("majorsubjectid"));
} else {
String err = "第"+excelRow+"行错误:\""+keylist.get("majorname")+"\"列所填写的"+importitem.get("majorname")+"与系统数据不匹配!";
errlog.add(err);
}
}
@Override
public void insertData(List<Map<String, Object>> insertlist) throws Exception {
for(Map<String, Object> item : insertlist) {
String personid = toolstservice.getNumserialnumber("1");
item.put("personid", personid);
//学员人员类型为1
item.put("persontype", 1);
item.put("sex", "男".equals(item.get("sexname")) ? "1" : "0");
//添加人员表
personDao.addPerson(data);
//添加学生表
personDao.addPersonStudent(data);
}
}
});
}