乐趣区

关于spring-boot-编程思想:使用easyexcel-导入excel表格

应用 easyexcel 导入 excel 表格

1. 增加依赖 pom.xml

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

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<StaffExcelRequest> {private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);
    /**
     * 存储验证通过的数据
     */
    @Getter
    private List<StaffExcelRequest> list = new ArrayList<>();
    /**
     * 假如这个是一个 DAO,当然有业务逻辑这个也能够是一个 service。当然如果不必存储这个对象没用。*/
    private StaffService staffService;

    /**
     * 返回谬误
     */
    @Setter
    @Getter
    private List<Map<String,String>> maps = new ArrayList<Map<String,String>>();


    private Map<String,String> 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<Staff> 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<Map<String, String>> maps = listener.getMaps();
    String temp = "";
    if (maps.size() > 0) {for (Map<String, String> map : maps) {temp += map.get("msg")+"\n";
        }
    }

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


    return BaseResultData.SUCCESS(hashMap);
}
退出移动版