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

