Java使用poi-tl根據(jù) 模板自動生成word
poi-tl 介紹
poi-tl(poi template language)是Word模板引擎,使用模板和數(shù)據(jù)創(chuàng)建很棒的Word文檔。
在文檔的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。
poi-tl 官網
橫向對比
方案 | 移植性 | 功能性 | 易用性 |
---|---|---|---|
Poi-tl | Java跨平臺 | Word模板引擎,基于Apache POI,提供更友好的API | 低代碼,準備文檔模板和數(shù)據(jù)即可 |
Apache POI | Java跨平臺 | Apache項目,封裝了常見的文檔操作,也可以操作底層XML結構 | 文檔不全,這里有一個教程:deepoove.com/poi-tl/ |
Freemarker | XML跨平臺 | 僅支持文本,很大的局限性 | 不推薦,XML結構的代碼幾乎無法維護 |
OpenOffice | 部署OpenOffice,移植性較差 | - | 需要了解OpenOffice的API |
HTML瀏覽器導出 | 依賴瀏覽器的實現(xiàn),移植性較差 | HTML不能很好的兼容Word的格式,樣式糟糕 | - |
Jacob、winlib | Windows平臺 | - | 復雜,完全不推薦使用 |
引入要求
JDK1.8+ Apache POI5.2.2+ 所需倉庫maven jar包
<dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.2</version> </dependency>
使用
新建Word文檔template.docx,包含標簽 {{title}}
1.代碼使用實例
XWPFTemplate template = XWPFTemplate.compile("template.docx").render( new HashMap<String, Object>(){{ put("title", "Hi, poi-tl Word模板引擎"); }}); template.writeAndClose(new FileOutputStream("output.docx"));
- compile 編譯模板
- render 渲染數(shù)據(jù)
- write 輸出到流
2.輸出 output.docx Hi, poi-tl Word模板引擎
Template:模板
模板是Docx格式的Word文檔,你可以使用Microsoft office、WPS Office、Pages等任何你喜歡的軟件制作模板,也可以使用Apache POI代碼來生成模板。
所有的標簽都是以{{開頭,以}}結尾,標簽可以出現(xiàn)在任何位置,包括頁眉,頁腳,表格內部,文本框等,表格布局可以設計出很多優(yōu)秀專業(yè)的文檔,推薦使用表格布局。
poi-tl模板遵循“所見即所得”的設計,模板和標簽的樣式會被完全保留。
Data-model:數(shù)據(jù)
數(shù)據(jù)類似于哈?;蛘咦值洌梢允荕ap結構(key是標簽名稱):
Map<String, Object> data = new HashMap<>(); data.put("name", "Sayi"); data.put("start_time", "2019-08-04");
可以是對象(屬性名是標簽名稱):
public class Data { private String name; private String startTime; private Author author; }
數(shù)據(jù)可以是樹結構,每級之間用點來分隔開,比如{{author.name}}標簽對應的數(shù)據(jù)是author對象的name屬性值。
FreeMarker、Velocity文本模板中可以通過三個標簽設置圖片路徑、寬和高, 但是Word模板不是由簡單的文本表示,所以在渲染圖片、表格等元素時提供了數(shù)據(jù)模型,它們都實現(xiàn)了接口 RenderData ,比如圖片數(shù)據(jù)模型 PictureRenderData 包含圖片路徑、寬、高三個屬性。
Output:輸出
以流的方式進行輸出:
template.write(OutputStream stream);
比如文件流:
template.write(new FileOutputStream("output.docx"));
比如網絡流:
response.setContentType("application/octet-stream"); response.setHeader("Content-disposition","attachment;filename=\""+"out_template.docx"+"\""); // HttpServletResponse response OutputStream out = response.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(out); template.write(bos); bos.flush(); out.flush();
最后不要忘記關閉這些流。
PoitlIOUtils.closeQuietlyMulti(template, bos, out);
標簽 數(shù)據(jù)樣式
poi-tl是一種無邏輯「logic-less」的模板引擎,沒有復雜的控制結構和變量賦值,只有標簽。標簽由前后兩個大括號組成,{{title}}是標簽,{{?title}}也是標簽,title是這個標簽的名稱,問號標識了標簽類型,接下來我們來看看有哪些默認標簽類型(用戶可以創(chuàng)建新的標簽類型,這屬于更高級的話題)。
文本
{{var}}
數(shù)據(jù)模型:
- String :文本
- TextRenderData :有樣式的文本
- HyperlinkTextRenderData :超鏈接和錨點文本
- Object :調用 toString() 方法轉化為文本
推薦使用工廠 Texts 構建文本模型
put("name", "Sayi"); put("author", Texts.of("Sayi").color("000000").create()); put("link", Texts.of("website").link("http://deepoove.com").create()); put("anchor", Texts.of("anchortxt").anchor("appendix1").create());
所見即所得,標簽的樣式會應用到替換后的文本上,也可以通過代碼設定文本的樣式。
TextRenderData的結構體
{ "text": "Sayi", "style": { "strike": false, "bold": true, "italic": false, "color": "00FF00", "underLine": false, "fontFamily": "微軟雅黑", "fontSize": 12, "highlightColor": "green", "vertAlign": "superscript", "characterSpacing" : 20 } }
以下屬性與上面數(shù)據(jù)對應可以調整對應參數(shù)
- 刪除線
- 粗體
- 斜體
- 顏色
- 下劃線
- 字體
- 字號
- 背景高亮色
- 上標或者下標
- 間距
圖片
圖片標簽以@開始:{{@var}}
數(shù)據(jù)模型
- String :圖片url或者本地路徑,默認使用圖片自身尺寸
- ByteArrayPictureRenderData
- FilePictureRenderData
- UrlPictureRenderData
推薦使用工廠 Pictures 構建圖片模型
// 指定圖片路徑 put("image", "logo.png"); // svg圖片 put("svg", "https://img.shields.io/badge/jdk-1.6%2B-orange.svg"); // 圖片文件 put("image1", Pictures.ofLocal("logo.png").size(120, 120).create()); // 圖片流 put("streamImg", Pictures.ofStream(new FileInputStream("logo.jpeg"), PictureType.JPEG) .size(100, 120).create()); // 網絡圖片(注意網絡耗時對系統(tǒng)可能的性能影響) put("urlImg", Pictures.ofUrl("http://deepoove.com/images/icecream.png") .size(100, 100).create()); // java圖片,我們可以利用Java生成圖表插入到word文檔中 put("buffered", Pictures.ofBufferedImage(bufferImage, PictureType.PNG) .size(100, 100).create());
FilePictureRenderData的結構體
{ "pictureType" : "PNG", "path": "logo.png", "pictureStyle": { "width": 100, "height": 100 }, "altMeta": "圖片不存在" }
圖片類型
- 圖片路徑
- 寬度,單位是像素
- 高度,單位是像素
- 當無法獲取圖片時展示的文字
表格
表格標簽以#開始:{{#var}}
數(shù)據(jù)模型:
TableRenderData
推薦使用工廠 Tables 、 Rows 和 Cells 構建表格模型。
Example 1. 基礎表格示例
// 一個2行2列的表格 put("table0", Tables.of(new String[][] { new String[] { "00", "01" }, new String[] { "10", "11" } }).border(BorderStyle.DEFAULT).create());
Example 2. 表格樣式示例
// 第0行居中且背景為藍色的表格 RowRenderData row0 = Rows.of("姓名", "學歷").textColor("FFFFFF") .bgColor("4472C4").center().create(); RowRenderData row1 = Rows.create("李四", "博士"); put("table1", Tables.create(row0, row1));
Example 3. 表格合并示例
// 合并第1行所有單元格的表格 RowRenderData row0 = Rows.of("列0", "列1", "列2").center().bgColor("4472C4").create(); RowRenderData row1 = Rows.create("沒有數(shù)據(jù)", null, null); MergeCellRule rule = MergeCellRule.builder().map(Grid.of(1, 0), Grid.of(1, 2)).build(); put("table3", Tables.of(row0, row1).mergeRule(rule).create());
TableRenderData表格模型在單元格內可以展示文本和圖片,同時也可以指定表格樣式、行樣式和單元格樣式,而且在N行N列渲染完成后可以應用單元格合并規(guī)則 MergeCellRule ,從而實現(xiàn)更復雜的表格。
TableRenderData的結構體
{ "rows": [ { "cells": [ { "paragraphs": [ { "contents": [ { [TextRenderData] }, { [PictureRenderData] } ], "paragraphStyle": null } ], "cellStyle": { "backgroundColor": "00000", "vertAlign": "CENTER" } } ], "rowStyle": { "height": 2.0f } } ], "tableStyle": { "width": 14.63f, "colWidths": null }, "mergeRule": { "mapping": { "0-0": "1-2" } } }
行數(shù)據(jù)
- 單元格數(shù)據(jù)
- 單元格內段落
- 單元格內文本
- 單元格內圖片
- 單元格內段落文本的樣式:對齊
- 單元格樣式:垂直對齊方式,背景色
- 行樣式:行高(單位cm)
- 表格樣式:表格對齊、邊框樣式
- 表格寬度(單位cm),表格的最大寬度 = 頁面寬度 - 頁邊距寬度 * 2,頁面寬度為A4(20.99 * 29.6,頁邊距為#3.18 * 2.54)的文檔最大表格寬度14.63cm。
- 單元格合并規(guī)則,比如第0行第0列至第1行第2列單元格合并
到此這篇關于Java使用poi-tl根據(jù) 模板自動生成word的文章就介紹到這了,更多相關Java poi-tl生成word內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解析Mybatis SqlSessionFactory初始化原理
本文主要介紹了Mybatis SqlSessionFactory初始化原理,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07劍指Offer之Java算法習題精講數(shù)組與列表的查找及字符串轉換
跟著思路走,之后從簡單題入手,反復去看,做過之后可能會忘記,之后再做一次,記不住就反復做,反復尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質的變化2022-03-03創(chuàng)建Jersey REST 服務,基于Maven的實現(xiàn)
下面小編就為大家?guī)硪黄獎?chuàng)建Jersey REST 服務,基于Maven的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06SpringBoot整合Web之CORS支持與配置類和 XML配置及注冊攔截器
這篇文章主要介紹了SpringBoot整合Web開發(fā)中CORS支持與配置類和 XML配置及注冊攔截器的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08詳解Java中IO字節(jié)流基本操作(復制文件)并測試性能
這篇文章主要介紹了Java中IO字節(jié)流基本操作(復制文件)并測試性能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04Java線程創(chuàng)建(賣票),線程同步(賣包子)的實現(xiàn)示例
這篇文章主要介紹了Java線程創(chuàng)建(賣票),線程同步(賣包子)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05Java Web開發(fā)中過濾器和監(jiān)聽器使用詳解
這篇文章主要為大家詳細介紹了Java中的過濾器Filter和監(jiān)聽器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細,需要的可以參考一下2022-10-10解決persistence.xml配置文件修改存放路徑的問題
這篇文章主要介紹了解決persistence.xml配置文件修改存放路徑的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02