欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot集成EasyExcel导入导出excel表格

程序员文章站 2022-03-15 16:34:26
...

1.demo

1.引入依赖

 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
        </dependency>

2.导出数据

1.创建实体类

这个实体类不仅导出在用,导入也需要使用

@Data
public class UserData {
    /**
     * value写的时候用,表示列名
     * index读的时候用,表示读哪一列
     */
    @ExcelProperty(value = "用户编号", index = 0)
    private int id;
    @ExcelProperty(value = "用户名称", index = 1)
    private String userName;
}
2.测试导出
public static void main(String[] args) {
        //构建list集合
        List<UserData> list = new ArrayList<>();
        for (int i = 0; i <= 10; i++) {
            UserData userData = new UserData();
            userData.setId(i);
            userData.setUserName("lucy" + i);
            list.add(userData);
        }

        //设置excel文件路径和名称
        String fileName = "E:\\01.xlsx";

        //调用方法实现写操作
        EasyExcel.write(fileName, UserData.class).sheet("用户信息")
                .doWrite(list);
    }

3.导入数据

1.创建监听类

对导入的数据如何处理,主要在监听器中实现

/**
 * 读取exceal时,需要实现该监听器,一行一行读取
 */
public class ExcelListener extends AnalysisEventListener<UserData> {

    /**
     * 一行一行读取excel内容,从第二行开始,第一行表头略过
     *
     * @param userData
     * @param analysisContext
     */
    @Override
    public void invoke(UserData userData, AnalysisContext analysisContext) {
        System.out.println(userData);
    }

    /**
     * 读取之后执行的方法
     *
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }

    /**
     * 该方法可实现或者不实现
     * 用来读取表头
     *
     * @param headMap
     * @param context
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头信息:" + headMap);
    }
}
2.测试导入
public class TestRead {
    public static void main(String[] args) {
        //读取文件路径
        String fileName = "E:\\01.xlsx";

        //调用方法实现读取操作
        EasyExcel.read(fileName, UserData.class, new ExcelListener()).sheet().doRead();
    }
}

2.实战

1.导出

1.controller层
  /**
     * 导出数据字典接口
     *
     * @param response
     * @return
     */
    @GetMapping("exportData")
    public void exportDict(HttpServletResponse response) {
        dictService.exportDictData(response);
    }
2.service层

导出excel使用的实体类和从数据库查询的实体类不一致,需要进行转换

/**
     * 导出数据字典
     * @param response
     */
    void exportDictData(HttpServletResponse response);  


@Override
    public void exportDictData(HttpServletResponse response) {
        //设置下载信息
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String fileName = "dict";
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

        //查询数据
        List<Dict> dictList = baseMapper.selectList(null);

        //数据转换dict -> dictVo
        List<DictEeVo> dictEeVoList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(dictList)) {
            dictEeVoList = dictList.stream().map(dict -> {
                DictEeVo dictEeVo = new DictEeVo();
                BeanUtils.copyProperties(dict, dictEeVo);
                return dictEeVo;
            }).collect(Collectors.toList());
        }

        //调用方法进行写操作
        try {
            EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("dict").doWrite(dictEeVoList);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.导入

1.controller层
 /**
     * 导入数据字典接口
     *
     * @return
     */
    @PostMapping("importData")
    public Result importDict(MultipartFile file) {
        dictService.importDictData(file);
        return Result.ok();
    }
2.service层
/**
     * 导入数据字典
     * @param file
     */
    void importDictData(MultipartFile file);


  @Override
    public void importDictData(MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(baseMapper)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
3.监听器

这里没有将监听器交给Spring容器进行管理,而是采用构造方法注入mapper

public class DictListener extends AnalysisEventListener<DictEeVo> {

    //采用构造器方式注入mapper
    private DictMapper dictMapper;
    public DictListener(DictMapper dictMapper) {
        this.dictMapper = dictMapper;
    }

    @Override
    public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
        //调用方法添加数据库
        Dict dict = new Dict();
        BeanUtils.copyProperties(dictEeVo,dict);
        dictMapper.insert(dict);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

参考:
https://www.bilibili.com/video/BV1V5411K7rT?p=60