三EasyExcel实现数据填充

Posted 上善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三EasyExcel实现数据填充相关的知识,希望对你有一定的参考价值。

一、填充

1.1、填充一组数据

准备模板
excel表格中用来表示包裹要填充的变量,如果单元格文本中本来就有左右大括号,需要在括号前面使用斜杠转义\\\\
代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和excel中被包裹的变量名称一致。

项目结构

封装数据

package com.xbmu.pojo;

import lombok.Data;

/**
 * 使用实体类封装填充数据
 *
 *  实体中成员变量名称需要和Excel表各种包裹的变量名匹配
 */
@Data
public class FillData 
    private String name;
    private int age;

填充
准备数据并填充到文件
Test1.java

    @Test
    public void test3()
        // 加载模板
        String templateFile = "fill_data_template1.xlsx";
        // 写入文件
        String targetFileName = "Excel填充—单组数据.xlsx";
        // 准备对象数据填充
        FillData fillData = new FillData();
        fillData.setName("张三");
        fillData.setAge(10);
        // 生成工作簿对象
        ExcelWriterBuilder workBookWriter = EasyExcel.write(targetFileName,FillData.class)
                .withTemplate(templateFile);
        // 获取工作表并填充
        workBookWriter.sheet().doFill(fillData);
    

运行结果

同时,也可以组转map数据去填充

    @Test
    public void test3()
        // 加载模板
        String templateFile = "fill_data_template1.xlsx";
        // 写入文件
        String targetFileName = "Excel填充—单组数据.xlsx";
        
        // 准备Map数据填充
        HashMap<String, String> mapFillData = new HashMap<>();
        mapFillData.put("name", "李四");
        mapFillData.put("age", "11");

        // 获取第一个工作表填充并自动关闭流
        // 生成工作簿对象
        ExcelWriterBuilder workBookWriter = EasyExcel.write(targetFileName)
                .withTemplate(templateFile);
        // 获取工作表并填充
        workBookWriter.sheet().doFill(mapFillData);
    

1.2、填充多组数据

准备模板
excel表格中用.来表示包裹要填充的变量,如果单元格文本中本来就有左右大括号,需要在括号前面使用斜杠转移\\\\
代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和excel中被包裹的变量名称一致。

准备数据并填充

    @Test
    public void test4()
        // 加载模板
        String templateFile = "fill_data_template2.xlsx";
        // 写入文件
        String targetFileName = "Excel填充—多组数据.xlsx";

        // 生成工作簿对象
        ExcelWriterBuilder workBookWriter = EasyExcel.write(targetFileName)
                .withTemplate(templateFile);
        // 创建工作表对象
        ExcelWriterSheetBuilder sheet = workBookWriter.sheet();
        // 准备数据
        List<Student> students = initData();
        // 填充数据,doXxx会在读写结束后自动关闭流
        sheet.doFill(students);
    
    /**
     * 生成多组数据代码
     * @return
     */
    private static List<FillData> initFillData() 
        ArrayList<FillData> fillDatas = new ArrayList<FillData>();
        for (int i = 0; i < 10; i++) 
            FillData fillData = new FillData();
            fillData.setName("李四0" + i);
            fillData.setAge(10 + i);
            fillDatas.add(fillData);
        
        return fillDatas;
    

运行结果

1.3、组合填充

准备模板
既有多组数据填充,又有单一数据填充,为了避免两者数据出现冲突覆盖的情况,在多组填充时需要通过FillConfig对象设置换行。

封装数据并填充

    @Test
    public void test5()
        // 加载模板
        String templateFile = "fill_data_template3.xlsx";
        // 写入文件
        String targetFileName = "Excel填充—组合数据.xlsx";

        // 创建一个工作簿对象
        ExcelWriter workBook = EasyExcel.write(targetFileName).withTemplate(templateFile).build();
        // 创建工作表对象
        WriteSheet sheet = EasyExcel.writerSheet().build();

        // 准备数据
        List<FillData> fillDatas = initFillData();

        Map<String,Object> dateAndTotal = new HashMap<>();
        dateAndTotal.put("date","2021-11-24");
        dateAndTotal.put("total","1223");

        // 多组数据填充
        workBook.fill(fillDatas,sheet);

        // 单组数据填充
        workBook.fill(dateAndTotal,sheet);

        // 关闭流 !!!
        workBook.finish();


    

