Java使用FreeMarker模版技術動態生成word實踐

Java知識圖譜發表於2022-06-14

一、序言

在日常開發中,常常有動態word檔案生成的需求,通過編制模版,然後動態修改word內容以組合成新的檔案。報告單、請假單、發票頁等都可以使用動態生成word來解決。

筆者總結歸納出通用技術要點,儘可能降低廣大開發者的使用技術門檻。

二、製作與渲染模版

(一)總體流程

1、準備資料

通過查詢資料庫獲取需要修改的資料,或者是呼叫遠端API介面獲得資料,資料準備完畢後,進入下一步。

2、製作word模版

新建並設計出期望效果的word文件樣式,包含字型、字號、段落樣式佈局等,先做出一個靜態的word檔案。

3、製作freemark模版

在新建word模版的基礎上,使用freemark語法,結合已經準備填充的資料結構,將需要動態變化的內容用變數表示。

用變數替換時常見的情形時物件屬性和迴圈。

freemark模版製作完成後,儲存為ftl字尾檔案。

4、渲染字串

將資料和freemark模版組合,並且將前期製作的變數佔位符替換,形成最終的word檔案

(二)編碼實踐

按照筆者提供的流程和SDK編碼實踐相對比較簡單。

1、引入依賴

如下依賴包含封裝的工具方法,大幅降低使用門檻。

<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-word</artifactId>
    <version>1.5.6</version>
</dependency>
2、編碼
/* 模擬準備資料 */
List<HumanDemo> data = TempUtils.readJsonList("HumanDemo.json", HumanDemo.class);
/* 將資料填充到模版中並生成word文件 */
DocUtils.fillWord("templates/HumanDemo.ftl", data);

從流程到編碼實踐比較簡單。

到此為止,已經可以快速體驗word生成技術了。

三、內容擴充

上述分析的word生成如果頁面結構較為簡單,實現起來難度不大,假如涉及到如下情形,實現起來就會增加不少難度。

增加的困難主要來源於頁面佈局複雜、使用各種元件控制元件多多媒體資源的引入。解決方法仍然參考上述流程。

(一)複雜模版

1、多媒體資源佈局

WX20220613-201931@2x1111A

當模版中需求多媒體(圖片)內容,並且數量動態變化,位置不固定時,實現難度較大。

2、複雜內容佈局

WX20220613-202807@2x3333A

當模版中包含文字,選擇框,橫向合併單元格、縱向合併單元格時,實現難度較大。

3、動態渲染表格

WX20220613-202453@2x2222A

涉及到動態渲染合併單元格時,實現難度較大。

上述複雜模版製作,筆者均有實踐。

(二)檔案格式

對於word檔案格式有兩種,一種是.doc字尾檔案,一種是.docx字尾檔案,上述討論屬於前者,後者模版製作與生成比前者要複雜,將在後續的版本中提供API操作介面。

.docx字尾檔案的word在轉PDF方面相容性比較好。

(三)使用建議

開發前,儘可能將模版佈局確認,對於複雜頁面結構修改需要增加較大投入

熟悉FreeMark語法、word檔案結構將會對word模版開發受益

多使用、多練將有助於製作出漂亮的文件。

相關文章