Java利用EasyExcel实现模板读取和复杂表格填充

 更新时间:2025年12月10日 08:52:58   作者:codingPower  
这篇文章主要为大家详细介绍了Java利用EasyExcel实现模板读取和复杂表格填充的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

EasyExcel

​Excel表格中用{}或者{.} 来表示包裹要填充的变量,如果单元格文本中本来就有{、}左右大括号,需要在括号前面使用斜杠转义\{ 、\}。

​代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和Excel中被{}包裹的变量名称一致。

ExcelWriter的fill()方法 用于填充数据

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

样例

测试代码

TeacherInfo 对象

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder //通过自动生成的构建器模式创建对象
public class TeacherInfo {
	@ExcelProperty("年龄")
 	private int age;//年龄
 	@ExcelProperty("姓名")
    private String name;//姓名
    @ExcelProperty("科目")
    private String subject;//科目
}

StudentInfo对象

package com.fasterres.demo.blog;

import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentInfo {
    private String id;//编号
    private String studentname;//姓名
    private String sex;//性别

    @DateTimeFormat("yyyy/MM/dd")
    private Date birthday;//生日
}
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.fasterres.demo.blog.StudentInfo;
import com.fasterres.demo.blog.TeacherInfo;
import org.springframework.core.io.ClassPathResource;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

public class ExcelWriteTest {
    public static void main(String[] args) throws Exception {

        // 1.写入文件方式
        String filePath = "D:\\log\\stduent_01.xlsx";
        InputStream templateFile = new FileInputStream(filePath);
        String targetFile = "D:\\学生信息统计2.xlsx";
        ExcelWriter excelWriter =EasyExcel.write(targetFile).withTemplate(templateFile).build();

        // 2.加载模板,配置在项目工程下的 写入io
       /* ClassPathResource resource=new ClassPathResource("template/stduent_01.xlsx");

        InputStream templateInputStream = resource.getInputStream();*/
        //1.写入io流
        //ByteArrayOutputStream outputStream=new ByteArrayOutputStream(1024);
		// 写入excelWriter对象
        //ExcelWriter excelWriter= EasyExcel.write(outputStream).withTemplate(templateInputStream ).build();

		//2.最简单的写入是读取数据写入单行正常表头
		//List<TeacherInfo> teacherInfos=new ArrayList<>();
		//EasyExcel.write(outputStream,TeacherInfo.class).sheet("老师信息统计").doWrite(teacherInfos);
        
        WriteSheet sheet = EasyExcel.writerSheet().build();


        // 当前日期
        HashMap<String, String> dateMap = new HashMap<String, String>();
        dateMap.put("date", "2025-02-06");
        //填充单个字段信息
        excelWriter.fill(dateMap,sheet);

        //填充单个对象信息
/*
        TeacherInfo teacher=TeacherInfo.builder()
                .age(33)
                .name("张竹")
                .build();
        excelWriter.fill(teacher,sheet);
*/

        //换行填充
        FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
        //多次填充list,可以用new FillWrapper()申明别名
        //填充第一个list
        List<TeacherInfo> teacherInfoList=new ArrayList();
        TeacherInfo teacher2=TeacherInfo.builder()
                .age(22)
                .name("张竹")
                .subject("数学")
                .build();
        TeacherInfo teacher3=TeacherInfo.builder()
                .age(33)
                .name("power")
                .subject("英语")
                .build();
        teacherInfoList.add(teacher2);
        teacherInfoList.add(teacher3);
        excelWriter.fill(new FillWrapper("t1",teacherInfoList),fillConfig ,sheet);
        //填充第二个list对象


        List<StudentInfo> studentInfo = new ArrayList<>();
        StudentInfo Student1=new  StudentInfo("1", "张三", "男", DateUtil.parse("2022/12/12"));
        StudentInfo Student2=new  StudentInfo("2", "王芳", "女",  DateUtil.parse("2025/02/15"));
        studentInfo.add(Student1);
        studentInfo.add(Student2);
        excelWriter.fill(new FillWrapper("t2",studentInfo),fillConfig ,sheet);
        //结束填充
        excelWriter.finish();



    }
}





效果

总结

1.占位符

在根据模版导出数据时,要预先设置占位符。包括,单个数据占位符和列表数据占位符。

单个占位符:{字段名} 如:{name}

列表占位符:{.字段名} 如:{.age},如果一个表格中有多个数据列,占位符前要加前缀,如:{t1.id}、{t2.name}

2.如果需要配置多个list,可以用new FillWrapper 申请别名:

excelWriter.fill(new FillWrapper(“t1”,teacherInfoList),fillConfig ,sheet);

3.碰到输入的文件名和文件内容乱码:

引起原因是项目的编码或者文件的编码不是UTF-8,更改即可。

到此这篇关于Java利用EasyExcel实现模板读取和复杂表格填充的文章就介绍到这了,更多相关Java EasyExcel复杂表格填充内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单了解java集合框架LinkedList使用方法

    简单了解java集合框架LinkedList使用方法

    这篇文章主要介绍了简单了解java集合框架LinkedList使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot @value注解动态刷新问题小结

    SpringBoot @value注解动态刷新问题小结

    @Value注解 所对应的数据源来自项目的 Environment 中,我们可以将数据库或其他文件中的数据,加载到项目的 Environment 中,然后 @Value注解 就可以动态获取到配置信息了,这篇文章主要介绍了SpringBoot @value注解动态刷新,需要的朋友可以参考下
    2023-09-09
  • HashMap底层原理全面详解面试绝对不慌

    HashMap底层原理全面详解面试绝对不慌

    这篇文章主要介绍了HashMap底层实现原理详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • JAVA实现账户取款和存款操作

    JAVA实现账户取款和存款操作

    这篇文章主要介绍了JAVA实现账户取款和存款操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Bean的自动注入及循环依赖问题

    Bean的自动注入及循环依赖问题

    本文详细介绍了Bean的自动注入及循环依赖,文中通过代码介绍的非常详细,对大家的学习有一定的研究价值,感兴趣的小伙伴可以阅读参考
    2023-03-03
  • 使用EasyPoi完成复杂一对多excel表格导出功能全过程

    使用EasyPoi完成复杂一对多excel表格导出功能全过程

    这篇文章主要介绍了使用EasyPoi完成复杂一对多excel表格导出功能全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • java实现画图板功能

    java实现画图板功能

    这篇文章主要为大家详细介绍了java实现画图板功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Java实现给Word文件添加文字水印

    Java实现给Word文件添加文字水印

    Word中设置水印时,可预设的文字或自定义文字设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果。本文将利用Java给Word每一页设置不同文字水印效果,需要的可以参考一下
    2022-02-02
  • java实现向有序数组中插入一个元素实例

    java实现向有序数组中插入一个元素实例

    本篇文章主要介绍了java实现向有序数组中插入一个元素实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java实现微信扫码登入的实例代码

    Java实现微信扫码登入的实例代码

    这篇文章主要介绍了java实现微信扫码登入功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论