运行结果

第三行有问题

运行结果:


1.4、水平填充

水平填充和多组填充模板一样,不一样的地方在于填充时需要通过FillConfig对象设置水平填充。

准备数据并填充

    @Test
    public void test6()
        // 加载模板
        String templateFile = "fill_data_template4.xlsx";
        // 写入文件
        String targetFileName = "Excel填充—水平填充.xlsx";

        // 创建一个工作簿对象
        ExcelWriter workBook = EasyExcel.write(targetFileName).withTemplate(templateFile).build();
        // 创建工作表对象
        WriteSheet sheet = EasyExcel.writerSheet().build();

        // 换行
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();

        // 准备数据
        List<FillData> fillDatas = initFillData();
        // 多组数据填充
        workBook.fill(fillDatas,fillConfig,sheet);
        // 关闭流 !!!
        workBook.finish();

    

运行结果

1.5、综合案例

注意: 为了节省内存,没有采用把整个文档在内存中组织好之后再整体写入到文件的做法,而是采用的是一行一行写入的方式,不能实现删除和移动行,也不支持备注写入。多组数据写入的时候,如果需要新增行,最好在最后一行增加,尽量不要在中间位置添加。

项目结构:

准备数据并填充

package com.xbmu.test;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.xbmu.pojo.FillData;
import com.xbmu.pojo.Student;

import java.io.InputStream;
import java.util.*;

public class Test01 
    public static void main(String[] args) 
        InputStream templateInputStream = Test01.class.getClassLoader().getResourceAsStream(
                "template/report_template.xlsx");

        // 目标文件
        String targetFile = "综合练习-report.xlsx";

        // 写入workbook对象

        ExcelWriter workBook = EasyExcel.write(targetFile).withTemplate(templateInputStream).build();

        WriteSheet sheet = EasyExcel.writerSheet().build();

        // 填充配置,开启组合填充换行
        //FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();

        // ****** 准备数据 *******
        // 日期
        HashMap<String, String> dateMap = new HashMap<>();
        dateMap.put("date", "2020-03-16");

        // 总会员数
        HashMap<String, String> totalCountMap = new HashMap<>();
        dateMap.put("totalCount", "1000");

        // 新增员数
        HashMap<String, String> increaseCountMap = new HashMap<>();
        dateMap.put("increaseCount", "100");

        // 本周新增会员数
        HashMap<String, String> increaseCountWeekMap = new HashMap<>();
        dateMap.put("increaseCountWeek", "50");

        // 本月新增会员数
        HashMap<String, String> increaseCountMonthMap = new HashMap<>();
        dateMap.put("increaseCountMonth", "100");


        // 新增会员数据
        List<Student> students = initData();
        // **** 准备数据结束****

        // 写入统计数据
        workBook.fill(dateMap, sheet);
        workBook.fill(totalCountMap, sheet);
        workBook.fill(increaseCountMap, sheet);
        workBook.fill(increaseCountWeekMap, sheet);
        workBook.fill(increaseCountMonthMap, sheet);
        // 写入新增会员
        workBook.fill(students, sheet);
        workBook.finish();
    

    private static List<Student> initData() 
        ArrayList<Student> students = new ArrayList<>();
        for (int i = 0; i < 10; i++) 
            Student data = new Student();
            data.setName("王五0" + i);
            data.setBirthday(new Date());
            data.setGender("男");
            students.add(data);
        
        return students;
    

运行结果:

以上是关于三EasyExcel实现数据填充的主要内容,如果未能解决你的问题,请参考以下文章

EasyExcel

ATP应用测试平台——使用EasyExcel实现excel导入导出多sheet填充模板下载等功能案例实战

easyExcel 填充模板生成新的excel

使用EasyExcel将MySQL中查询出来的数据下载到Excel文件中

使用EasyExcel将MySQL中查询出来的数据下载到Excel文件中

easyexcel模板填充样式失效