Java動(dòng)態(tài)填充Excel模板實(shí)戰(zhàn)教程
引言
在日常開發(fā)中,我們經(jīng)常需要生成格式統(tǒng)一的 Excel 文件,比如報(bào)表、發(fā)票、訂單清單、成績(jī)單等。手動(dòng)創(chuàng)建 Excel 文件不僅效率低,而且難以保證樣式的一致性。相比之下,使用預(yù)先設(shè)計(jì)好的 Excel 模板,通過(guò)Java代碼自動(dòng)填充數(shù)據(jù),既省時(shí)省力,又能確保輸出文檔專業(yè)規(guī)范。
這種“基于模板生成Excel”的方式,特別適用于處理結(jié)構(gòu)固定、數(shù)據(jù)來(lái)源動(dòng)態(tài)的場(chǎng)景,比如從數(shù)據(jù)庫(kù)導(dǎo)出銷售記錄、根據(jù)用戶輸入生成報(bào)價(jià)單、批量生成發(fā)票等。本文將介紹如何通過(guò)Java實(shí)現(xiàn)Excel模板的數(shù)據(jù)填充與自動(dòng)化導(dǎo)出。主要涵蓋內(nèi)容如下:
- 為什么選擇Java編程方式填充Excel模板
- 準(zhǔn)備工作
- Java填充Excel模板的實(shí)現(xiàn)方式
- 方法一、替換模板中的占位符文本
- 方法二、使用Smart Marker動(dòng)態(tài)插入數(shù)據(jù)
- 進(jìn)階示例:填充自定義數(shù)據(jù)對(duì)象
- 將導(dǎo)出結(jié)果保存為PDF(可選操作)
為什么選擇Java編程方式填充Excel模板
相比手動(dòng)填充,采用Java編程方式按模板生成Excel文件具有多方面的優(yōu)勢(shì):
- 提高效率:快速處理大量數(shù)據(jù),節(jié)省人力和時(shí)間成本。
- 保持樣式統(tǒng)一:繼承模板樣式,確保文檔美觀、規(guī)范。
- 支持動(dòng)態(tài)數(shù)據(jù):自動(dòng)填充來(lái)自數(shù)據(jù)庫(kù)或接口的實(shí)時(shí)數(shù)據(jù)。
- 便于批量生成:輕松創(chuàng)建多份文檔,如報(bào)表、發(fā)票等。
- 易于集成:可嵌入業(yè)務(wù)系統(tǒng),實(shí)現(xiàn)自動(dòng)化文檔處理流程。
- 降低錯(cuò)誤率:避免手動(dòng)輸入失誤,提高數(shù)據(jù)準(zhǔn)確性。
準(zhǔn)備工作
1. 引入 Spire.XLS for Java 庫(kù)
Spire.XLS for Java是一款功能全面的 Excel 操作類庫(kù),支持讀取、編輯、生成、格式化以及導(dǎo)出 Excel 文檔。在開始前,確保項(xiàng)目中已正確引入該庫(kù):
如果使用 Maven,可添加如下依賴(當(dāng)前版本號(hào)15.6.3):
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>15.6.3</version>
</dependency>- 或下載 Spire.Xls.jar 并手動(dòng)將其添加到項(xiàng)目。
2. 準(zhǔn)備 Excel 模板文件
根據(jù)業(yè)務(wù)需求,設(shè)計(jì)好 Excel 模板。模板中可以包含:
- 占位符文本:用于簡(jiǎn)單替換;
- 或Smart Marker:用于綁定結(jié)構(gòu)化數(shù)據(jù)。
模板應(yīng)預(yù)設(shè)好樣式、布局和表頭,確保填充后文檔整潔規(guī)范。
Java填充Excel模板的實(shí)現(xiàn)方式
方法一、替換模版中的占位符文本
適用場(chǎng)景說(shuō)明
當(dāng)模板結(jié)構(gòu)固定,僅需填充個(gè)別字段(如姓名、職位、日期等)時(shí),可在模板中設(shè)置占位符文字,通過(guò)程序自動(dòng)查找并替換這些占位符,實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)填充。
實(shí)現(xiàn)步驟
創(chuàng)建Excel模板
新建一個(gè)Excel模板文檔,在模板中預(yù)設(shè)占位符文字,例如{姓名}、{年齡}、{職位} 等:

