excel文档上传批量读取入库

结合上节下载模板实现数据批量导入功能(上节内容 https://blog.csdn.net/fcfs_sstf/article/details/136297469)
结合swagger注解 @ApiModelProperty 识别excel表头
excel模板内容

构建实体类

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class UserImport {
    @ApiModelProperty(value="用户名")
    private String username;

    @ApiModelProperty(value="姓名")
    private String realName;

    @ApiModelProperty(value="电话")
    private String phone;

    @ApiModelProperty(value="状态(1:启用 0:禁用)")
    private String status;
}

业务代码

 public Result importUserList(MultipartFile multipartFile) {
        List<UserImport> userImports = ExcelUtils.readExcel(multipartFile, UserImport.class);
        List<SysUser> list = new ArrayList<>();
        if (CollUtil.isNotEmpty(userImports)) {
            //业务代码....
        }
        return ResultUtil.success();
    }

主要实现方法

注意编码格式按实际情况配置

public static <T> List<T> readExcel(MultipartFile multipartFile, Class<T> clazz) {
        List<T> list = new LinkedList<>();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(multipartFile.getInputStream(), "GBK"));
            String line;
            int index = 1;
            String[] titles = null;
            while ((line = reader.readLine()) != null) {
                if (index == 1) {
                    titles = line.split(",");
                    index++;
                    continue;
                }
                String[] objs = line.split(",");
                List<Field> fields = Arrays.stream(clazz.getDeclaredFields()).collect(Collectors.toList());
                T object = clazz.newInstance();
                Map<String, List<Field>> map = fields.stream().collect(Collectors.groupingBy(item -> item.getAnnotation(ApiModelProperty.class) != null ? item.getAnnotation(ApiModelProperty.class).value().toLowerCase() : item.getAnnotation(ApiModelProperty.class).value().toLowerCase()));
                //添加值到对应字段
                if (titles != null && titles.length > 0) {
                    for (int i = 0; i < titles.length; i++) {
                        //判断当前字段名是否为空字符串
                        if (StringUtils.isBlank(titles[i])) {
                            continue;
                        }
                        Field field = map.get(titles[i].replace("\ufeff","").toLowerCase()) != null ? map.get(titles[i].replace("\ufeff","").toLowerCase()).get(0) : null;
                        if (field != null) {
                            //打开私有链接
                            field.setAccessible(true);
                            field.set(object, getValueByFieldType(objs[i], field.getType()));
                        }
                    }
                }
                list.add(object);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }

public static Object getValueByFieldType(Object value, Class<?> fieldType) {
        //判断值是不是为空
        if (value == null || StringUtils.isBlank(value.toString())) {
            return null;
        }
        //判断该字段类型并赋值
        String typeStr = fieldType.getSimpleName();
        String v = String.valueOf(value).trim();
        if ("String".equalsIgnoreCase(typeStr)) {
            return v;
        } else if ("double".equalsIgnoreCase(typeStr)) {
            return Double.valueOf(v);
        } else if ("integer".equalsIgnoreCase(typeStr) || "int".equalsIgnoreCase(typeStr)) {
            if (value.toString().indexOf(".") != -1) {
                v = v.split("\\.")[0];
            }
            return Integer.valueOf(v);
        } else if ("float".equalsIgnoreCase(typeStr)) {
            return Float.valueOf(v);
        } else if ("long".equalsIgnoreCase(typeStr)) {
            return Long.valueOf(v);
        } else if ("BigDecimal".equalsIgnoreCase(typeStr)) {
            return new BigDecimal(v);
        } else if ("Short".equalsIgnoreCase(typeStr)) {
            return Short.valueOf(v);
        }
//        else if ("Date".equalsIgnoreCase(typeStr)) {
//            return DateUtils.stringToDate(value.toString(), DateUtils.getDateFormat(value.toString()));
//        }
        else if ("Byte".equalsIgnoreCase(typeStr)) {
            return Byte.parseByte(v);
        } else if ("Boolean".equalsIgnoreCase(typeStr)) {
            return Boolean.parseBoolean(v);
        }
        return null;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值