EasyExcel解析数据导入数据库

1.入口controller

@PostMapping("/importData")
public AjaxResult importData(MultipartFile file) throws Exception {
    /*自定义EasyExcel监听器,用于解析数据并执行操作  tbClueService业务的数据库操作接口*/
    ExcelListener excelListener = new ExcelListener(tbClueService);
    /*excel解析*/
    EasyExcel.read(file.getInputStream(), TbClueExcelVo.class, excelListener).sheet().doRead();

    return AjaxResult.success(excelListener.getResult());
}

2.自定义监听器

/**
 * EasyExcel监听器,用于解析数据并执行操作
 */
@Component
public class ExcelListener extends AnalysisEventListener {

    /**
     * 利用构造方法获取对应的service
     */
    @Autowired
    public ITbClueService clueService;


    /*成功和失败次数*/
    @Autowired
    private ImportResultDTO resultDTO;

    /**
     * 提供带参构造方法,在这里需要通过构造方法的方式获取对应的service层
     * 谁调用这个监听器谁提供需要的service
     *
     * @param clueService
     */
    public ExcelListener(ITbClueService clueService) {
        this.clueService = clueService;
        this.resultDTO = new ImportResultDTO();
    }

    /**
     * 每解析一行数据都要执行一次
     * 每条都执行一次插入操作
     *
     * @param data
     * @param context
     */
    @Override
    public void invoke(TbClueExcelVo data, AnalysisContext context) {

        ImportResultDTO addTbClue = clueService.importCluesData(data);
        /*空指针异常*/
        ImportResultDTO importResultDTO = resultDTO.addAll(addTbClue);

    }

    /**
     * 当所有数据都解析完成后会执行
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }

    /**
     * 返回结果集对象
     *
     * @return
     */
    public ImportResultDTO getResult() {
        return resultDTO;
    }

}

3.业务层代码//具体业务入库流程

@Override
public ImportResultDTO importCluesData(TbClueExcelVo data) {
    //===============校验线索数据,封装属性,插入数据库,根据规则进行分配======================
    /**
     * 1 判断活动编号对应的活动是否存在
     * 1.1 如果活动编号不存在 即错误数据,不进行添加操作,返回错误 ImportResultDTO.error()
     * 1.2 如果活动编号存在 设置活动id
     */
    TbClue tbClue = new TbClue();
    String activityCode = data.getActivityCode();
    TbActivity tbActivity = activityService.selectTbActivityByCode(activityCode);
    if (tbActivity == null) {
        return ImportResultDTO.error();
    }
    Long activityId = tbActivity.getId();
    tbClue.setActivityId(activityId);

    //TODO 补全上述逻辑代码
    /**
     * 校验手机号和渠道是否为空
     * 如果为空证明是错误数据,不进行添加 返回error
     * return ImportResultDTO.error();
     */
    String phone = data.getPhone();
    String channelName = data.getChannel();
    if (phone == null && channelName == null) {
        return ImportResultDTO.error();
    }
    String channel = tbActivity.getChannel();
    tbClue.setChannel(channel);
    tbClue.setPhone(phone);
    //TODO 补全上述逻辑代码
    /**
     * 字典值的替换
     * 因为excel里传入的是中文名,需要替换成对应的字典值
     * 需要处理 学科 性别 意向级别
     */

    String sex = data.getSex();
    if (sex != null) {
        sex = sex.equals("男") ? "1" : "0";
        tbClue.setSex(sex);
    }

    String level = data.getLevel();
    if (level != null) {
        String dictType2 = "clues_level";
        level = sysDictDataMapper.selectDictValue(dictType2, level);
        tbClue.setLevel(level);
    }
    String subject = data.getSubject();
    if (subject != null) {
        String dictType = "course_subject";
        subject = sysDictDataMapper.selectDictValue(dictType, subject);
        tbClue.setSubject(subject);
    }


    //TODO 补全上述逻辑代码
    /**
     * 设置数据状态为待跟进
     * clue.setStatus(TbClue.StatusType.UNFOLLOWED.getValue());
     */
    tbClue.setStatus(TbClue.StatusType.UNFOLLOWED.getValue());
    //TODO 补全上述逻辑代码

    /**
     * 将线索数据入库
     * 参考添加线索接口调用的mapper
     * 仅仅只插入到线索表中
     */
    /*excel需转换的表字段  活动Id   渠道来源  性别  意向学科   意向等级 */
    /*公共字段*/
    tbClue.setCreateBy(SecurityUtils.getUsername());
    tbClue.setCreateTime(DateUtils.getNowDate());
    /*不需要转换的字段*/
    String name = data.getName();
    if (name == null) {
        return ImportResultDTO.error();
    }
    tbClue.setName(name);
    Long age = data.getAge();
    if (age != null) {
        tbClue.setAge(age.intValue());
    }
    String qq = data.getQq();
    if (qq != null) {
        tbClue.setQq(qq);
    }
    String weixin = data.getWeixin();
    if (weixin != null) {
        tbClue.setWeixin(weixin);
    }

    tbClueService.insertTbClue(tbClue);

    //TODO 补全上述逻辑代码
    /**
     * 根据规则动态分配线索给具体的销售人员
     * 利用策略模式来进行实现
     * rule.loadRule(clue);
     */
    Boolean aBoolean = rule.loadRule(tbClue);
    //TODO 补全上述逻辑代码

    /**
     *分配完成 返回成功
     * 这个方法免费提供
     */
    return ImportResultDTO.success();

}

4.实体类和工具类

工具类

/**
 * 线索导入结果集对象
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class ImportResultDTO {

    //成功数量
    private Integer successNum=0;

    //失败数量
    private Integer failureNum=0;

    /**
     * 提供静态方法,发生插入失败的时候记录
     * @return
     */
    public static ImportResultDTO error(){
        return new ImportResultDTO(0,1);
    }

    /**
     * 提供静态方法,发生成功的时候记录数据
     * @return
     */
    public static ImportResultDTO success(){
        return new ImportResultDTO(1,0);
    }

    /**
     * 该方法主要是将每次插入的结果与总的结果进行汇总时进行调用
     * @param data
     * @return
     */
    public ImportResultDTO addAll(ImportResultDTO data){
        this.failureNum += data.getFailureNum();
        this.successNum += data.getSuccessNum();
        return this;
    }
}

//实体类

public class TbClueExcelVo{


    /** 客户手机号 手机号(11位手机号,不可有空格) */
    @ExcelProperty(value = "手机号(11位手机号,不可有空格)",index = 0)
    private String phone;

    /** 渠道 */
    @ExcelProperty(value = "渠道来源",index = 1)
    private String channel;
    
    /** 活动编号 (来源于活动列表8位字母或数字)*/
    @ExcelProperty(value = "活动编号(来源于活动列表8位字母或数字)",index = 2)
    private String activityCode;


    /** "客户姓名 **/
    @ExcelProperty(value = "客户姓名",index = 3)
    private String name;
    
    /** 意向学科 */
    @ExcelProperty(value = "意向学科",index = 4)
    private String subject;

    /** 意向级别 */
    @ExcelProperty(value = "意向级别",index = 5)
    private String level;
    
    /** 性别 */
    @ExcelProperty(value = "性别",index = 6)
    private String sex;

    /** 年龄 */
    @ExcelProperty(value = "年龄",index = 7)
    private Long age;
    
    /** 微信 */
    @ExcelProperty(value = "微信",index = 8)
    private String weixin;

    /** qq */
    @ExcelProperty(value = "QQ",index = 9)
    private String qq;
}

5.表单结构

 

你可能感兴趣的:(easyexcel,java,前端,开发语言)