easyExcel导入并解析到数据库功能

1: 导入maven依赖

 		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

2:定义接受excel数据Dto

package cn.evun.bjtms.bd.dto;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotBlank;

import java.util.Objects;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadRowHeight(value = 40)
public class DemoExcel {


    /**
     * 姓名
     */
    @ExcelProperty(value = "姓名(必填)", index = 0)
    @ColumnWidth(value = 20)
    private String name;

    /**
     * 年龄
     */
    @ExcelProperty(value = "年龄(必填)", index = 1)
    @ColumnWidth(value = 20)
    private String age;
       /**
         * 重写equals和hashCode 用于使用
         * excelList.stream().distinct().collect(Collectors.toList()); 进行数据去    
         */
    @Override
    public boolean equals(Object o) {
      //使用idea快捷键自行实现 
    }

    @Override
    public int hashCode() {
      //使用idea快捷键自行实现 
    }
}

3:Controller层

    /**
     * 学生数据导入
     */
    @RequestMapping(value = "/importExcelCourier")
    public void importExcelCourier(HttpServletRequest request, HttpServletResponse response, @RequestBody MultipartFile file) {
        return service.importExcelCourier(file);
    }

4: 监听器,用于校验excel模板和数据

package cn.evun.bjtms.bd.lintener;

import cn.evun.bjtms.bd.dto.BdBasicPriceCourierExcel;
import cn.evun.sweet.framework.common.util.StringUtils;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.lotus.platform.common.model.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.Map;

@Slf4j
public class EasyExcelListener extends AnalysisEventListener<DemoExcel > {

   //校验模板
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
         /*
        count 记录模板表头有几个,用以判断用户导入的表格是否和模板完全一致
        如果用户导入表格较模板的表头多,但其余符合模板,这样不影响则不需要
         */
        int count = 0;
        // 获取数据实体的字段列表
        Field[] fields = BdBasicPriceCourierExcel.class.getDeclaredFields();
        // 遍历字段进行判断
        for (Field field : fields) {
            // 获取当前字段上的ExcelProperty注解信息
            ExcelProperty fieldAnnotation = field.getAnnotation(ExcelProperty.class);
            // 判断当前字段上是否存在ExcelProperty注解
            if (fieldAnnotation != null) {
                ++count;
                // 存在ExcelProperty注解则根据注解的index索引到表头中获取对应的表头名
                String headName = headMap.get(fieldAnnotation.index());
                // 判断表头是否为空或是否和当前字段设置的表头名不相同
                if (StringUtils.isEmpty(headName) || !headName.equals(fieldAnnotation.value()[0])) {
                    // 如果为空或不相同,则抛出异常不再往下执行
                    throw new BusinessException("模板错误,请检查导入模板");
                }
            }
        }

    }

   //校验数据
    @Override
    public void invoke(DemoExcel excel, AnalysisContext context) {
        Integer rowIndex = context.readRowHolder().getRowIndex();
        String str = "第" +rowIndex+ "行";
        if (StringUtils.isEmpty(excel.getName())) {
            throw new BusinessException(str + "姓名不能为空");
        }
        if (StringUtils.isEmpty(excel.getAge())) {
            throw new BusinessException(str +"年龄不能为空");
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
    }
}

5: service 层

 //excel读取数据
        List<DemoExcel> excelList;
        try {
            excelList = EasyExcel.read(new BufferedInputStream(file.getInputStream()), DemoExcel.class,
                    new EasyExcelListener ()).sheet().doReadSync();
        } catch (Exception e) {
            return ResultUtils.failResultMessage(e.getCause().getMessage());
        }
        //stream流去重
        List<DemoExcel> distinctList = excelList.stream().distinct().collect(Collectors.toList());
 //拿到数据后就可以 入库操作啦 -----我自己的入库就不给你们写了

6:官方网址

EasyExcel GitHub地址点击跳转

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值