EasyExcel 复杂填充
EasyExcel
Excel表格中用{}或者{.} 来表示包裹要填充的变量,如果单元格文本中本来就有{、}左右大括号,需要在括号前面使用斜杠转义\{ 、\}。
代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和Excel中被{}包裹的变量名称一致。
ExcelWriter的fill()方法 用于填充数据
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();//表示开启组合填充换行填充
样例
测试代码
TeacherInfo 对象
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder //通过自动生成的构建器模式创建对象
public class TeacherInfo {
private int age;//年龄
private String name;//姓名
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();*/
//写入io流
//ByteArrayOutputStream outputStream=new ByteArrayOutputStream(1024);
// 写入excelWriter对象
//ExcelWriter excelWriter= EasyExcel.write(outputStream).withTemplate(templateInputStream ).build();
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,更改即可。