使用Java查找并替換模板中的占位符文字
以下代碼展示了如何在模板中查找占位符文字,并將其替換為實(shí)際數(shù)據(jù):
import com.spire.xls.*;
import java.awt.*;
import java.util.EnumSet;
import java.util.HashMap;
public class ReplacePlaceholderText {
public static void main(String[] args) {
// 打開Excel模板
Workbook workbook = new Workbook();
workbook.loadFromFile("占位符模板.xlsx");
// 獲取指定工作表(工作表索引從0開始)
Worksheet sheet = workbook.getWorksheets().get(0);
// 定義要替換的占位符及對(duì)應(yīng)值
HashMap<String, Object> replacements = new HashMap<>();
replacements.put("{姓名}", "張立強(qiáng)");
replacements.put("{年齡}", 28);
replacements.put("{職位}", "財(cái)務(wù)總監(jiān)");
// 在工作表中查找占位符并替換為對(duì)應(yīng)值
for (String placeholder : replacements.keySet()) {
Object value = replacements.get(placeholder);
CellRange[] foundRanges = sheet.findAll(placeholder, EnumSet.of(FindType.Text), EnumSet.of(ExcelFindOptions.MatchEntireCellContent));
for (int i = 0; i < foundRanges.length; i++) {
CellRange cell = foundRanges[i];
cell.setValue2(value);
// 高亮替換后的單元格 (可選)
cell.getStyle().setColor(Color.YELLOW);
}
}
// 保存結(jié)果文件
workbook.saveToFile("替換占位符.xlsx", ExcelVersion.Version2016);
workbook.dispose();
}
}結(jié)果文檔如圖:

方法二、使用Smart Marker動(dòng)態(tài)插入數(shù)據(jù)
什么是Smart Marker(智能標(biāo)記)
Smart Marker 是一種用在Excel 模板中的特殊語(yǔ)法標(biāo)識(shí)符,用于將外部數(shù)據(jù)源動(dòng)態(tài)填充到工作表的指定位置。它在模板中以占位符的形式存在,程序運(yùn)行過(guò)程中會(huì)根據(jù)綁定的數(shù)據(jù)源自動(dòng)替換為實(shí)際內(nèi)容,從而實(shí)現(xiàn)批量生成報(bào)表、訂單、清單等文檔。
借助 Smart Marker,開發(fā)者可快速、靈活地將數(shù)據(jù)自動(dòng)寫入 Excel,提高文檔生成的效率和自動(dòng)化程度。
Smart Marker語(yǔ)法說(shuō)明
Smart Marker的寫法會(huì)根據(jù)所綁定的數(shù)據(jù)類型有所不同。每個(gè)標(biāo)記必須單獨(dú)放置在一個(gè)單元格中,一個(gè)單元格中只能包含一個(gè)智能標(biāo)記,不能與其他文本混合使用,以確保正確解析和填充數(shù)據(jù)。
常見的語(yǔ)法格式包括:
- &=變量名:將一個(gè)單一值插入當(dāng)前單元格。適用于填充如姓名、日期或編號(hào)等基礎(chǔ)數(shù)據(jù)項(xiàng)。
示例:&=姓名,表示將姓名變量的值插入該單元格。 - &=集合對(duì)象:將一個(gè)集合對(duì)象中的元素按垂直方向(即逐行)填充到多個(gè)單元格中。適用于批量插入記錄,如員工姓名、產(chǎn)品名稱或訂單編號(hào)等。
示例:&=Language,表示將Language集合中的每一項(xiàng)按垂直方向依次填入各行。 - &=數(shù)據(jù)源.字段名:用于綁定結(jié)構(gòu)化數(shù)據(jù)源中的具體字段。數(shù)據(jù)源可以是數(shù)據(jù)庫(kù)查詢結(jié)果、對(duì)象集合、DataTable 等。此語(yǔ)法適用于需要從復(fù)雜數(shù)據(jù)結(jié)構(gòu)中提取字段值進(jìn)行批量填充的場(chǎng)景。
示例:&=Student.Name ,表示從名為 Student 的數(shù)據(jù)源中提取 Name 字段的數(shù)據(jù)并逐行填充。
實(shí)現(xiàn)步驟
創(chuàng)建Excel模板
新建一個(gè)Excel模板文檔,并插入以下Smart Marker智能標(biāo)記:

