先附上阿里EasyExcel的GitHub地址:https://github.com/alibaba/easyexcel

什么是EasyExcel

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便(以上都是复制)

环境准备

  • 引入easyExcel和Lombok源,我这里用的是maven:
   	 <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       
   	 <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>easyexcel</artifactId>
           <version>2.1.6</version>
       </dependency>

       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <optional>true</optional>
       </dependency>

  • Springboot(非必须)

开始写代码

创建实体类User:

package com.excel.excel.entity;

import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;

@Data
public class User {
    @ExcelProperty("用户昵称")
    private String userName;
    @ExcelProperty("密码")
    private String password;
    @ExcelProperty("登录名称")
    private String loginName;
    @ExcelProperty("电话号码")
    private String telephone;
    @ExcelProperty("创建日期")
    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    private Date createDate;

}

@ExcelProperty表示的是表头信息。

接下来是Controller类:

package com.excel.excel.test;

import com.alibaba.excel.EasyExcel;
import com.excel.excel.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController
public class TestController {

    @RequestMapping("/test1")
    public void test(HttpServletResponse response) throws IOException {
        List<User> userList = setEntityValue();
        response.setContentType("application/vnd.ms-excel");
        // 对响应客户请求进行重新编码
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("测试导出", "utf-8");
        // 为导出文件设置默认名称,这里是测试导出
        response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
        EasyExcel.write(response.getOutputStream(), User.class).sheet("测试页").doWrite(userList);
    }

    private List<User> setEntityValue(){
        List<User> userList = new ArrayList<>();
        for(int i = 0; i < 10; i++){
            User user = new User();
            user.setCreateDate(new Date());
            user.setLoginName("测试" + i + "号");
            user.setPassword("123456");
            user.setTelephone("1231561213");
            user.setUserName("用户" + i + "号");
            userList.add(user);
        }
        return userList;
    }
}

如果你想将结果直接输出到本地某个文件,可以这样:

	@RequestMapping("/test2")
    public void test2() throws IOException {
        List<User> userList = setEntityValue();
        EasyExcel.write("D:/test.xlsx", User.class).sheet("测试页").doWrite(userList);
    }

测试

分别在浏览器的url上输入http://localhost:8080/test1和http://localhost:8080/test2.

test1结果为:
在这里插入图片描述
在这里插入图片描述
test2的结果为:
在这里插入图片描述
在这里插入图片描述

结尾

那么EasyExcel的导出就到此为止,如果想了解更多功能,可以到GitHub中去看,我这里就不一一描述啦。喜欢的小伙伴们可以点个赞哦。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