SpringBoot集成Poi-tl實(shí)現(xiàn)動(dòng)態(tài)Word文檔生成的詳細(xì)步驟
前言
在項(xiàng)目開發(fā)過程中,遇到了一個(gè)需求:將用戶輸入的數(shù)據(jù)填充到給定格式的 Word 文檔中。簡(jiǎn)單來說,就是要根據(jù)預(yù)定義的模板生成一個(gè)新的 Word 文檔,并自動(dòng)填充數(shù)據(jù)。
什么是 Poi-tl?
官網(wǎng):http://deepoove.com/poi-tl/
poi-tl
(Poi Template Language)是一個(gè)強(qiáng)大的 Word 模板引擎,能夠根據(jù) Word 模板和數(shù)據(jù)動(dòng)態(tài)生成新的文檔。底層是基于 Apache POI 實(shí)現(xiàn)的。
Apache POI 提供了簡(jiǎn)便的 API 來操作各種 Word 文檔元素(如文本、圖片、表格、頁眉、頁腳、圖表等),并允許直接操作文檔的 XML 結(jié)構(gòu)。
Poi-tl 的功能特點(diǎn):
功能 | 描述 |
---|---|
文本渲染 | 渲染模板中的文本標(biāo)簽 |
圖片渲染 | 渲染模板中的圖片標(biāo)簽 |
表格渲染 | 渲染模板中的表格標(biāo)簽 |
列表渲染 | 渲染模板中的列表標(biāo)簽 |
圖表渲染 | 渲染不同類型的圖表,包括柱狀圖、折線圖等 |
條件渲染 | 根據(jù)條件顯示或隱藏內(nèi)容 |
循環(huán)渲染 | 對(duì)文本、圖片、表格等內(nèi)容進(jìn)行循環(huán)渲染 |
表格行/列循環(huán) | 對(duì)表格的行或列進(jìn)行循環(huán)渲染 |
圖片替換 | 替換文檔中的指定圖片 |
超鏈接、書簽、錨點(diǎn) | 支持文檔內(nèi)的超鏈接、書簽、錨點(diǎn)等功能 |
強(qiáng)大的表達(dá)式支持 | 完全支持 SpringEL 表達(dá)式,并可擴(kuò)展至 OGNL、MVEL 等表達(dá)式 |
自定義標(biāo)簽支持 | 支持自定義標(biāo)簽前后綴 |
文本框支持 | 支持文本框中的標(biāo)簽 |
樣式自定義 | 自定義模板樣式,同時(shí)代碼中也可動(dòng)態(tài)設(shè)置樣式 |
模板嵌套 | 支持嵌套模板功能 |
Word 合并 | 支持 Word 中的合并操作 |
自定義函數(shù)(插件) | 允許在模板中使用自定義函數(shù) |
通過這些特性,我們可以輕松地實(shí)現(xiàn)模板渲染,生成符合特定格式要求的文檔。
如何使用 Poi-tl?
本文以 Spring Boot 項(xiàng)目為例,展示如何集成 Poi-tl 進(jìn)行模板渲染。小伙伴們可以按照步驟一起實(shí)踐!
1. 創(chuàng)建 Spring Boot 項(xiàng)目
首先,創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,版本為 2.2.1(可以根據(jù)需要調(diào)整版本)。在 pom.xml
文件中引入以下依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
2. 添加 Poi-tl 依賴
接下來,向 pom.xml
中添加 Poi-tl 的依賴:
<dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.9.1</version> </dependency>
3. 準(zhǔn)備 Word 模板
我們需要準(zhǔn)備一個(gè) Word 模板??梢允謩?dòng)創(chuàng)建一個(gè) Word 文件,這里我們以 Hello World.docx
為例,模板內(nèi)容如下:
我們將模板存放在 resources
目錄下,并定義幾個(gè)占位符,例如:{{title}}
、{{text}}
、{{author}}
等。
4. 渲染模板并生成新文檔
我們可以通過 XWPFTemplate
來渲染模板,將數(shù)據(jù)填充到模板中并生成新的文檔。示例代碼如下:
@SpringBootTest public class PoiTlApplicationTest { @Test public void test() { // 獲取 Word 模板路徑 String filepath = this.getClass().getClassLoader().getResource("hello-world.docx").getPath(); // 渲染數(shù)據(jù) XWPFTemplate template = XWPFTemplate.compile(filepath).render( new HashMap<String, Object>() {{ put("title", "Hello, poi-tl Word模板引擎"); put("text", "Hello World"); }} ); // 輸出新文檔 try { template.writeAndClose(new FileOutputStream("output.docx")); } catch (IOException e) { e.printStackTrace(); } } }
執(zhí)行上述單元測(cè)試后,新的文檔 output.docx
將會(huì)生成,并且內(nèi)容將如預(yù)期渲染。
相關(guān)概念
模板
模板是一個(gè) .docx
格式的文件,通常通過 Microsoft Word 或 WPS Office 創(chuàng)建。在模板中,我們使用占位符來標(biāo)識(shí)需要?jiǎng)討B(tài)渲染的內(nèi)容。
標(biāo)簽
Poi-tl 使用標(biāo)簽來標(biāo)識(shí)占位符,所有標(biāo)簽都以 {{
開頭,}}
結(jié)尾。標(biāo)簽可以出現(xiàn)在 Word 文檔的任何位置,包括頁眉、頁腳、表格內(nèi)部、文本框等。
數(shù)據(jù)模型
數(shù)據(jù)模型是將渲染數(shù)據(jù)傳遞給模板的方式,通常使用 Map
或 Java 對(duì)象。我們可以選擇通過哈希表或?qū)ο髞韨鬟f數(shù)據(jù)。
- 哈希表(key 為標(biāo)簽名):
Map<String, Object> data = new HashMap<>(); data.put("title", "Hello, poi-tl Word模板引擎"); data.put("text", "Hello World"); data.put("author", "god23bin"); data.put("description", "這還不關(guān)注 god23bin?再不關(guān)注我可要求你關(guān)注了!");
- Java 對(duì)象(屬性為標(biāo)簽名):
public class DataModel { private String title; private String text; private String author; private String description; // 省略 getter 和 setter } DataModel data = new DataModel(); data.setTitle("Hello, poi-tl Word模板引擎"); data.setText("Hello World"); data.setAuthor("god23bin"); data.setDescription("這還不關(guān)注 god23bin?再不關(guān)注我可要求你關(guān)注了!");
標(biāo)簽寫法
Poi-tl 支持多種標(biāo)簽類型,常見的標(biāo)簽包括文本、圖片、表格、列表等:
- 文本標(biāo)簽:
{{var}}
- 圖片標(biāo)簽:
{{@var}}
- 表格標(biāo)簽:
{{#var}}
- 列表標(biāo)簽:
{{*var}}
插件
Poi-tl 支持插件機(jī)制,插件允許我們?cè)谀0逯袌?zhí)行自定義的邏輯。例如,我們可以將 HTML 渲染插件綁定到某個(gè)標(biāo)簽上,使其支持 HTML 內(nèi)容渲染。
Configure configure = Configure.builder().bind("description", new HtmlRenderPolicy()).build();
表格行循環(huán)
如果需要在 Word 文檔中渲染多行表格數(shù)據(jù),可以使用 HackLoopTableRenderPolicy
插件來循環(huán)渲染表格的行。
@Test public void rowLoopTest() { AcWordModel data = getFromDB(); // 假設(shè)從數(shù)據(jù)庫獲取數(shù)據(jù) String filepath = this.getClass().getClassLoader().getResource("table-row-loop.docx").getPath(); Configure configure = Configure.builder() .bind("articles", new HackLoopTableRenderPolicy()) .bind("columns", new HackLoopTableRenderPolicy()) .build(); XWPFTemplate template = XWPFTemplate.compile(filepath, configure).render(data); try { template.writeAndClose(new FileOutputStream("ac-word.docx")); } catch (IOException e) { e.printStackTrace(); } }
封裝工具類
為了方便調(diào)用,我們可以封裝一個(gè)工具類來處理 Word 渲染:
public class WordUtil { public static void generateWordFile(String templatePath, String targetPath, Map<String, Object> data) { XWPFTemplate template = XWPFTemplate.compile(templatePath).render(data); try { template.writeAndClose(new FileOutputStream(targetPath)); } catch (IOException e) { e.printStackTrace(); } } }
總結(jié)
通過 Poi-tl,我們可以輕松實(shí)現(xiàn)基于模板的文檔渲染。無論是簡(jiǎn)單的文本填充,還是復(fù)雜的表格、圖表渲染,都能輕松應(yīng)對(duì)。希望這篇教程能幫助大家更好地使用 Poi-tl 進(jìn)行文檔自動(dòng)化生成!
以上就是SpringBoot集成Poi-tl實(shí)現(xiàn)動(dòng)態(tài)Word文檔生成的詳細(xì)步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Poi-tl動(dòng)態(tài)Word文檔生成的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決spring-boot-maven-plugin報(bào)紅的問題
這篇文章主要給大家介紹一下如何解決spring-boot-maven-plugin報(bào)紅的問題,文中通過圖文講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08關(guān)于Spring Boot動(dòng)態(tài)權(quán)限變更問題的實(shí)現(xiàn)方案
這篇文章主要介紹了Spring Boot動(dòng)態(tài)權(quán)限變更實(shí)現(xiàn)的整體方案使用session作為緩存,結(jié)合AOP技術(shù)進(jìn)行token認(rèn)證和權(quán)限控制,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06java在linux本地執(zhí)行shell命令的實(shí)現(xiàn)方法
本文主要介紹了java在linux本地執(zhí)行shell命令的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02SpringBoot打印Banner的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot啟動(dòng)Banner的實(shí)現(xiàn)原理和打印流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01java跳出多重循環(huán)的三種實(shí)現(xiàn)方式
文章主要介紹了Java中跳出多重循環(huán)的三種方式:使用`break`配合標(biāo)簽、在布爾表達(dá)式中添加判斷變量、以及使用`try-catch`制造異常,每種方式都有具體的代碼示例,并輸出了相應(yīng)的執(zhí)行結(jié)果2025-01-01