使用EasyExcel导出excel模板

一 、什么是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 "成功";
    }
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值