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

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

使用Java填充數(shù)據(jù)到模板
以下代碼展示了如何創(chuàng)建一個結(jié)構(gòu)化表格DataTable,將DataTable數(shù)據(jù)綁定到模板的Smart Marker智能標記,并應(yīng)用Smart Marker來填充數(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("智能標記模板.xlsx");
// 獲取第一個工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 創(chuàng)建一個新的 DataTable 對象,并命名為 "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("職位", "市場主管");
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();
// 自動調(diào)整行高和列寬 (可選)
//sheet.getAllocatedRange().autoFitRows();
//sheet.getAllocatedRange().autoFitColumns();
// 保存結(jié)果文件
workbook.saveToFile("應(yīng)用智能標記.xlsx", ExcelVersion.Version2016);
workbook.dispose();
}
}結(jié)果文檔如圖:

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

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

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

