Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 欧美色图亚洲天堂,日韩特黄特色大片免费视频,日韩欧美在线中文字幕

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          根據(jù)模板動(dòng)態(tài)生成word(三)使用poi-tl生成w

          根據(jù)模板動(dòng)態(tài)生成word(三)使用poi-tl生成word

          、前言

          1、什么是poi-tl

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

          Word模板具有豐富的樣式。Poi-tl將在生成的文檔中完美地保留模板中的樣式。也可以設(shè)置標(biāo)記的樣式。標(biāo)記的樣式將應(yīng)用于替換的文本,因此您可以專注于模板設(shè)計(jì)。

          poi-tl是一個(gè)“無邏輯”模板引擎。沒有復(fù)雜的控制結(jié)構(gòu)和變量分配,只有標(biāo)簽,有些標(biāo)簽可以用文本、圖片、表格等代替,有些標(biāo)簽會(huì)隱藏某些文檔內(nèi)容,而另一些標(biāo)簽會(huì)循環(huán)一系列文檔內(nèi)容。

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

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

          2、官方信息

          2.1 源碼倉庫

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

          2.2 中文文檔

          Poi-tl Documentation (deepoove.com)

          2.3 開源協(xié)議

          Apache License 2.0

          3、poi-tl的優(yōu)勢

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

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

          方案

          移植性

          功能性

          易用性

          Poi-tl

          Java跨平臺(tái)

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

          低代碼,準(zhǔn)備文檔模板和數(shù)據(jù)即可

          Apache POI

          Java跨平臺(tái)

          Apache項(xiàng)目,封裝了常見的文檔操作,也可以操作底層XML結(jié)構(gòu)

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

          Freemarker

          XML跨平臺(tái)

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

          不推薦,XML結(jié)構(gòu)的代碼幾乎無法維護(hù)

          OpenOffice

          部署OpenOffice,移植性較差

          -

          需要了解OpenOffice的API

          HTML瀏覽器導(dǎo)出

          依賴瀏覽器的實(shí)現(xiàn),移植性較差

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

          -

          Jacob、winlib

          Windows平臺(tái)

          -

          復(fù)雜,完全不推薦使用


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

          Word模板引擎功能

          描述

          文本

          將標(biāo)簽渲染為文本

          圖片

          將標(biāo)簽渲染為圖片

          表格

          將標(biāo)簽渲染為表格

          列表

          將標(biāo)簽渲染為列表

          圖表

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

          If Condition判斷

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

          Foreach Loop循環(huán)

          根據(jù)集合循環(huán)某些文檔內(nèi)容(包括文本、段落、圖片、表格、列表、圖表等)

          Loop表格行

          循環(huán)復(fù)制渲染表格的某一行

          Loop表格列

          循環(huán)復(fù)制渲染表格的某一列

          Loop有序列表

          支持有序列表的循環(huán),同時(shí)支持多級列表

          Highlight代碼高亮

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

          Markdown

          將Markdown渲染為word文檔

          Word批注

          完整的批注功能,創(chuàng)建批注、修改批注等

          Word附件

          Word中插入附件

          SDT內(nèi)容控件

          內(nèi)容控件內(nèi)標(biāo)簽支持

          Textbox文本框

          文本框內(nèi)標(biāo)簽支持

          圖片替換

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

          書簽、錨點(diǎn)、超鏈接

          支持設(shè)置書簽,文檔內(nèi)錨點(diǎn)和超鏈接功能

          Expression Language

          完全支持SpringEL表達(dá)式,可以擴(kuò)展更多的表達(dá)式:OGNL, MVEL…

          樣式

          模板即樣式,同時(shí)代碼也可以設(shè)置樣式

          模板嵌套

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

          合并

          Word合并Merge,也可以在指定位置進(jìn)行合并

          用戶自定義函數(shù)(插件)

          插件化設(shè)計(jì),在文檔任何位置執(zhí)行函數(shù)


          二、基本的使用配置

          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 標(biāo)簽前后綴替換

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

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

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

          2.3 加載模板

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

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

          2.4 填充數(shù)據(jù)

          poi-tl數(shù)據(jù)類似于哈希或者字典,可以是Map結(jié)構(gòu)(key是標(biāo)簽名稱):

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

          2.5 輸出文件

          poi-tl以流的方式進(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();
          PoitlIOUtils.closeQuietlyMulti(template, bos, out);

          三、各類模板標(biāo)簽替換和填充

          1 文本

          1.1 文本的標(biāo)簽如下

          {{var}}

          1.2 支持?jǐn)?shù)據(jù)類型

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

          1.3 文本數(shù)據(jù)填充方式如下

          代碼示例

          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操作符,還提供了更加優(yōu)雅的工廠 Texts 和鏈?zhǔn)秸{(diào)用的方式輕松構(gòu)建文本模型。

          鏈?zhǔn)酱a示例

          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 圖片的標(biāo)簽如下:

          圖片標(biāo)簽以@開始:{{@var}}

          2.2 支持?jǐn)?shù)據(jù)類型

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

          2.3 圖片數(shù)據(jù)填充方式如下

          // 指定圖片路徑
          put("image", "logo.png");
          // svg圖片
          put("svg", "https://img.shields.io/badge/jdk-1.6%2B-orange.svg");
          
          // 設(shè)置圖片寬高
          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í)對系統(tǒng)可能的性能影響)
          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 表格的標(biāo)簽如下:

          表格標(biāo)簽以#開始:{{#var}}

          3.2 支持?jǐn)?shù)據(jù)類型

          • TableRenderData

          3.3 表格數(shù)據(jù)填充方式如下

          1. 基礎(chǔ)表格示例
          // 一個(gè)2行2列的表格
          put("table0", Tables.of(new String[][] {
                          new String[] { "00", "01" },
                          new String[] { "10", "11" }
                      }).border(BorderStyle.DEFAULT).create());
          1. 表格樣式示例
          // 第0行居中且背景為藍(lán)色的表格
          RowRenderData row0=Rows.of("姓名", "學(xué)歷").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("沒有數(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());

          4、列表

          4.1 列表的標(biāo)簽如下:

          列表標(biāo)簽以*開始:{{*var}}

          4.2 支持?jǐn)?shù)據(jù)類型

          • List<String>
          • NumberingRenderData

          4.3 列表數(shù)據(jù)填充方式如下

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

          四、驗(yàn)證

          1、準(zhǔn)備模板

          首先我們建立一個(gè)word文件,在word文件里填充一下內(nèi)容。



          2、準(zhǔn)備測試代碼

          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()));
                  //驗(yàn)證換行的情況
                  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());
                  //添加圖片,考慮到實(shí)際生產(chǎn)環(huán)境圖片大都都從文件服務(wù)獲取,所以這里用圖片流做例子
                  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("拖欠物品", "拖欠次數(shù)", "償還期限").center().bgColor("4472C4").create();
                  Tables.TableBuilder tableBuilder=Tables.of(row0);
                  //填充表格內(nèi)容
                  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("三月內(nèi)");
                  list.add(q1);
          
                  Qiankuan q2=new Qiankuan();
                  q2.setName("一頓大黃牛");
                  q2.setCount(1);
                  q2.setQixian("半年內(nèi)");
                  list.add(q2);
          
                  Qiankuan q3=new Qiankuan();
                  q3.setName("特一特");
                  q3.setCount(3);
                  q3.setQixian("一周內(nèi)");
                  list.add(q3);
          
                  Qiankuan q4=new Qiankuan();
                  q4.setName("v我50");
                  q4.setCount(5);
                  q4.setQixian("一周內(nèi)");
                  list.add(q4);
                  return list;
              }
          
          }

          3、生成效果

          什么是poi-tl

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

          Word模板樣式豐富。Poi-tl將在生成的文檔中完美地保留模板中的樣式。您還可以設(shè)置標(biāo)簽的樣式。標(biāo)簽的樣式將應(yīng)用于替換的文本,因此您可以專注于模板設(shè)計(jì)。

          poi-tl是一個(gè)“無邏輯”的模板引擎。沒有復(fù)雜的控制結(jié)構(gòu)和變量賦值,只有標(biāo)簽,有些標(biāo)簽可以用文字、圖片、表格等代替。,一些標(biāo)簽會(huì)隱藏某些文檔內(nèi)容,而另一些標(biāo)簽會(huì)循環(huán)一系列文檔內(nèi)容。

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

          2 Tags

          2.1 文本

          文本標(biāo)簽{{var}}

          2.2 圖片

          圖片標(biāo)簽以@開始:{{@var}}

          2.3 表格

          表格標(biāo)簽以#開始:{{#var}}

          2.4 列表

          列表標(biāo)簽以*開始:{{*var}}

          2.5 區(qū)塊對

          區(qū)塊對由前后兩個(gè)標(biāo)簽組成,開始標(biāo)簽以?標(biāo)識(shí),結(jié)束標(biāo)簽以/標(biāo)識(shí):{{?sections}}{{/sections}}

          2.6 動(dòng)態(tài)表格

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

          [ ] 是可替換的屬性 可以是多個(gè)。

          ava實(shí)現(xiàn)在線預(yù)覽- -之poi實(shí)現(xiàn)word、excel、ppt轉(zhuǎn)html

          簡介

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

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

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

          2.通過swfTools將pdf文件轉(zhuǎn)換成swf格式的文件;

          3.通過FlexPaper文檔組件在頁面上進(jìn)行展示。

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

          我這里介紹通過poi實(shí)現(xiàn)word、excel、ppt轉(zhuǎn)html,這樣就可以放在頁面上了。

          word轉(zhuǎn)html

          excel轉(zhuǎn)html

          ppt轉(zhuǎn)html

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

          ppt轉(zhuǎn)圖片有個(gè)缺陷,就是ppt里不是宋體的字有些可能會(huì)變成框框。

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

          要實(shí)現(xiàn)在線預(yù)覽,只需把轉(zhuǎn)換得到的html在新標(biāo)簽頁打開或者鑲嵌到某塊區(qū)域就可以展現(xiàn)了。


          主站蜘蛛池模板: 亚州日本乱码一区二区三区| 精品无人乱码一区二区三区| 国偷自产av一区二区三区| 国产成人精品一区在线| 国产成人久久一区二区三区| 北岛玲在线一区二区| 国产伦精品一区二区免费| 精品久久国产一区二区三区香蕉| 在线观看午夜亚洲一区| 人妻少妇一区二区三区| 乱子伦一区二区三区| 亚洲日韩AV一区二区三区四区| 国产精品无码亚洲一区二区三区 | 亚洲sm另类一区二区三区| 无码少妇一区二区三区芒果| 后入内射国产一区二区| 久久se精品一区二区国产| 无码人妻一区二区三区免费| 精品女同一区二区三区免费播放| 中文字幕AV一区中文字幕天堂| 精品少妇人妻AV一区二区三区| 国产精品一区二区综合| 国产视频一区二区在线播放| 亚洲一区二区三区丝袜| 久久精品无码一区二区app| 日韩电影一区二区| 日本一道一区二区免费看| 亚洲av福利无码无一区二区| 成人毛片无码一区二区| 日本一区二区在线| 日本丰满少妇一区二区三区| 日韩精品区一区二区三VR| 高清一区高清二区视频| 无码国产精成人午夜视频一区二区| 国产在线观看一区二区三区四区| 国产乱码精品一区二区三区中文| 国产一区二区三区无码免费| 久久久无码一区二区三区| 性色AV 一区二区三区| 精品亚洲AV无码一区二区三区| 熟女少妇精品一区二区|