Java+Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔
一、導(dǎo)出Word文檔
1.1、基礎(chǔ)知識(shí)
Word文件有兩種后綴格式,分別是:doc和docx,doc是Word2003之前使用的,docx是Word2007之后使用的,可以說docx是對(duì)doc的擴(kuò)展和優(yōu)化。docx的響應(yīng)速度、性能、占用空間都比doc更好,另外docx本質(zhì)上是一個(gè)zip格式的壓縮文件,底層是基于OOXML組織數(shù)據(jù)的,也就是說,docx底層其實(shí)就是使用XML組成的一系列文件,然后使用程序渲染XML文件,最終就是我們看到的Word文件樣式啦。

我這篇文章中使用的Word模板文件就是利用docx后綴的,核心思想是將docx文件轉(zhuǎn)換成對(duì)應(yīng)的XML文件,然后修改XML文件中的內(nèi)容,將其改成Freemarker模板引擎中的占位符,之后通過Freemarker渲染程序?qū)⒄嘉环鎿Q成實(shí)際的數(shù)據(jù),并且將替換之后的模板文件轉(zhuǎn)換成docx文檔,這樣就實(shí)現(xiàn)了根據(jù)模板文件生成Word文檔啦。
注意:freemarker中的占位符是${},例如:這里使用的是【${name}】的形式,那么傳遞的數(shù)據(jù)中就需要有一個(gè)叫做【name】的字段。
1.2、制作模板文件
首先創(chuàng)建一個(gè)docx后綴的Word文件,文件中的內(nèi)容你自己根據(jù)實(shí)際需求編寫就可以啦,我創(chuàng)建的docx文件內(nèi)容如下所示:

內(nèi)容編輯完成之后,將其另存為XML文件,如下圖所示:

導(dǎo)出XML文件之后,打開這個(gè)文件,此時(shí)你會(huì)看到里面都是XML標(biāo)簽,首先格式化一下,這樣看起來會(huì)舒服些,可以檢查一下你的占位符內(nèi)容是否滿足freemarker語法。因?yàn)橛行r(shí)候,我們導(dǎo)出的XML文件中,可能會(huì)將【${xxx}】分隔成兩行,從而導(dǎo)致占位符失效,所以有時(shí)候需要手動(dòng)修改一下占位符。導(dǎo)出的Word XML文件內(nèi)容大致如下所示:

替換完成之后,我們的Word模板文件就做好啦,這個(gè)XML文件就是我們最終需要的Word模板文件,后面需要使用到。
1.3、代碼實(shí)現(xiàn)
(1)引入依賴
如果是SpringBoot的工程,SpringBoot已經(jīng)給我們提供了freemarker的啟動(dòng)器,這使得我們可以快速的集成freemarker,如下:
<!-- 引入 freemarker 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>如果是普通的Java工程,可以引入下面的依賴:
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>(2)創(chuàng)建Freemarker工具類
引入freemarker依賴之后,就可以使用Freemarker編寫一個(gè)工具類,專門用于處理文件的導(dǎo)出和數(shù)據(jù)渲染。
package com.gitcode.demo.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
* @version 1.0.0
* @Date: 2023/8/4 15:05
* @Author ZhuYouBin
* @Description: Freemarker 工具類
*/
public class FreemarkerUtil {
/**
* 使用 Freemarker 生成 Word 文件
* @param templateName 模板文件路徑名稱
* @param fileName 生成的文件路徑以及名稱
* @param dataModel 填充的數(shù)據(jù)對(duì)象
*/
public static void exportWord(String templateName, String fileName, Map<String, Object> dataModel) {
generateFile(templateName, fileName, dataModel);
}
/**
* 使用 Freemarker 生成指定文件
* @param templateName 模板文件路徑名稱
* @param fileName 生成的文件路徑以及名稱
* @param dataModel 填充的數(shù)據(jù)對(duì)象
*/
private static void generateFile(String templateName, String fileName, Map<String, Object> dataModel) {
try {
// 1、創(chuàng)建配置對(duì)象
Configuration config = new Configuration(Configuration.VERSION_2_3_30);
config.setDefaultEncoding("utf-8");
config.setClassForTemplateLoading(FreemarkerUtil.class, "/templates");
// 2、獲取模板文件
Template template = config.getTemplate(templateName);
// 3、創(chuàng)建生成的文件對(duì)象
File file = new File(fileName);
FileOutputStream fos = new FileOutputStream(file);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, StandardCharsets.UTF_8));
// 4、渲染模板文件
template.process(dataModel, writer);
// 5、關(guān)閉流
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}(3)測(cè)試案例代碼
package com.gitcode.demo.word;
import com.gitcode.demo.util.FreemarkerUtil;
import java.util.HashMap;
import java.util.Map;
/**
* @version 1.0.0
* @Date: 2023/8/4 15:26
* @Author ZhuYouBin
* @Description: 使用 Freemarker 導(dǎo)出 Word 文件
*/
public class ExportWordDemo {
public static void main(String[] args) {
String templateName = "freemarker模板文件.xml";
String fileName = "導(dǎo)出的word文檔.docx";
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("name", "張三");
dataModel.put("sex", "男");
dataModel.put("age", "20");
dataModel.put("address", "xxx地址yyy號(hào)");
// 執(zhí)行導(dǎo)出
FreemarkerUtil.exportWord(templateName, fileName, dataModel);
}
}(4)運(yùn)行效果
運(yùn)行測(cè)試案例的代碼,然后在工程目錄下,就可以看到生成的Word文檔,內(nèi)容如下所示:

