概述
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<TbClueExcelVo> { /** * 利用构造方法获取对应的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解析数据导入数据库的全部内容,希望文章能够帮你解决EasyExcel解析数据导入数据库所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复