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

Java使用poi-tl根據(jù) 模板自動生成word

 更新時間:2025年07月07日 09:58:04   作者:心之語歌  
poi-tl(poi template language)是Word模板引擎,使用模板和數(shù)據(jù)可以創(chuàng)建很棒的Word文檔,本文小編就來和大家詳細介紹一下poi-tl的具體使用吧

poi-tl 介紹

poi-tl(poi template language)是Word模板引擎,使用模板和數(shù)據(jù)創(chuàng)建很棒的Word文檔。

在文檔的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。

poi-tl 官網(wǎng)

deepoove.com/poi-tl/

橫向?qū)Ρ?/h2>
方案移植性功能性易用性
Poi-tlJava跨平臺Word模板引擎,基于Apache POI,提供更友好的API低代碼,準備文檔模板和數(shù)據(jù)即可
Apache POIJava跨平臺Apache項目,封裝了常見的文檔操作,也可以操作底層XML結(jié)構(gòu)文檔不全,這里有一個教程:deepoove.com/poi-tl/
FreemarkerXML跨平臺僅支持文本,很大的局限性不推薦,XML結(jié)構(gòu)的代碼幾乎無法維護
OpenOffice部署OpenOffice,移植性較差-需要了解OpenOffice的API
HTML瀏覽器導(dǎo)出依賴瀏覽器的實現(xiàn),移植性較差HTML不能很好的兼容Word的格式,樣式糟糕-
Jacob、winlibWindows平臺-復(fù)雜,完全不推薦使用

引入要求

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代碼來生成模板。

所有的標簽都是以{{開頭,以}}結(jié)尾,標簽可以出現(xiàn)在任何位置,包括頁眉,頁腳,表格內(nèi)部,文本框等,表格布局可以設(shè)計出很多優(yōu)秀專業(yè)的文檔,推薦使用表格布局。

poi-tl模板遵循“所見即所得”的設(shè)計,模板和標簽的樣式會被完全保留。

Data-model:數(shù)據(jù)

數(shù)據(jù)類似于哈?;蛘咦值洌梢允荕ap結(jié)構(gòu)(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ù)可以是樹結(jié)構(gòu),每級之間用點來分隔開,比如{{author.name}}標簽對應(yīng)的數(shù)據(jù)是author對象的name屬性值。

FreeMarker、Velocity文本模板中可以通過三個標簽設(shè)置圖片路徑、寬和高, 但是Word模板不是由簡單的文本表示,所以在渲染圖片、表格等元素時提供了數(shù)據(jù)模型,它們都實現(xiàn)了接口 RenderData ,比如圖片數(shù)據(jù)模型 PictureRenderData 包含圖片路徑、寬、高三個屬性。

Output:輸出

以流的方式進行輸出:

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);

標簽 數(shù)據(jù)樣式

poi-tl是一種無邏輯「logic-less」的模板引擎,沒有復(fù)雜的控制結(jié)構(gòu)和變量賦值,只有標簽。標簽由前后兩個大括號組成,{{title}}是標簽,{{?title}}也是標簽,title是這個標簽的名稱,問號標識了標簽類型,接下來我們來看看有哪些默認標簽類型(用戶可以創(chuàng)建新的標簽類型,這屬于更高級的話題)。

文本

{{var}}

數(shù)據(jù)模型:

  • String :文本
  • TextRenderData :有樣式的文本
  • HyperlinkTextRenderData :超鏈接和錨點文本
  • 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());

所見即所得,標簽的樣式會應(yīng)用到替換后的文本上,也可以通過代碼設(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ù)對應(yīng)可以調(diào)整對應(yīng)參數(shù)

  • 刪除線
  • 粗體
  • 斜體
  • 顏色
  • 下劃線
  • 字體
  • 字號
  • 背景高亮色
  • 上標或者下標
  • 間距

圖片

圖片標簽以@開始:{{@var}}

數(shù)據(jù)模型

  • String :圖片url或者本地路徑,默認使用圖片自身尺寸
  • 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ò)耗時對系統(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": "圖片不存在" 
}

圖片類型

  • 圖片路徑
  • 寬度,單位是像素
  • 高度,單位是像素
  • 當無法獲取圖片時展示的文字

表格

表格標簽以#開始:{{#var}}

數(shù)據(jù)模型:

TableRenderData

推薦使用工廠 Tables 、 Rows 和 Cells 構(gòu)建表格模型。

Example 1. 基礎(chǔ)表格示例

