使用EasyExcel导出excel模板实现教程

 更新时间:2026年03月13日 10:53:16   作者:我是菜鸟呐  
EasyExcel是Java解析、生成Excel的高效框架,通过重写POI对07版Excel的解析,解决了内存溢出的问题,使用步骤包括导入依赖、准备Excel模板、写入数据,并提供了基础写入、集合写入和多个sheet同时写入的效果

一 、什么是EasyExcel

java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。

easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

二、使用步骤

1.导入依赖

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

2.excel模板

我在这里准备了一个excel表格里面有俩个sheet,分别会用几种方法写入

3.写入excel模板数据

先来一个基础的sheet1的写入数据,excel模板要放入指定位置或修改读取路径

 //简单写入
  @Test
    void test01() {
        //获取模板位置
        InputStream templateFileName = getClass().getResourceAsStream("/static/simple.xlsx");
        String fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
        // 这里 会填充到第一个sheet, 然后文件流会自动关闭
        Map<String, Object> map = MapUtils.newHashMap();
        map.put("code", "8888");
        map.put("leader", "测试用户");
        map.put("endTime", "2023-10-10 09:51:32");
        map.put("reportNo", "123456789");
        EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
    }

  //集合写入
    @Test
    void test02() {
        List<data> asList = Arrays.asList(
                new data(1, "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"),
                new data(2, "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"),
                new data(3, "3", "3", "3", "3", "3", "3", "3", "3", "3", "3"),
                new data(4, "3", "3", "3", "3", "3", "3", "3", "3", "3", "3")
        );
        InputStream templateFileName = getClass().getResourceAsStream("/static/simple.xlsx");
        String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";
        // 方案1
        try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
            WriteSheet writeSheet = EasyExcel.writerSheet(1).build();
            // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
            // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
            // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
            // 如果数据量大 list不是最后一行 参照下一个
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(asList, fillConfig, writeSheet);
            //excelWriter.fill(asList, fillConfig, writeSheet);
            Map<String, Object> map = MapUtils.newHashMap();
            map.put("reportNo", "8888");
            excelWriter.fill(map, writeSheet);
        }
    }

  //多个sheet写入
    @Test
    void test03() {
        List<data> asList = Arrays.asList(
                new data(1, "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"),
                new data(2, "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"),
                new data(3, "3", "3", "3", "3", "3", "3", "3", "3", "3", "3"),
                new data(4, "4", "4", "4", "4", "4", "4", "4", "4", "4", "4")
        );
        InputStream templateFileName = getClass().getResourceAsStream("/static/simple.xlsx");
        String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";
        try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
            // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
            for (int i = 0; i < 1; i++) {
                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。
                // 实际上可以一直变
                WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "sheet1").build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                Map<String, Object> maps = MapUtils.newHashMap();
                maps.put("code", "8888");
                maps.put("leader", "测试用户");
                maps.put("endTime", "2023-10-10 09:51:32");
                maps.put("reportNo", "123456789");
                excelWriter.fill(maps, writeSheet1);
                WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "sheet2").build();
                FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
                excelWriter.fill(asList, fillConfig, writeSheet2);
                Map<String, Object> map = MapUtils.newHashMap();
                map.put("reportNo", "8888");
                excelWriter.fill(map, writeSheet2);
            }
        }

    }

4.效果

简单写入的效果

集合写入的效果

同时写入多个sheet的效果 跟上面俩个一样都会有数据

   @GetMapping("/excel")
    public Object excel(HttpServletResponse response) throws UnsupportedEncodingException {
        List<data> asList = Arrays.asList(
                new data(1, "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"),
                new data(2, "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"),
                new data(3, "3", "3", "3", "3", "3", "3", "3", "3", "3", "3"),
                new data(4, "4", "4", "4", "4", "4", "4", "4", "4", "4", "4")
        );
        //设置下载信息
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("数据写出", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");

        InputStream templateFileName = getClass().getResourceAsStream("/static/simple.xlsx");
       // String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";

        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(templateFileName).build()) {
            // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
            for (int i = 0; i < 1; i++) {
                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。
                // 实际上可以一直变
                WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "sheet1").build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据

                Map<String, Object> maps = MapUtils.newHashMap();
                maps.put("code", "8888");
                maps.put("leader", "测试用户123");
                maps.put("endTime", "2023-10-10 09:51:32");
                maps.put("reportNo", "123456789");
                excelWriter.fill(maps, writeSheet1);

                WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "sheet2").build();

                FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
                excelWriter.fill(asList, fillConfig, writeSheet2);
                Map<String, Object> map = MapUtils.newHashMap();
                map.put("reportNo", "8888");
                excelWriter.fill(map, writeSheet2);
 				excelWriter.finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "成功";
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Fastjson 常用API介绍及下载地址(推荐)

    Fastjson 常用API介绍及下载地址(推荐)

    Fastjson是一个Java语言编写的高性能功能完善的JSON库。接下来通过本文给大家分享Fastjson 常用API介绍及下载地址,感兴趣的朋友一起看看吧
    2017-11-11
  • java常见log日志的使用方法解析

    java常见log日志的使用方法解析

    本文主要介绍了java常见log日志的使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Spring加载XSD文件发生错误的解决方法

    Spring加载XSD文件发生错误的解决方法

    这篇文章主要介绍了Spring加载XSD文件发生错误的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 举例讲解Java设计模式编程中模板方法模式的运用实例

    举例讲解Java设计模式编程中模板方法模式的运用实例

    这篇文章主要介绍了Java设计模式编程中模板方法模式的运用实例,模板方法模式强调基于继承的代码复用,需要的朋友可以参考下
    2016-05-05
  • java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list错误解决办法

    java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list

    这篇文章主要介绍了java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list错误解决办法的相关资料,需要的朋友可以参考下
    2016-12-12
  • Java多线程之原子类解析

    Java多线程之原子类解析

    这篇文章主要介绍了Java多线程之原子类解析,Java原子类是一种多线程编程中常用的工具,用于实现线程安全的操作,它们提供了一种原子性操作的机制,确保多个线程同时访问共享变量时的数据一致性,需要的朋友可以参考下
    2023-10-10
  • 简介Java程序的Shell脚本包装

    简介Java程序的Shell脚本包装

    这篇文章主要介绍了简介Java程序的Shell脚本包装,将Java运用于脚本程序当中,有时或许是个不错的主意~需要的朋友可以参考下
    2015-07-07
  • java利用JEXL实现动态表达式编译

    java利用JEXL实现动态表达式编译

    这篇文章主要介绍了java利用JEXL实现动态表达式编译,系统要获取多个数据源的数据,并进行处理,最后输出多个字段。字段的计算规则一般是简单的取值最多加一点条件判断,下面是具体的实现方法
    2021-04-04
  • SpringBoot如何实现一个Redis限流注解

    SpringBoot如何实现一个Redis限流注解

    这篇文章主要介绍了利用SpringBoot实现一个Redis限流注解方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 一文教你Java如何快速构建项目骨架

    一文教你Java如何快速构建项目骨架

    在 Java 项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java 领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下吧
    2025-05-05

最新评论