使用Java填充數(shù)據(jù)到模板
以下代碼展示了如何創(chuàng)建一個(gè)結(jié)構(gòu)化表格DataTable,將DataTable數(shù)據(jù)綁定到模板的Smart Marker智能標(biāo)記,并應(yīng)用Smart Marker來(lái)填充數(shù)據(jù)到模板:
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
import com.spire.xls.data.table.DataColumn;
import com.spire.xls.data.table.DataRow;
import com.spire.xls.data.table.DataTable;
public class ApplySmartMarker {
public static void main(String[] args) throws Exception {
// 加載 Excel 模板
Workbook workbook = new Workbook();
workbook.loadFromFile("智能標(biāo)記模板.xlsx");
// 獲取第一個(gè)工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 創(chuàng)建一個(gè)新的 DataTable 對(duì)象,并命名為 "data"
DataTable dt = new DataTable();
dt.setTableName("data");
// 添加三列:姓名、年齡、職位
dt.getColumns().add(new DataColumn("姓名"));
dt.getColumns().add(new DataColumn("年齡"));
dt.getColumns().add(new DataColumn("職位"));
// 創(chuàng)建數(shù)據(jù)行
DataRow row1 = dt.newRow();
row1.setString("姓名", "張三");
row1.setString("年齡", "28");
row1.setString("職位", "銷售經(jīng)理");
DataRow row2 = dt.newRow();
row2.setString("姓名", "李四");
row2.setString("年齡", "32");
row2.setString("職位", "市場(chǎng)主管");
DataRow row3 = dt.newRow();
row3.setString("姓名", "王五");
row3.setString("年齡", "25");
row3.setString("職位", "技術(shù)支持");
// 添加數(shù)據(jù)行到表格中
dt.getRows().add(row1);
dt.getRows().add(row2);
dt.getRows().add(row3);
// 綁定表格的數(shù)據(jù)
workbook.getMarkerDesigner().addDataTable("data", dt);
// 應(yīng)用Smart Marker,填充數(shù)據(jù)
workbook.getMarkerDesigner().apply();
// 自動(dòng)調(diào)整行高和列寬 (可選)
//sheet.getAllocatedRange().autoFitRows();
//sheet.getAllocatedRange().autoFitColumns();
// 保存結(jié)果文件
workbook.saveToFile("應(yīng)用智能標(biāo)記.xlsx", ExcelVersion.Version2016);
workbook.dispose();
}
}結(jié)果文檔如圖:

Smart Marker附加設(shè)置
1. 格式復(fù)制
從以上結(jié)果文檔中可以看出,后兩行的格式與前兩行不同,沒有居中,這是因?yàn)樵诓迦霐?shù)據(jù)的時(shí)候沒有復(fù)制格式。要解決這一問題,可以在模版的Smart Marker中添加add:styles參數(shù),如下圖所示:

保存模板文檔,再執(zhí)行代碼,結(jié)果文檔如圖:

