使用easyexcel 导入excel表格

使用easyexcel 导入excel表格

1. 添加依赖pom.xml


    com.alibaba
    easyexcel
    2.2.7

2. 创建接收的实体类

import lombok.Data;

@Data
public class StaffExcelRequest {

    /**
     * * 员工姓名
     */
    private String name;
    /**
     * * 工号
     */
    private String jobNumber;
    /**
     * * 职位名称
     */
    private String jobTitle;
    /**
     * * 手机号
     */
    private String mobile;
}

3. 创建监听事件

public class ExcelListener extends AnalysisEventListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);
    /**
     * 存储验证通过的数据
     */
    @Getter
    private List list = new ArrayList<>();
    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private StaffService staffService;

    /**
     * 返回错误
     */
    @Setter
    @Getter
    private List> maps = new ArrayList>();


    private Map map = new HashMap<>();

    /**
     * 头部占用的行数
     */
    @Setter
    public Integer headerInteger = 1;


    public ExcelListener() {
        // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
    }

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param staffService
     */
    public ExcelListener(StaffService staffService) {
        this.staffService = staffService;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(StaffExcelRequest data, AnalysisContext context) {
        // 开始计数,当前是多少行
        headerInteger++;
        if (data.getName() == null || data.getName().equals("")) {
            map.put("code","400");
            map.put("msg","第["+headerInteger+"]行,员工姓名不能为空");
            maps.add(map);
            return;
        }

        if (data.getJobNumber() == null || data.getJobNumber().equals("")) {
            map.put("code","400");
            map.put("msg","第["+headerInteger+"]行,员工工号不能为空");
            maps.add(map);
            return;
        }

        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
        list.add(data);
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        LOGGER.info("所有数据解析完成!");
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        LOGGER.info("{}条数据,开始存储数据库!", list.size());
        List staffCollection = new ArrayList<>();
        for (StaffExcelRequest request : list) {
            // 创建实体类,用于保存数据
            Staff entity = new Staff();
            staff.setName(request.getName());
            staffCollection.add(entity);
        }
        boolean b = staffService.saveBatch(staffCollection);
        LOGGER.info("存储数据库成功!"+b);
    }
}

4. 创建controller

@PostMapping("/import")
// @RequiresPermissions("staff:import")
public BaseResultData importExcel(@RequestParam("file") MultipartFile file) throws IOException {
    // 处理上传文件
    if (file.isEmpty()) {
        return BaseResultData.ERROR(1,"上传失败,请选择文件");
    }

    // 流导入
    InputStream inputStream = file.getInputStream();

    // 监听器
    ExcelListener listener = new ExcelListener(staffService);

    // 读取excel
    EasyExcel.read(inputStream, StaffExcelRequest.class,listener).sheet().doRead();

    // 查看是否有异常
    List> maps = listener.getMaps();
    String temp = "";
    if (maps.size() > 0) {
        for (Map map : maps) {
            temp += map.get("msg")+"\n";
        }
    }

    // 返回信息
    HashMap hashMap = new HashMap<>();
    hashMap.put("success",listener.getList().size()+"");
    hashMap.put("error",temp);


    return BaseResultData.SUCCESS(hashMap);
}

你可能感兴趣的:(使用easyexcel 导入excel表格)