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解析数据导入数据库内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复