easyExcel导出

目录

一.简介

1 官方网站

2 EasyExcel特点

3.相比于poi

 4.EasyExcel依赖

二.实际应用

1.编写ExcelUtils工具类

2.编写需要导出的dto类

@ExcelProperty注解

业务层代码

三.总结

开发中总结


一.简介

1 官方网站

GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具

快速开始:EasyExcel(文档已经迁移) · 语雀

2 EasyExcel特点


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

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

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

3.相比于poi

工具上手难易程度
POI比较难(需要对源码有所研究 需要写workbook),使用完必须手动关闭流
easyExcel简单只需要提供数据和模板,不需要关闭流

 4.EasyExcel依赖

<!-- easyexcel -->
<dependency>
   <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>2.1.7</version>
</dependency>
  

二.实际应用

在我们世家开发中要应用的导出Excel文件,有可能跟跟大家的不同

1.编写ExcelUtils工具类

核心代码

/**
     * 导出Excel到web
     *
     * @param response  响应
     * @param excelName Excel名称
     * @param sheetName sheet页名称
     * @param clazz     Excel要转换的类型
     * @param data      要导出的数据
     * @throws Exception
     */
    public static void export2Web(HttpServletResponse response, String excelName, String sheetName, Class clazz, List data) throws Exception {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码
        excelName = URLEncoder.encode(excelName, "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
        EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(data);
    }

2.编写需要导出的dto类

由于项目中的代码比较多,我用一个简单的实体类代替这里看一下

package com.springboot.utils.excel.test;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 导出实体类
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class UserDto   extends BaseRowModel {

    /**
     * value: 表头名称
     * index: 列的号, 0表示第一列
     */
    @ExcelProperty(value = "姓名", index = 0)
    private String name;

    @ExcelProperty(value = "年龄",index = 1)
    private int age;

    @ExcelProperty(value = "学校",index = 2)
    private String school;
}

注:

@ExcelProperty注解

使用字段作为表头显然不是我们想要的,EasyExcel提供了ExcelProperty注解,可以定义表头的名称。这个注解还提供了index、order两个属性,可以定义列的位置和顺序。

业务层代码

ArrayList<ExcelUtil.MultipleSheelPropety> list1 = new ArrayList<>();
 for(int i = 1; i < 4; j++){
      ArrayList<TableHeaderExcelProperty> list = new ArrayList<>();
      for(int i = 0; i < 4; i++){
          UserDate userDto= new userDto();
          userDto.setName("bj" + i);
          userDto.setAge(18 + i);
          userDto.setSchool("北京大学" + i);
          list.add(userDto);
      }

      Sheet sheet = new Sheet(j, 0);
      sheet.setSheetName("sheet" + j);

      ExcelUtil.MultipleSheelPropety multipleSheelPropety = new ExcelUtil.MultipleSheelPropety();
      multipleSheelPropety.setData(list);
      multipleSheelPropety.setSheet(sheet);

      list1.add(multipleSheelPropety);

  }

  ExcelUtil.writeWithMultipleSheel("/home/chenmingjian/Downloads/aaa.xlsx",list1);

三.总结

开发中总结

1.用我们的EasyExcel做导出需要特别注意乱码的情况,我们应该作防止乱码代码验证

2.注意表头设置, 防止我们的index下标重复,这样会报错的

例:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值