整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          根據模板動態生成word(三)使用poi-tl生成w

          根據模板動態生成word(三)使用poi-tl生成word

          、前言

          1、什么是poi-tl

          poi-tl是一個基于Apache POI的Word模板引擎,也是一個免費開源的Java類庫。同類型的FreeMarker或Velocity基于文本模板和數據生成新的html頁面或配置文件。而poi tl是一個基于Word模板和數據生成新文檔的Word模板引擎。

          Word模板具有豐富的樣式。Poi-tl將在生成的文檔中完美地保留模板中的樣式。也可以設置標記的樣式。標記的樣式將應用于替換的文本,因此您可以專注于模板設計。

          poi-tl是一個“無邏輯”模板引擎。沒有復雜的控制結構和變量分配,只有標簽,有些標簽可以用文本、圖片、表格等代替,有些標簽會隱藏某些文檔內容,而另一些標簽會循環一系列文檔內容。

          像變量賦值或條件語句這樣的“強大”構造可以很容易地在模板系統中專門修改應用程序的外觀。。。然而,以分離為代價,將模板本身變成應用程序邏輯的一部分。

          poi-tl支持自定義函數(插件),函數可以在Word模板的任何地方執行,在文檔的任何地方做任何事情都是poi-tl的目標。

          2、官方信息

          2.1 源碼倉庫

          GitHub - Sayi/poi-tl: Generate awesome word(docx) with template

          2.2 中文文檔

          Poi-tl Documentation (deepoove.com)

          2.3 開源協議

          Apache License 2.0

          3、poi-tl的優勢

          3.1 poi-tl和其他模板引擎的對比

          下面表格是官方文檔中提供的與其他模板引擎的對比

          方案

          移植性

          功能性

          易用性

          Poi-tl

          Java跨平臺

          Word模板引擎,基于Apache POI,提供更友好的API

          低代碼,準備文檔模板和數據即可

          Apache POI

          Java跨平臺

          Apache項目,封裝了常見的文檔操作,也可以操作底層XML結構

          文檔不全,這里有一個教程:Apache POI Word快速入門

          Freemarker

          XML跨平臺

          僅支持文本,很大的局限性

          不推薦,XML結構的代碼幾乎無法維護

          OpenOffice

          部署OpenOffice,移植性較差

          -

          需要了解OpenOffice的API

          HTML瀏覽器導出

          依賴瀏覽器的實現,移植性較差

          HTML不能很好的兼容Word的格式,樣式糟糕

          -

          Jacob、winlib

          Windows平臺

          -

          復雜,完全不推薦使用


          3.2 poi-tl Word模板引擎支持的功能

          Word模板引擎功能

          描述

          文本

          將標簽渲染為文本

          圖片

          將標簽渲染為圖片

          表格

          將標簽渲染為表格

          列表

          將標簽渲染為列表

          圖表

          條形圖(3D條形圖)、柱形圖(3D柱形圖)、面積圖(3D面積圖)、折線圖(3D折線圖)、雷達圖、餅圖(3D餅圖)、散點圖等圖表渲染

          If Condition判斷

          根據條件隱藏或者顯示某些文檔內容(包括文本、段落、圖片、表格、列表、圖表等)

          Foreach Loop循環

          根據集合循環某些文檔內容(包括文本、段落、圖片、表格、列表、圖表等)

          Loop表格行

          循環復制渲染表格的某一行

          Loop表格列

          循環復制渲染表格的某一列

          Loop有序列表

          支持有序列表的循環,同時支持多級列表

          Highlight代碼高亮

          word中代碼塊高亮展示,支持26種語言和上百種著色樣式

          Markdown

          將Markdown渲染為word文檔

          Word批注

          完整的批注功能,創建批注、修改批注等

          Word附件

          Word中插入附件

          SDT內容控件

          內容控件內標簽支持

          Textbox文本框

          文本框內標簽支持

          圖片替換

          將原有圖片替換成另一張圖片

          書簽、錨點、超鏈接

          支持設置書簽,文檔內錨點和超鏈接功能

          Expression Language

          完全支持SpringEL表達式,可以擴展更多的表達式:OGNL, MVEL…

          樣式

          模板即樣式,同時代碼也可以設置樣式

          模板嵌套

          模板包含子模板,子模板再包含子模板

          合并

          Word合并Merge,也可以在指定位置進行合并

          用戶自定義函數(插件)

          插件化設計,在文檔任何位置執行函數


          二、基本的使用配置

          1、引入依賴

          1.1 Maven

          <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.12.1</version>
          </dependency>

          1.2 Gradle

          implementation 'com.deepoove:poi-tl:1.12.1'

          2、配置

          2.1 新建配置

          ConfigureBuilder builder=Configure.builder();

          2.2 標簽前后綴替換

          poi-tl所有的標簽都是以{{開頭,以}}結尾,這是為了致敬Google CTemplate。標簽可以出現在任何位置,包括頁眉,頁腳,表格內部,文本框等,表格布局可以設計出很多優秀專業的文檔,推薦使用表格布局。

          當然如果你更偏愛freemarker ${} 的方式,也可以添加如下配置修改標簽的前后綴配置:

          builder.buildGramer("${", "}");

          2.3 加載模板

          XWPFTemplate template=XWPFTemplate.compile("template.docx", builder.buid());

          poi-tl加載使用XWPFTemplate.compile方法來加載模板,支持模板以絕對路徑(String),File、InputStream、XWPFDocument四種格式傳入。

          2.4 填充數據

          poi-tl數據類似于哈希或者字典,可以是Map結構(key是標簽名稱):

          Map<String, Object> data=new HashMap<>();
          data.put("name", "Sayi");
          data.put("start_time", "2019-08-04");
          template.render(dataMap);

          2.5 輸出文件

          poi-tl以流的方式進行輸出:

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

          三、各類模板標簽替換和填充

          1 文本

          1.1 文本的標簽如下

          {{var}}

          1.2 支持數據類型

          • String :文本
          • TextRenderData :有樣式的文本
          • HyperlinkTextRenderData :超鏈接和錨點文本
          • Object :調用 toString() 方法轉化為文本

          1.3 文本數據填充方式如下

          代碼示例

          put("name", "Sayi");
          put("author", new TextRenderData("000000", "Sayi"));
          put("link", new HyperlinkTextRenderData("website", "http://deepoove.com"));
          put("anchor", new HyperlinkTextRenderData("anchortxt", "anchor:appendix1"));

          除了new操作符,還提供了更加優雅的工廠 Texts 和鏈式調用的方式輕松構建文本模型。

          鏈式代碼示例

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

          2 圖片

          2.1 圖片的標簽如下:

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

          2.2 支持數據類型

          • String :圖片url或者本地路徑,默認使用圖片自身尺寸
          • PictureRenderData
          • ByteArrayPictureRenderData
          • FilePictureRenderData
          • UrlPictureRenderData

          2.3 圖片數據填充方式如下

          // 指定圖片路徑
          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());
          
          // 網絡圖片(注意網絡耗時對系統可能的性能影響)
          put("urlImg", Pictures.ofUrl("http://deepoove.com/images/icecream.png")
            .size(100, 100).create());
          
          // java圖片
          put("buffered", Pictures.ofBufferedImage(bufferImage, PictureType.PNG)
            .size(100, 100).create());

          3 表格

          3.1 表格的標簽如下:

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

          3.2 支持數據類型

          • TableRenderData

          3.3 表格數據填充方式如下

          1. 基礎表格示例
          // 一個2行2列的表格
          put("table0", Tables.of(new String[][] {
                          new String[] { "00", "01" },
                          new String[] { "10", "11" }
                      }).border(BorderStyle.DEFAULT).create());
          1. 表格樣式示例
          // 第0行居中且背景為藍色的表格
          RowRenderData row0=Rows.of("姓名", "學歷").textColor("FFFFFF")
                .bgColor("4472C4").center().create();
          RowRenderData row1=Rows.create("李四", "博士");
          put("table1", Tables.create(row0, row1));
          1. 表格合并示例
          // 合并第1行所有單元格的表格
          RowRenderData row0=Rows.of("列0", "列1", "列2").center().bgColor("4472C4").create();
          RowRenderData row1=Rows.create("沒有數據", 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());

          4、列表

          4.1 列表的標簽如下:

          列表標簽以*開始:{{*var}}

          4.2 支持數據類型

          • List<String>
          • NumberingRenderData

          4.3 列表數據填充方式如下

          put("list", Numberings.create("Plug-in grammar",
                              "Supports word text, pictures, table...",
                              "Not just templates"));

          四、驗證

          1、準備模板

          首先我們建立一個word文件,在word文件里填充一下內容。



          2、準備測試代碼

          import com.deepoove.poi.XWPFTemplate;
          import com.deepoove.poi.config.Configure;
          import com.deepoove.poi.config.ConfigureBuilder;
          import com.deepoove.poi.data.*;
          import dto.Qiankuan;
          import java.io.FileInputStream;
          import java.io.IOException;
          import java.nio.file.Files;
          import java.nio.file.Paths;
          import java.time.LocalDate;
          import java.util.*;
          
          public class PoitlTest {
          
              public static void main(String[] args) throws IOException {
                  ConfigureBuilder builder=Configure.builder();
                  //獲取模板的文件流
                  FileInputStream fileInputStream=new FileInputStream("D:\\文章\\word生成\\poi-tl\\qiantiao.docx");
          
                  HashMap<String, Object> dataMap=new HashMap<>();
                  //添加文本
                  LocalDate currentDate=LocalDate.now();
                  LocalDate endDate=currentDate.plusYears(1L);
                  dataMap.put("debtor", "陳有楚");
                  dataMap.put("nowYear", String.valueOf(currentDate.getYear()));
                  dataMap.put("nowMonth", String.valueOf(currentDate.getMonthValue()));
                  dataMap.put("nowDay", String.valueOf(currentDate.getDayOfMonth()));
                  //驗證換行的情況
                  dataMap.put("arrears", "\n一頓老魏,\n貴州大黃牛,\nv我50");
                  dataMap.put("endYear", String.valueOf(endDate.getYear()));
                  dataMap.put("endMonth", String.valueOf(endDate.getMonthValue()));
                  dataMap.put("endDay", String.valueOf(endDate.getDayOfMonth()));
                  //添加列表
                  List<String> list=Arrays.asList("阿大", "阿二", "阿三");
                  Numberings.NumberingBuilder numberingBuilder=Numberings.of(NumberingFormat.DECIMAL);
                  for (String s : list) {
                      numberingBuilder.addItem(s);
                  }
                  dataMap.put("witness", numberingBuilder.create());
                  //添加圖片,考慮到實際生產環境圖片大都都從文件服務獲取,所以這里用圖片流做例子
                  PictureRenderData pictureRenderData=Pictures.ofStream(Files.newInputStream(Paths.get("D:\\picture\\其他\\24-05-23-142418.png")), PictureType.JPEG)
                          .size(300, 220).create();
                  dataMap.put("image1", pictureRenderData);
                  List<Qiankuan> qiankuanList=getQiankuanList();
                  //添加表格
                  //填充表頭,表格的第一行
                  RowRenderData row0=Rows.of("拖欠物品", "拖欠次數", "償還期限").center().bgColor("4472C4").create();
                  Tables.TableBuilder tableBuilder=Tables.of(row0);
                  //填充表格內容
                  for (Qiankuan qiankuan : qiankuanList) {
                      RowRenderData row=Rows.create(qiankuan.getName(), String.valueOf(qiankuan.getCount()), qiankuan.getQixian());
                      tableBuilder.addRow(row);
                  }
                  //MergeCellRule rule=MergeCellRule.builder().map(MergeCellRule.Grid.of(1, 0), MergeCellRule.Grid.of(1, 2)).build();
                  //tableBuilder.mergeRule(rule);
                  dataMap.put("table1", tableBuilder.create());
          
                  ChartMultiSeriesRenderData chart=Charts
                          .ofMultiSeries("ChartTitle", new String[] { "中文", "English" })
                          .addSeries("countries", new Double[] { 15.0, 6.0 })
                          .addSeries("speakers", new Double[] { 223.0, 119.0 })
                          .create();
          
                  dataMap.put("barChart", chart);
                  XWPFTemplate template=XWPFTemplate.compile(fileInputStream, builder.build())
                          .render(dataMap);
                  template.writeAndClose(Files.newOutputStream(Paths.get("D:\\test\\qiantiao-poitl.docx")));
                  System.out.println("success");
              }
          
              static List<Qiankuan> getQiankuanList() {
                  List<Qiankuan> list=new ArrayList<>();
                  Qiankuan q1=new Qiankuan();
                  q1.setName("一頓老魏");
                  q1.setCount(1);
                  q1.setQixian("三月內");
                  list.add(q1);
          
                  Qiankuan q2=new Qiankuan();
                  q2.setName("一頓大黃牛");
                  q2.setCount(1);
                  q2.setQixian("半年內");
                  list.add(q2);
          
                  Qiankuan q3=new Qiankuan();
                  q3.setName("特一特");
                  q3.setCount(3);
                  q3.setQixian("一周內");
                  list.add(q3);
          
                  Qiankuan q4=new Qiankuan();
                  q4.setName("v我50");
                  q4.setCount(5);
                  q4.setQixian("一周內");
                  list.add(q4);
                  return list;
              }
          
          }

          3、生成效果

          什么是poi-tl

          FreeMarker或Velocity基于文本模板和數據生成新的html頁面或配置文件。poi-tl是一個基于Word模板和數據生成新文檔的Word模板引擎。

          Word模板樣式豐富。Poi-tl將在生成的文檔中完美地保留模板中的樣式。您還可以設置標簽的樣式。標簽的樣式將應用于替換的文本,因此您可以專注于模板設計。

          poi-tl是一個“無邏輯”的模板引擎。沒有復雜的控制結構和變量賦值,只有標簽,有些標簽可以用文字、圖片、表格等代替。,一些標簽會隱藏某些文檔內容,而另一些標簽會循環一系列文檔內容。

          poi-tl支持自定義函數(插件),函數可以在Word模板的任何地方執行,在文檔的任何地方做任何事情是poi-tl的目標。

          2 Tags

          2.1 文本

          文本標簽{{var}}

          2.2 圖片

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

          2.3 表格

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

          2.4 列表

          列表標簽以*開始:{{*var}}

          2.5 區塊對

          區塊對由前后兩個標簽組成,開始標簽以?標識,結束標簽以/標識:{{?sections}}{{/sections}}

          2.6 動態表格

          注意,{{}}是官方指定的格式,也可以自定義。

          [ ] 是可替換的屬性 可以是多個。

          ava實現在線預覽- -之poi實現word、excel、ppt轉html

          簡介

          java實現在線預覽功能是一個大家在工作中也許會遇到的需求,如果公司有錢,直接使用付費的第三方軟件或者云在線預覽服務就可以了,例如永中office、office web 365(http://www.officeweb365.com/)他們都有云在線預覽服務,就是要錢0.0

          如果想要免費的,可以用openoffice,還需要借助其他的工具(例如swfTools、FlexPaper等)才行,可參考這篇文章http://blog.csdn.net/z69183787/article/details/17468039,寫的挺細的,實現原理就是:

          1.通過第三方工具openoffice,將word、excel、ppt、txt等文件轉換為pdf文件;

          2.通過swfTools將pdf文件轉換成swf格式的文件;

          3.通過FlexPaper文檔組件在頁面上進行展示。

          當然如果裝了Adobe Reader XI,那把pdf直接拖到瀏覽器頁面就可以直接打開預覽,這樣就不需要步驟2、3了,前提就是客戶裝了Adobe Reader XI這個pdf閱讀器。

          我這里介紹通過poi實現word、excel、ppt轉html,這樣就可以放在頁面上了。

          word轉html

          excel轉html

          ppt轉html

          其實只是ppt轉圖片,有了圖片后放到頁面上去,點擊下一頁就一張張顯示就可以了。這里只介紹ppt轉圖片的過程。

          ppt轉圖片有個缺陷,就是ppt里不是宋體的字有些可能會變成框框。

          以上都需要引入poi的jar包。

          要實現在線預覽,只需把轉換得到的html在新標簽頁打開或者鑲嵌到某塊區域就可以展現了。


          主站蜘蛛池模板: www一区二区三区| 中文字幕乱码一区久久麻豆樱花| 国产成人亚洲综合一区| 97久久精品无码一区二区| 国产三级一区二区三区| 99精品一区二区三区| 一区二区三区无码视频免费福利| 精品免费AV一区二区三区| 国产精品一区二区久久精品涩爱| 午夜天堂一区人妻| 久久国产午夜精品一区二区三区 | 一区二区三区在线免费 | 久久久久久综合一区中文字幕| 国产在线观看精品一区二区三区91| 国产成人久久精品区一区二区 | 成人无码精品一区二区三区| 3d动漫精品啪啪一区二区中文| 久久国产一区二区三区| 亚洲日韩精品一区二区三区无码| 亚洲高清偷拍一区二区三区| 免费一区二区无码东京热| 色一情一乱一区二区三区啪啪高| 中文字幕精品亚洲无线码一区应用 | 风间由美性色一区二区三区| 精品一区二区三区色花堂| 无码精品人妻一区二区三区AV| 麻豆精品一区二区综合av| 国产成人精品视频一区| 日本一区二区三区免费高清在线| 国产女人乱人伦精品一区二区 | 亚洲第一区二区快射影院| 精品亚洲AV无码一区二区| 国产精品视频分类一区| 国产精品一区二区久久精品涩爱| 九九无码人妻一区二区三区| 日本一区午夜爱爱| 国产品无码一区二区三区在线蜜桃| 中文字幕国产一区| 亚洲无删减国产精品一区| 中文乱码字幕高清一区二区| 蜜芽亚洲av无码一区二区三区|