// 一個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èi)可以展示文本和圖片,同時也可以指定表格樣式、行樣式和單元格樣式,而且在N行N列渲染完成后可以應(yīng)用單元格合并規(guī)則 MergeCellRule ,從而實現(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)段落文本的樣式:對齊
  • 單元格樣式:垂直對齊方式,背景色
  • 行樣式:行高(單位cm)
  • 表格樣式:表格對齊、邊框樣式
  • 表格寬度(單位cm),表格的最大寬度 = 頁面寬度 - 頁邊距寬度 * 2,頁面寬度為A4(20.99 * 29.6,頁邊距為#3.18 * 2.54)的文檔最大表格寬度14.63cm。
  • 單元格合并規(guī)則,比如第0行第0列至第1行第2列單元格合并

到此這篇關(guān)于Java使用poi-tl根據(jù) 模板自動生成word的文章就介紹到這了,更多相關(guān)Java poi-tl生成word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Maven的安裝+配置本地倉庫路徑方式

    Maven的安裝+配置本地倉庫路徑方式

    這篇文章主要介紹了Maven的安裝+配置本地倉庫路徑方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 將idea中xml文件背景顏色去除的圖文教程

    將idea中xml文件背景顏色去除的圖文教程

    這篇文章主要介紹了將idea中xml文件背景顏色去除,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot3.X配置OAuth的代碼實踐

    SpringBoot3.X配置OAuth的代碼實踐

    在進行Java后端技術(shù)框架版本升級時,特別是將SpringBoot從2.X升級到3.X,發(fā)現(xiàn)對OAuth的配置有大幅變更,新版本中刪除了多個常用配置類,本文給大家介紹SpringBoot3.X配置OAuth的相關(guān)知識,感興趣的朋友一起看看吧
    2024-09-09
  • java實現(xiàn)html轉(zhuǎn)pdf方法步驟

    java實現(xiàn)html轉(zhuǎn)pdf方法步驟

    這篇文章主要給大家介紹了關(guān)于java實現(xiàn)html轉(zhuǎn)pdf方法的相關(guān)資料,要將HTML轉(zhuǎn)換成PDF,我們需要借助Java中的第三方庫,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Struts2 Result 參數(shù)詳解

    Struts2 Result 參數(shù)詳解

    這篇文章主要講解Struts2 Result的參數(shù),講的比較詳細,希望能給大家做一個參考。
    2016-06-06
  • Java中的BufferedInputStream與BufferedOutputStream使用示例

    Java中的BufferedInputStream與BufferedOutputStream使用示例

    BufferedInputStream和BufferedOutputStream分別繼承于FilterInputStream和FilterOutputStream,代表著緩沖區(qū)的輸入輸出,這里我們就來看一下Java中的BufferedInputStream與BufferedOutputStream使用示例:
    2016-06-06
  • MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)

    MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)

    這篇文章主要給大家介紹了關(guān)于MyBatis-Plus實現(xiàn)多表聯(lián)查的方法,MyBatis Plus是一款針對MyBatis框架的增強工具,它提供了很多方便的方法來實現(xiàn)多表聯(lián)查,需要的朋友可以參考下
    2023-07-07
  • Apache?Arrow?Parquet存儲與使用

    Apache?Arrow?Parquet存儲與使用

    這篇文章主要為大家介紹了Apache?Arrow?Parquet存儲與使用原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java解決計算一個字符串長度問題的實戰(zhàn)指南

    Java解決計算一個字符串長度問題的實戰(zhàn)指南

    在Java編程中,處理字符串是非常常見的任務(wù)之一,這篇文章主要介紹了如何Java解決計算一個字符串長度的問題,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-03-03
  • Servlet注解之@WebInitParam多個InitParam的使用

    Servlet注解之@WebInitParam多個InitParam的使用

    這篇文章主要介紹了Servlet注解之@WebInitParam多個InitParam的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論

辉南县| 淮滨县| 灵山县| 出国| 加查县| 罗城| 龙江县| 永安市| 南靖县| 微山县| 莒南县| 上饶市| 浮梁县| 安图县| 顺平县| 江华| 麻栗坡县| 革吉县| 揭阳市| 武城县| 康乐县| 古丈县| 融水| 南昌市| 蓝田县| 濮阳市| 深水埗区| 凤翔县| 桦甸市| 南木林县| 滨海县| 芦溪县| 保靖县| 麻江县| 和平区| 邵东县| 合阳县| 镇原县| 建阳市| 涡阳县| 区。|