SpringBoot:自定义注解+反射实现excel导入的数据组装及字段校验

时间:2025-03-12 09:02:37
  • public static Result assembleExcelData(Class entryClass, Map<Integer, String[]> excelData,
  • Map<String,Object> domainCodes){
  • //保存返回的结果
  • Result result = new Result();
  • //组装后的数据LIST
  • List<Object> returnList = new ArrayList<>();
  • //保存校验失败信息
  • StringBuilder errorMsg = new StringBuilder();
  • //循环excel数据
  • ((i,cells)->{
  • Object vo = null;
  • try {
  • //按照传入的Class,生成对应实例
  • vo= ();
  • } catch (Exception e) {
  • ();
  • }
  • //获取并循环Bean中的所有字段,进行校验和组装
  • for (Field field : ()) {
  • //如果包含有ImportValidation注解的话,才进行处理。
  • if ((ImportValidation.class)) {
  • ImportValidation annotation = (ImportValidation.class);
  • //cell下表
  • int index = x();
  • //字典Code
  • String domainCode = ();
  • //是否必填
  • boolean nullAble = ();
  • //字段名称
  • String name = ();
  • //获取单元格内容,并前后去空格处理
  • String cellData = cells[index].trim();
  • /*如果字段为空,且字段设置不能为空,则进行错误提醒*/
  • try {
  • //若必填,则进行判断校验并提醒
  • if ((cellData) && !nullAble) {
  • ("第").append(i).append("行: ").append(name).append("字段不能为空!\r\n");
  • }
  • /*如果字典编码为空,则可以直接赋值*/
  • else if ((domainCode) || (cellData)) {
  • //给对应字段赋值
  • setFiled(field, vo, cellData);
  • } else {
  • //进行字典转换
  • List<Map> domains = (List<Map>) domainCodes.get(domainCode);
  • boolean match = false;
  • for (Map map : domains) {
  • if (map.get("TEXT").equals(cellData)) {
  • //给对应字段赋值
  • setFiled(field, vo, String.valueOf(map.get("VALUE")));
  • match = true;
  • break;
  • }
  • }
  • /*如果没有匹配,则转换失败*/
  • if (!match) {
  • ("第").append(i).append("行: ").append(name).append("字段字典值不存在!!\r\n");
  • }
  • }
  • } catch (Exception e) {
  • ("第").append(i).append("行: ").append(name).append("字段填写格式不正确!!\r\n");
  • }
  • }
  • }
  • //组装LIST
  • returnList.add(vo);
  • });
  • //如果有错误信息的话,返回错误信息,返回错误标记
  • if (errorMsg.length()>0){
  • result = ();
  • (());
  • }
  • //放入组装后的LIST。校验失败的字段值为空
  • (returnList);
  • return result;
  • }
  • //反射给Filed赋值
  • public static void setFiled(Field filed,Object vo,String data) throws IllegalAccessException {
  • try {
  • //当单元格值不为空的时候才需要进行赋值操作
  • if ((data)){
  • //获取Bean 属性字段的类型
  • Type fileType = ();
  • (true);
  • //如果是String
  • if ((String.class)){
  • filed.set(vo,data);
  • }
  • //如果是int
  • else if((int.class)||(Integer.class)){
  • filed.set(vo,(data));
  • }
  • //如果是Double
  • else if((Double.class)||(double.class)){
  • filed.set(vo,(data));
  • }
  • //如果是Long
  • else if((Long.class)||(long.class)){
  • filed.set(vo,(data));
  • }
  • //如果是BigDecimal
  • else if((BigDecimal.class)){
  • filed.set(vo,new BigDecimal(data));
  • }
  • //如果是日期
  • else if((Date.class)){
  • filed.set(vo, 8601DateTime(data));
  • }
  • }
  • } catch (Exception e) {
  • throw e;
  • }
  • }
  • 复制代码