2. 數(shù)據(jù)填充方向設(shè)置
默認(rèn)情況下,Smart Marker的數(shù)據(jù)填充方向?yàn)榇怪狈较?。在模板的Smart Marker中添加horizontal參數(shù),即可調(diào)整填充方向?yàn)樗椒较颉?/p>
示例:&=data.姓名(horizontal)
進(jìn)階示例:填充自定義數(shù)據(jù)對(duì)象
在實(shí)際開發(fā)中,除了使用基礎(chǔ)數(shù)據(jù)類型和表格數(shù)據(jù),我們有時(shí)還需要將自定義的對(duì)象集合填充到 Excel 模板中。
下面的代碼展示了如何創(chuàng)建一個(gè) Excel 模板,定義自定義數(shù)據(jù)對(duì)象,并通過(guò) Smart Marker 將對(duì)象屬性的數(shù)據(jù)插入到模板中:
import com.spire.xls.*;
import java.util.ArrayList;
public class BindCustomObjects {
// 定義一個(gè)Student類
public static class Student {
private String Name;
private String Course;
private int Score;
// 定義構(gòu)造函數(shù),參數(shù)包括:學(xué)生姓名、課程、分?jǐn)?shù)
public Student(String name, String course, int score) {
this.Name = name;
this.Course = course;
this.Score = score;
}
}
public static void main(String[] args) {
// 創(chuàng)建Excel模板文檔
Workbook workbook = new Workbook();
// 獲取第一個(gè)工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 添加表頭
sheet.getCellRange("A1").setValue("姓名");
sheet.getCellRange("B1").setValue("課程");
sheet.getCellRange("C1").setValue("分?jǐn)?shù)");
// 添加Smart Marker智能標(biāo)記
sheet.getCellRange("A2").setValue("&=Student.Name(add:styles)");
sheet.getCellRange("B2").setValue("&=Student.Course(add:styles)");
sheet.getCellRange("C2").setValue("&=Student.Score(add:styles)");
// 設(shè)置單元格格式
sheet.getCellRange("A1:C2").getCellStyle().setHorizontalAlignment(HorizontalAlignType.Center);
sheet.getCellRange("A1:C1").getCellStyle().getFont().isBold(true);
sheet.getCellRange("A1:C1").getCellStyle().getFont().setSize(12);
sheet.getCellRange("A2:C2").getCellStyle().getFont().setSize(11);
// 創(chuàng)建一個(gè)ArrayList來(lái)存儲(chǔ)Student對(duì)象
ArrayList<Student> list = new ArrayList<>();
// 添加3個(gè)學(xué)生對(duì)象
list.add(new Student("喬治", "語(yǔ)文", 62));
list.add(new Student("佩琪", "數(shù)學(xué)", 88));
list.add(new Student("艾米麗", "英語(yǔ)", 95));
// 綁定ArrayList數(shù)據(jù)到Smart Marker
workbook.getMarkerDesigner().addParameter("Student", list);
// 應(yīng)用Smart Marker,填充數(shù)據(jù)
workbook.getMarkerDesigner().apply();
// 保存結(jié)果文件
workbook.saveToFile("添加自定義數(shù)據(jù)類型.xlsx", ExcelVersion.Version2013);
workbook.dispose();
}
}
將導(dǎo)出結(jié)果保存為PDF(可選操作)
要將填充后的Excel模板保存為PDF,只需使用Workbook.saveToFile()方法并指定格式為FileFormat.PDF即可:
workbook.saveToFile("添加自定義數(shù)據(jù)類型.pdf", FileFormat.PDF);
總結(jié)
通過(guò) Java 編程方式填充 Excel 模板,可以高效地生成樣式一致、數(shù)據(jù)準(zhǔn)確的文檔,尤其適用于批量生成、自動(dòng)化導(dǎo)出等場(chǎng)景。借助 Java和Spire.XLS庫(kù),開發(fā)者無(wú)需手動(dòng)構(gòu)建復(fù)雜表格結(jié)構(gòu),即可靈活填充各類動(dòng)態(tài)數(shù)據(jù),提升辦公自動(dòng)化水平和開發(fā)效率。
以上就是Java動(dòng)態(tài)填充Excel模板實(shí)戰(zhàn)教程的詳細(xì)內(nèi)容,更多關(guān)于Java填充Excel模板的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)現(xiàn)父子線程共享數(shù)據(jù)的幾種方法
本文主要介紹了Java實(shí)現(xiàn)父子線程共享數(shù)據(jù)的幾種方法,包括直接共享變量、使用?ThreadLocal、同步機(jī)制、線程安全的數(shù)據(jù)結(jié)構(gòu)以及ExecutorService,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
java web實(shí)現(xiàn)分頁(yè)查詢實(shí)例方法
在本篇文章里我們給大家分享了java web實(shí)現(xiàn)分頁(yè)查詢的詳細(xì)方法知識(shí)點(diǎn),有需要的朋友們參考學(xué)習(xí)下。2018-10-10
SpringBoot 動(dòng)態(tài)配置Profile環(huán)境的方式
這篇文章主要介紹了SpringBoot 動(dòng)態(tài)配置Profile環(huán)境的方式,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
MyBatis結(jié)果映射(ResultMap)的使用
在MyBatis中,結(jié)果映射是實(shí)現(xiàn)數(shù)據(jù)庫(kù)結(jié)果集到Java對(duì)象映射的核心,它不僅支持簡(jiǎn)單的字段映射,還能處理字段名不一致、嵌套對(duì)象和集合映射等復(fù)雜場(chǎng)景,通過(guò)ResultMap,開發(fā)者可以靈活定義映射關(guān)系,以適應(yīng)各種需求,感興趣的可以了解一下2024-09-09
【面試】Spring事務(wù)面試考點(diǎn)吐血整理(建議珍藏)
本文是小編給大家收藏整理的Spring事務(wù)面試考點(diǎn),非常不錯(cuò),值得收藏,感興趣的朋友參考下吧2019-04-04