上面的模板文件只是簡(jiǎn)單的文本,你也可以添加表格、圖片等內(nèi)容到模板文件里面,可以使用Freemarker中的循環(huán)標(biāo)簽實(shí)現(xiàn)表格數(shù)據(jù)的自動(dòng)添加,圖片內(nèi)容是采用base64編碼,所以需要讀取圖片將其轉(zhuǎn)換成base64編碼之后,再渲染到XML文件中,后面的文章在介紹表格和圖片的模板導(dǎo)出。
到此,F(xiàn)reemarker導(dǎo)出Word文檔就介紹完啦。
綜上,這篇文章結(jié)束了,主要介紹如何使用Java+Freemarker模板引擎,根據(jù)XML模板文件生成Word文檔。
以上就是Java+Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔的詳細(xì)內(nèi)容,更多關(guān)于Java Freemarker生成Word的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring5學(xué)習(xí)之基礎(chǔ)知識(shí)總結(jié)
這篇文章主要介紹了Spring5學(xué)習(xí)之基礎(chǔ)知識(shí)總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05
使用Spring處理x-www-form-urlencoded方式
這篇文章主要介紹了使用Spring處理x-www-form-urlencoded方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java的動(dòng)態(tài)代理模式之JDK代理詳解
這篇文章主要介紹了Java的動(dòng)態(tài)代理模式之JDK代理詳解,代理對(duì)象,不需要實(shí)現(xiàn)接口,但是目標(biāo)對(duì)象要實(shí)現(xiàn)接口,否則不能用動(dòng)態(tài)代理,JDK?實(shí)現(xiàn)代理只需要使用?newProxyInstance?方法,但是該方法需要接收三個(gè)參數(shù),需要的朋友可以參考下2023-11-11
java如何將list中的某個(gè)元素移動(dòng)位置
在Java編程中我們經(jīng)常會(huì)使用List數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)一組元素,下面這篇文章主要給大家介紹了關(guān)于java如何將list中的某個(gè)元素移動(dòng)位置的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
JAVA發(fā)送HTTP請(qǐng)求,返回HTTP響應(yīng)內(nèi)容,應(yīng)用及實(shí)例代碼
這篇文章主要介紹了JAVA發(fā)送HTTP請(qǐng)求,返回HTTP響應(yīng)內(nèi)容,應(yīng)用及實(shí)例代碼,需要的朋友可以參考下2014-02-02
Java實(shí)現(xiàn)根據(jù)地址智能識(shí)別省市區(qū)縣
這篇文章主要為大家詳細(xì)介紹了如何編寫一個(gè)Java工具類,可以根據(jù)身份證地址或用戶輸入的地址,智能識(shí)別并提取出詳細(xì)的省市區(qū)縣信息,感興趣的小伙伴可以了解下2025-03-03
SpringBoot快速過濾出一次請(qǐng)求的所有日志的示例代碼
在現(xiàn)網(wǎng)出現(xiàn)故障時(shí),我們經(jīng)常需要獲取一次請(qǐng)求流程里的所有日志進(jìn)行定位,本文給大家介紹了SpringBoot如何快速過濾出一次請(qǐng)求的所有日志,文中有相關(guān)的代碼和示例供大家參考,需要的朋友可以參考下2024-03-03

