欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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 官網

deepoove.com/poi-tl/

橫向對比

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

引入要求

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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論