EasyExcel与EasyPoi的基本使用案例

EasyExcel

EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目

在尽可能节约内存的情况下支持读写百M的Excel

第一步 引入依赖

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

第二步 创建vo类

在对应属性上添加注解

设置表头内容

DictEeVo类用于将实体类Dict中的数据映射到Excel表中

@Data
public class DictEeVo {
​
   @ExcelProperty(value = "id" ,index = 0)
   private Long id;
​
   @ExcelProperty(value = "上级id" ,index = 1)
   private Long parentId;
​
   @ExcelProperty(value = "名称" ,index = 2)
   private String name;
​
   @ExcelProperty(value = "值" ,index = 3)
   private String value;
​
   @ExcelProperty(value = "编码" ,index = 4)
   private String dictCode;
​
}

第三步 实现操作具体代码

写操作

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 -- DictEeVo
    List<DictEeVo> dictVoList = new ArrayList<>();
    for(Dict dict:dictList) {
        DictEeVo dictEeVo = new DictEeVo();
        // dictEeVo.setId(dict.getId());
        BeanUtils.copyProperties(dict,dictEeVo);
        dictVoList.add(dictEeVo);
    }
    //调用方法进行写操作
    try {
        EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("dict")
                .doWrite(dictVoList);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

读操作

创建Listener

public class DictListener extends AnalysisEventListener<DictEeVo> {
​
    private DictMapper dictMapper;
​
    public DictListener(DictMapper dictMapper) {
        this.dictMapper = dictMapper;
    }
​
    //一行一行进行读取
    @Override
    public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
        Dict dict = new Dict();
        //将dictEeVo中的属性值按照属性名赋值到dict的属性中
        BeanUtils.copyProperties(dictEeVo,dict);
        //调用方法添加数据库
        dictMapper.insert(dict);
    }
​
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
​
    }
}

使用EasyExcel类的静态方法read进行读取

public void importDictData(MultipartFile file) {
    //file是传入的excel表文件
    try {
        EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(baseMapper))
                .sheet().doRead();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

EasyPoi

easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法

Easypoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样工作

第一步 引入依赖

<dependency>
      <groupId>cn.afterturn</groupId>
      <artifactId>easypoi-spring-boot-starter</artifactId>
      <version>4.1.3</version>
</dependency>

第二步 在实体类对应的属性上添加注解

@Data
public class Employee {
    
    private Integer id;
​
    @Excel(name = "员工姓名")
    private String name;
​
    @Excel(name = "性别")
    private String gender;
​
    @Excel(name = "出生日期",width = 20,format = "yyyy-MM-dd")
    private LocalDate birthday;
}

第三步 实现操作具体代码

写操作

public void exportEmployee(HttpServletResponse response){
    //查询数据库
    List<Employee> list = employeeService.getEmployee(null);
    //设置导出参数
    ExportParams params = new ExportParams("员工表","员工表", ExcelType.HSSF);
    //生成Excel
    Workbook workbook = ExcelExportUtil.exportExcel(params,Employee.class,list);
​
    ServletOutputStream out = null;
    try {
        //用流的形式传输
        response.setHeader("content-type","application/octet-stream");
        //暴露content-disposition
        response.setHeader("Access-Control-Expose-Headers", "content-disposition");
        //防止中文乱码
        response.setHeader("content-disposition","attachment;filename="+
                URLEncoder.encode("员工表.xls","UTF-8"));
        out = response.getOutputStream();
        //使用ServletOutputStream输出流将Excel文件传输至客户端
        workbook.write(out);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if(null!=out){
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

读文件

public RespBean importEmployee(MultipartFile file){
    //设置导入参数
    ImportParams params = new ImportParams();
    //去掉第一行标题行
    params.setTitleRows(1);
    try {
        List<Employee> list = ExcelImportUtil.importExcel(file.getInputStream(), Employee.class, params);
        //将数据储存至数据库,并向客户端返回结果
        if(employeeService.saveBatch(list)){
            return RespBean.success("导入成功");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return RespBean.error("导入失败");
}
上一篇:windows下基于wvp-GB28181-pro+ZLMediaKit实现的GB28181-2016流媒体服务


下一篇:摄像头监控gb28181平台编译搭建wvp-GB28181-pro