Java利用EasyExcel實(shí)現(xiàn)模板讀取和復(fù)雜表格填充
EasyExcel
?Excel表格中用{}或者{.} 來(lái)表示包裹要填充的變量,如果單元格文本中本來(lái)就有{、}左右大括號(hào),需要在括號(hào)前面使用斜杠轉(zhuǎn)義\{ 、\}。
?代碼中被填充數(shù)據(jù)的實(shí)體對(duì)象的成員變量名或被填充map集合的key需要和Excel中被{}包裹的變量名稱(chēng)一致。
ExcelWriter的fill()方法 用于填充數(shù)據(jù)
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();//表示開(kāi)啟組合填充換行填充
樣例

測(cè)試代碼
TeacherInfo 對(duì)象
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder //通過(guò)自動(dòng)生成的構(gòu)建器模式創(chuàng)建對(duì)象
public class TeacherInfo {
@ExcelProperty("年齡")
private int age;//年齡
@ExcelProperty("姓名")
private String name;//姓名
@ExcelProperty("科目")
private String subject;//科目
}
StudentInfo對(duì)象
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;//編號(hào)
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.寫(xiě)入文件方式
String filePath = "D:\\log\\stduent_01.xlsx";
InputStream templateFile = new FileInputStream(filePath);
String targetFile = "D:\\學(xué)生信息統(tǒng)計(jì)2.xlsx";
ExcelWriter excelWriter =EasyExcel.write(targetFile).withTemplate(templateFile).build();
// 2.加載模板,配置在項(xiàng)目工程下的 寫(xiě)入io
/* ClassPathResource resource=new ClassPathResource("template/stduent_01.xlsx");
InputStream templateInputStream = resource.getInputStream();*/
//1.寫(xiě)入io流
//ByteArrayOutputStream outputStream=new ByteArrayOutputStream(1024);
// 寫(xiě)入excelWriter對(duì)象
//ExcelWriter excelWriter= EasyExcel.write(outputStream).withTemplate(templateInputStream ).build();
//2.最簡(jiǎn)單的寫(xiě)入是讀取數(shù)據(jù)寫(xiě)入單行正常表頭
//List<TeacherInfo> teacherInfos=new ArrayList<>();
//EasyExcel.write(outputStream,TeacherInfo.class).sheet("老師信息統(tǒng)計(jì)").doWrite(teacherInfos);
WriteSheet sheet = EasyExcel.writerSheet().build();
// 當(dāng)前日期
HashMap<String, String> dateMap = new HashMap<String, String>();
dateMap.put("date", "2025-02-06");
//填充單個(gè)字段信息
excelWriter.fill(dateMap,sheet);
//填充單個(gè)對(duì)象信息
/*
TeacherInfo teacher=TeacherInfo.builder()
.age(33)
.name("張竹")
.build();
excelWriter.fill(teacher,sheet);
*/
//換行填充
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
//多次填充list,可以用new FillWrapper()申明別名
//填充第一個(gè)list
List<TeacherInfo> teacherInfoList=new ArrayList();
TeacherInfo teacher2=TeacherInfo.builder()
.age(22)
.name("張竹")
.subject("數(shù)學(xué)")
.build();
TeacherInfo teacher3=TeacherInfo.builder()
.age(33)
.name("power")
.subject("英語(yǔ)")
.build();
teacherInfoList.add(teacher2);
teacherInfoList.add(teacher3);
excelWriter.fill(new FillWrapper("t1",teacherInfoList),fillConfig ,sheet);
//填充第二個(gè)list對(duì)象
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);
//結(jié)束填充
excelWriter.finish();
}
}
效果

總結(jié)
1.占位符
在根據(jù)模版導(dǎo)出數(shù)據(jù)時(shí),要預(yù)先設(shè)置占位符。包括,單個(gè)數(shù)據(jù)占位符和列表數(shù)據(jù)占位符。
單個(gè)占位符:{字段名} 如:{name}
列表占位符:{.字段名} 如:{.age},如果一個(gè)表格中有多個(gè)數(shù)據(jù)列,占位符前要加前綴,如:{t1.id}、{t2.name}
2.如果需要配置多個(gè)list,可以用new FillWrapper 申請(qǐng)別名:
excelWriter.fill(new FillWrapper(“t1”,teacherInfoList),fillConfig ,sheet);
3.碰到輸入的文件名和文件內(nèi)容亂碼:
引起原因是項(xiàng)目的編碼或者文件的編碼不是UTF-8,更改即可。
到此這篇關(guān)于Java利用EasyExcel實(shí)現(xiàn)模板讀取和復(fù)雜表格填充的文章就介紹到這了,更多相關(guān)Java EasyExcel復(fù)雜表格填充內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)單了解java集合框架LinkedList使用方法
這篇文章主要介紹了簡(jiǎn)單了解java集合框架LinkedList使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot @value注解動(dòng)態(tài)刷新問(wèn)題小結(jié)
@Value注解 所對(duì)應(yīng)的數(shù)據(jù)源來(lái)自項(xiàng)目的 Environment 中,我們可以將數(shù)據(jù)庫(kù)或其他文件中的數(shù)據(jù),加載到項(xiàng)目的 Environment 中,然后 @Value注解 就可以動(dòng)態(tài)獲取到配置信息了,這篇文章主要介紹了SpringBoot @value注解動(dòng)態(tài)刷新,需要的朋友可以參考下2023-09-09
JAVA實(shí)現(xiàn)賬戶(hù)取款和存款操作
這篇文章主要介紹了JAVA實(shí)現(xiàn)賬戶(hù)取款和存款操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Bean的自動(dòng)注入及循環(huán)依賴(lài)問(wèn)題
本文詳細(xì)介紹了Bean的自動(dòng)注入及循環(huán)依賴(lài),文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)有一定的研究?jī)r(jià)值,感興趣的小伙伴可以閱讀參考2023-03-03
使用EasyPoi完成復(fù)雜一對(duì)多excel表格導(dǎo)出功能全過(guò)程
這篇文章主要介紹了使用EasyPoi完成復(fù)雜一對(duì)多excel表格導(dǎo)出功能全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Java實(shí)現(xiàn)給Word文件添加文字水印
Word中設(shè)置水印時(shí),可預(yù)設(shè)的文字或自定義文字設(shè)置為水印效果,但通常添加水印效果時(shí),會(huì)對(duì)所有頁(yè)面都設(shè)置成統(tǒng)一效果。本文將利用Java給Word每一頁(yè)設(shè)置不同文字水印效果,需要的可以參考一下2022-02-02
java實(shí)現(xiàn)向有序數(shù)組中插入一個(gè)元素實(shí)例
本篇文章主要介紹了java實(shí)現(xiàn)向有序數(shù)組中插入一個(gè)元素實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Java實(shí)現(xiàn)微信掃碼登入的實(shí)例代碼
這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登入功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

