EasyExcel使用

一、EasyExcel特点

  1. Java 领域解析、生成 Excel 比较有名的框架有 Apache poi、jxl 等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会 OOM 或者 JVM 频繁的 FULL GC。

  2. EasyExcel 是阿里巴巴开源的一个 excel 处理框架,以使用简单、节省内存著称。 EasyExcel 能大大减少占用内存的主要原因是在解析 Excel 时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

  3. EasyExcel 采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

简单地理解:可以方便、快速的读取、写入 execl 内容。

【官方文档地址:】
https://alibaba-easyexcel.github.io/index.html
https://www.yuque.com/easyexcel

二、Excel的应用场景及优势

  1. 数据导入:减轻录入工作量

  2. 数据导出:统计信息归档

  3. 数据传输:异构系统之间数据传输

EasyExcel优势:

注解式自定义操作。
输入输出简单,提供输入输出过程的接口
支持一定程度的单元格合并等灵活化操作

三、常用注解

  • @ExcelProperty:指定当前字段对应 excel 中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。千万别三个混着用,除非你非常了解源代码中三个混着用怎么去排序的。

  • @ExcelIgnore:默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

  • @DateTimeFormat:日期转换,用 String 去接收 excel 日期格式的数据会调用这个注解。里面的 value 参照 java.text.SimpleDateFormat

  • @NumberFormat:数字转换,用 String 去接收 excel 数字格式的数据会调用这个注解。里面的 value 参照 java.text.DecimalFormat

  • @ExcelIgnoreUnannotated:默认不加 ExcelProperty 的注解的都会参与读写,加了不会参与

四、使用EasyExcel

1. 导入依赖

  <!-- easyexcel 主要依赖  这一个基本上就够了-->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>easyexcel</artifactId>
   <version>2.1.4</version>
</dependency>

2.创建实体类

@ExcelProperty注解也可以用index进行索引设置表头顺序

@HeadRowHeight(30) // 标题高度
@ContentRowHeight(30) // 内容高度
@ColumnWidth(16) // 行高
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserVo {

    @ExcelProperty("编号")
    @ColumnWidth(40)
    private String id;

    @ExcelProperty("名称")
    private String name;

    @ExcelProperty("性别")
    private String sex;

    @ExcelProperty("地址")
    @ColumnWidth(25)
    private String address;

    @ExcelProperty("电话")
    @ColumnWidth(25)
    private String phone;

}

3.导出为Excel

创建Controller,访问接口下载导出Excel

@Controller
public class TestController {

    @GetMapping("/excel")
    public void excel(HttpServletResponse response) {

        List<UserVo> list = new ArrayList<>();
        for (int i = 1; i <= 11; i++) {
            UserVo userVo = new UserVo(UUID.randomUUID().toString(),
                    (i % 2 == 0 ? "吕" : "蓝") + "某某",
                    i % 2 == 0 ? "女" : "男",
                    "广东省广州市第" + i + "区",
                    "4404-" + String.valueOf(i * 31 * 31));
            list.add(userVo);
        }

        try {
            // 响应的内容类型为excel
            response.setContentType("application/vnd.ms-excel");
            // 指定服务器响应给浏览器的编码
            response.setCharacterEncoding("utf-8");
            // 通知浏览器以附件的形式下载处理,设置返回头要注意文件名有中文,这里URLEncoder.encode可以防止中文乱码
            String fileName = URLEncoder.encode("用户列表" + System.currentTimeMillis(), "utf-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
            // 获取通向浏览器的字节流
            ServletOutputStream outputStream = response.getOutputStream();
            // 导出列表内容到输出流中
            EasyExcel.write(outputStream, UserVo.class)
                    .sheet("sheet")
                    .doWrite(list);

        } catch (IOException e) {
            System.err.println("导出Excel失败:" + e);
        }

    }
}

导出结果
image

原文地址:https://www.cnblogs.com/Dm920/p/15383447.html