最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java+Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔

 更新時(shí)間:2023年11月18日 09:13:25   作者:芝麻粒兒  
這篇文章主要為大家詳細(xì)介紹了Java如何使用Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下

一、導(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)文章

  • JVM執(zhí)行引擎和垃圾回收要點(diǎn)總結(jié)

    JVM執(zhí)行引擎和垃圾回收要點(diǎn)總結(jié)

    不論是在問題現(xiàn)場(chǎng)還是跳槽面試,我們面對(duì)JVM性能問題,依舊會(huì)束手無辭,它需要你對(duì)Java虛擬機(jī)的實(shí)現(xiàn)和優(yōu)化,有極為深刻的理解。所以我在這里整理了一下 JVM的知識(shí)點(diǎn)。今天說說虛擬機(jī)執(zhí)行引擎和垃圾回收,都是十足的干貨,請(qǐng)各位看官耐心批閱!
    2021-06-06
  • springboot響應(yīng)json?null值過濾方式

    springboot響應(yīng)json?null值過濾方式

    這篇文章主要介紹了springboot響應(yīng)json?null值過濾方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解

    Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解

    這篇文章主要介紹了Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解,在使用Netty進(jìn)行TCP消息傳輸時(shí),為了上層協(xié)議能夠?qū)ο⒄_區(qū)分,避免粘包和拆包導(dǎo)致的問題,一般可以通過消息定長、將回車換行符作為消息結(jié)束符,需要的朋友可以參考下
    2023-12-12
  • Java使用默認(rèn)瀏覽器打開指定URL的方法(二種方法)

    Java使用默認(rèn)瀏覽器打開指定URL的方法(二種方法)

    Java使用默認(rèn)瀏覽器打開指定URL。
    2013-10-10
  • Spring基于advisor配置aop過程解析

    Spring基于advisor配置aop過程解析

    這篇文章主要介紹了Spring基于advisor配置aop過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 淺析Java中并發(fā)工具類的使用

    淺析Java中并發(fā)工具類的使用

    在JDK的并發(fā)包里提供了幾個(gè)非常有用的并發(fā)工具類。CountDownLatch、CyclicBarrier和Semaphore工具類提供了一種并發(fā)流程控制的手段,Exchanger工具類提供了在線程間交換數(shù)據(jù)的一種方法。本文主要介紹了它們的使用,需要的可以參考一下
    2022-12-12
  • javacv依賴太大導(dǎo)致jar包也大的解決辦法

    javacv依賴太大導(dǎo)致jar包也大的解決辦法

    隨著項(xiàng)目的復(fù)雜度和依賴關(guān)系的增加,打包后的JAR包可能會(huì)變得很大,這篇文章主要介紹了javacv依賴太大導(dǎo)致jar包也大的解決辦法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • Java 關(guān)于遞歸的調(diào)用機(jī)制精細(xì)解讀

    Java 關(guān)于遞歸的調(diào)用機(jī)制精細(xì)解讀

    關(guān)于遞歸是什么,簡(jiǎn)單的說: 遞歸就是方法自己調(diào)用自己,每次調(diào)用時(shí) 傳入不同的變量.遞歸有助于編程者解決復(fù)雜的問題,同時(shí)可以讓代碼變得簡(jiǎn)潔
    2021-10-10
  • Spring集成Swagger常見錯(cuò)誤及解決辦法

    Spring集成Swagger常見錯(cuò)誤及解決辦法

    這篇文章主要介紹了Spring集成Swagger常見錯(cuò)誤及解決辦法,幫助大家更好的理解和學(xué)習(xí)使用Spring,感興趣的朋友可以了解下
    2021-05-05
  • 一個(gè)依賴搞定?Spring?Boot?接口防盜刷的流程分析

    一個(gè)依賴搞定?Spring?Boot?接口防盜刷的流程分析

    kk-anti-reptile 是適用于基于 spring-boot 開發(fā)的分布式系統(tǒng)的反爬蟲組件,這篇文章主要介紹了一個(gè)依賴搞定?Spring?Boot?接口防盜刷,需要的朋友可以參考下
    2022-06-06

最新評(píng)論

神木县| 麦盖提县| 柘城县| 连南| 许昌县| 璧山县| 喀什市| 乐东| 东乡| 丽江市| 武川县| 南涧| 台山市| 新安县| 吉林市| 财经| 威海市| 维西| 来凤县| 绍兴县| 东城区| 上蔡县| 汾阳市| 延津县| 永德县| 冀州市| 胶南市| 彭山县| 原平市| 赣榆县| 三台县| 旅游| 呼伦贝尔市| 富源县| 兴仁县| 哈密市| 正蓝旗| 乐山市| 浪卡子县| 永吉县| 政和县|