精华内容
下载资源
问答
  • Poi-tl

    千次阅读 2020-01-09 16:05:18
    Poi-tl导出word模板 poi-ti是什么 poi-tl是一个Word 模板引擎,基于Apache poi,目标是在文档的任何地方做任何事情。具体详情可以查看官网信息。poi-tl 项目开发中使用 为什么要使用poi-tl 原因很简单就是简单方便...

    Poi-tl导出word模板

    poi-ti是什么

    poi-tl是一个Word 模板引擎,基于Apache poi,目标是在文档的任何地方做任何事情。具体详情可以查看官网信息。poi-tl

    项目开发中使用

    1. 为什么要使用poi-tl
      原因很简单就是简单方便,避免了之前poi存在的很多兼容问题和繁琐处理逻辑
    2. 引入maven至项目(或者下载对应的jar包添加至项目的lib目录下)maven和jar包地址
    3. 快速入门
      新建文档template.docx,包含文本在word中添加并将文本中所要替换的部分改用{{title}}
    //核心API采用了极简设计,只需要一行代码
    XWPFTemplate.compile("template.docx").render(new HashMap<String, Object>(){{
            put("title", "Poi-tl 模板引擎");
    }}).writeToFile("out_template.docx");
    
    1. 下图为使用的标签在这里插入图片描述

    具体文档可以参考poi-tl的github网站 https://github.com/Sayi/poi-tl

    实例代码(页面导出word)

    页面点击下载导出word模板

    @RequestMapping(value = "/exportWordFile", method = RequestMethod.GET)
        public void exportWordFile(HttpServletRequest request,HttpServletResponse response, String queryDate) {
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("ppdm", "关于北京辖区上市公司情况的谈参");
            data.put("ppdmContain", "20191219");
            data.put("pubCompCnt", "19");
            data.put("photo", new PictureRenderData(1000, 1200, "D:/usr/test.jpg"));// 本地图片
            File file = null;
            InputStream in = null;
            ServletOutputStream out = null;
                String wordName = "test.docx";
                String projectPath = request.getSession().getServletContext().getRealPath("/");
                String exportFilePath = projectPath+ "WEB-INF/ExcelModel/";
                String templateFile = exportFilePath+wordName;
                logger.info("----------templateFile:{}", templateFile);
                // Configure对象是处理表格数据,可以自适应生成对应行数数据
    //            Configure config = Configure.newBuilder().build();
                // XWPFTemplate对象是处理word文档对象,根据map数据源的键值对渲染文档数据
                XWPFTemplate template = XWPFTemplate.compile(templateFile).render(data);
                // 文件生成到本地,先生成好文档,再读取到内存中响应给前台
                String downloadFileName = "公司治理专项自查统计报告_" +  queryDate+ ".docx";
                try {
                    FileOutputStream outFile = new FileOutputStream(exportFilePath + downloadFileName);
                    template.write(outFile);
                    outFile.flush();
                    outFile.close();
                    template.close();
                } catch (Exception e) {
                    logger.error("替换文件失败-关闭流失败!", e);
                }
                // 通过文件流读取到文件,再将文件通过response的输出流,返回给页面下载
                file = new File(exportFilePath + downloadFileName);
                try {
                    in = new FileInputStream(file);
                    response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
                    response.setContentType("application/msword");
                    response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(downloadFileName, StandardCharsets.UTF_8.toString()))));
                    out = response.getOutputStream();
                    byte[] buffer = new byte[512];
                    int bytesToRead = -1;
                    // 用响应对象response中的输出流读取生成好的文件
                    while ((bytesToRead = in.read(buffer)) != -1) {
                        out.write(buffer, 0, bytesToRead);
                    }
    //                Files.copy(Paths.get(file.getPath()),out);
                } catch (Exception e) {
                    logger.error("读取替换后文件失败!", e);
                }finally {
                    if (in != null) try {
                        in.close();
                        if (out != null) out.close();
                        if (file != null) file.delete(); // 删除临时文件
                    } catch (IOException e) {
                        logger.error("删除临时文件出错", e);
                    }
                }
        }
    

    实例代码中的word模板已上传,仅供参考!其中模板位置可以根据自己项目制定存放。

    展开全文
  • poi-tl

    2019-04-01 19:36:34
    https://github.com/Sayi/poi-tl https://blog.51cto.com/11822658/1796123
    展开全文
  • poi-tl-1.3.1

    2018-10-17 15:53:35
    poi-tl(poi template language)是基于Apache POI的Word模板引擎。纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。完整的中文文档参见 http://deepoove.com/poi-tl
  • poi-tl-1.8.2.jar

    2020-12-23 16:42:12
    为了更方便大家下载poi-tl-1.8.2.jar的Jar包
  • poi-tl-1.7.2.jar

    2020-04-23 00:25:32
    java导出word,使用最新版poi-tl-1.7.2jar。
  • poi-tl模板文件

    2021-02-08 16:21:54
    poi-tl模板文件
  • poi-tl-1.2.0.jar

    2018-08-02 11:54:49
    poi-tl-1.2.0.jar
  • poi tl 判断空值_poi-tl

    2021-01-12 04:58:28
    poi-tl(poi-template-language) Word 模板引擎,基于Apache POI - the Java API for Microsoft Documents。What is poi-tlFreeMarker、Velocity基于文本模板和数据生成新的HTML页面、配置文件等,poi-tl是Word模板...

    poi-tl(poi-template-language)

    Word 模板引擎,基于Apache POI - the Java API for Microsoft Documents。

    What is poi-tl

    FreeMarker、Velocity基于文本模板和数据生成新的HTML页面、配置文件等,poi-tl是Word模板引擎,基于Microsoft Word模板和数据生成新的文档。

    Word模板拥有丰富的样式,poi-tl在生成的文档中会完美保留模板中的样式,还可以为标签设置样式,标签的样式会被应用到替换后的文本上,因此你可以专注于模板设计。

    poi-tl是一种 "logic-less" 模板引擎,没有复杂的控制结构和变量赋值,只有标签,一些标签可以被替换为文本、图片、表格等,一些标签会隐藏某些文档内容,而另一些标签则会将一系列文档内容循环渲染。

    "Powerful" constructs like variable assignment or conditional statements make it easy to modify the look of an application within the template system exclusively... however, at the cost of separation, turning the templates themselves into part of the application logic.

    poi-tl支持自定义渲染函数(插件),函数可以在Word模板的任何位置执行,在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。

    Maven

    com.deepoovegroupId>

    poi-tlartifactId>

    1.8.2version>

    dependency>

    2分钟快速入门

    从一个超级简单的例子开始:把{{title}}替换成"poi-tl 模板引擎"。

    新建文档模板template.docx,包含标签{{title}}

    TDO模式:Template + data-model = output

    //核心API采用了极简设计,只需要一行代码

    XWPFTemplate.compile("template.docx").render(new HashMap(){{

    put("title", "poi-tl 模板引擎");

    }}).writeToFile("out_template.docx");

    打开out_template.docx文档吧,一切如你所愿。

    标签

    标签由前后两个大括号组成,{{title}}是标签,{{?title}}也是标签,title是这个标签的名称,?标识了标签类型,接下来我们来看看有哪些标签类型。

    文本

    文本标签是Word模板中最基本的标签类型,{{name}}会被数据模型中key为name的值替换,如果找不到默认会清空标签,可以配置是保留还是抛出异常。

    文本标签的样式会应用到替换后的文本上,正如下面的例子所示。

    数据:

    {

    "name": "Mama",

    "thing": "chocolates"

    }

    Word模板:

    {{name}} always said life was like a box of {{thing}}.

    {{name}} always said life was like a box of {{thing}}.

    输出:

    Mama always said life was like a box of chocolates.

    Mama always said life was like a box of chocolates.

    图片

    图片标签以@开始,如{{@logo}}会在数据中寻找key为logo的值,然后将标签替换成图片。由于Word文档中图片不是由字符串表示(在文本型模板中,比如HTML网页图片是由字符串表示),所以图片标签对应的数据有一定的结构要求,这些结构都会有相应的Java类对应。

    数据:

    {

    "watermelon": {

    "path": "assets/watermelon.png"

    },

    "lemon": {

    "path": "http://xxx/lemon.png"

    },

    "banana": {

    "path": "sob.png",

    "width": 24,

    "height": 24

    }

    }

    Word模板:

    Fruit Logo:

    watermelon {{@watermelon}}

    lemon {{@lemon}}

    banana {{@banana}}

    输出:

    Fruit Logo:

    watermelon 🍉

    lemon 🍋

    banana 🍌

    表格

    表格标签以#开始,如{{#table}},它会被渲染成N行N列的Word表格,N的值取决于table标签的值。

    数据:

    {

    "song": {

    "rows": [

    {

    "cells": [

    {"cellText": {"text": "Song name"}},

    {"cellText": {"text": "artist"}}

    ]

    }

    ],

    "rows": [

    {

    "cells": [

    {"cellText": {"text": "Memories"}},

    {"cellText": {"text": "Maroon 5"}}

    ],

    "rowStyle":{

    "backgroundColor":"f6f8fa"

    }

    }

    ]

    }

    }

    Word模板:

    {{#song}}

    输出:

    Song nameArtist

    MemoriesMaroon 5

    列表

    列表标签对应Word的符号列表或者编号列表,以*开始,如{{*number}}。

    数据:

    {

    "feature": {

    "numFmt": {

    "decimal": "%1)"

    },

    "numbers": [

    {

    "text": "Plug-in function, define your own function"

    },

    {

    "text": "Supports text, pictures, table, list, if, foreach..."

    },

    {

    "text": "Templates, not just templates, but also style templates"

    }

    ]

    }

    }

    Word模板:

    {{*feature}}

    输出:

    1) Plug-in function, define your own function

    2) Supports text, pictures, table, list, if, foreach...

    3) Templates, not just templates, but also style templates

    区块对

    区块对由前后两个标签组成,开始标签以?标识,结束标签以/标识,如{{?sections}}作为sections区块的起始标签,{{/sections}}为结束标签,sections是这个区块对的名称。

    区块对在处理一系列文档元素的时候非常有用,位于区块对中的文档元素(文本、图片、表格等)可以被渲染零次,一次或N次,这取决于区块对的取值。

    False或空集合

    如果区块对的值是null、false或者空的集合,位于区块中的所有文档元素将不会显示,类似于if语句的条件为false。

    数据:

    {

    "announce": false

    }

    Word模板:

    Made it,Ma!{{?announce}}Top of the world!{{/announce}}

    Made it,Ma!

    {{?announce}}

    Top of the world!🎋

    {{/announce}}

    输出:

    Made it,Ma!

    Made it,Ma!

    非False且不是集合

    如果区块对的值不为null、false,且不是集合,位于区块中的所有文档元素会被渲染一次,if语句的条件为true。

    数据:

    {

    "person": { "name": "Sayi" }

    }

    Word模板:

    {{?person}}

    Hi {{name}}!

    {{/person}}

    输出:

    Hi Sayi!

    非空集合

    如果区块对的值是一个非空集合,区块中的文档元素会被迭代渲染一次或者N次,这取决于集合的大小,类似于foreach语法。

    数据:

    {

    "songs": [

    { "name": "Memories" },

    { "name": "Sugar" },

    { "name": "Last Dance(伍佰)" }

    ]

    }

    Word模板:

    {{?songs}}

    {{name}}

    {{/songs}}

    输出:

    Memories

    Sugar

    Last Dance(伍佰)

    在循环中可以通过一个特殊的标签{{=#this}}直接引用当前迭代的对象。

    数据:

    {

    "produces": [

    "application/json",

    "application/xml"

    ]

    }

    Word模板:

    {{?produces}}

    {{=#this}}

    {{/produces}}

    输出:

    application/json

    application/xml

    嵌套

    嵌套是在Word模板中引入另一个Word模板,可以理解为import、include或者word文档合并,以+标识,如{{+nested}}。

    数据:

    {

    "nested": {

    "file": "template/sub.docx",

    "dataModels": [

    {

    "addr": "Hangzhou,China"

    },

    {

    "addr": "Shanghai,China"

    }

    ]

    }

    }

    给定两个WordWord模板:

    main.docx:

    Hello, World

    {{+nested}}

    template/sub.docx:

    Address: {{addr}}

    输出:

    Hello, World

    Address: Hangzhou,China

    Address: Shanghai,China

    详细文档与示例

    更多的示例以及所有示例的源码参见JUnit单元测试。

    Contributing贡献

    你可以有很多途径加入这个项目,不限于以下方式:

    反馈使用中遇到的问题

    分享成功的喜悦

    更新和完善文档

    解决和讨论Issue

    建议和完善

    参见常见问题,欢迎在GitHub Issue中提问和交流。

    社区交流讨论群:Gitter频道

    展开全文
  • poi-tl(poi-template-language) Word 模板引擎,基于Apache POI - the Java API for Microsoft Documents。 What is poi-tl FreeMarker、Velocity基于文本模板和数据生成新的HTML页面、配置文件等,poi-tl是Word...
  • poi-tl 支持Android

    2020-11-29 00:19:41
    这样可以让用户更简单的集成 poi-tl。 下面是让 Android 支持poi-tl 的操作: <p><a href="https://www.jianshu.com/p/60bfb892d42e">Android 平台使用 poi-tl 填充生成 world 文件</a></p> 这是我自己做的...
  • 参考https://gitee.com/xuwangcheng/poi-tl-html-to-word,利用poi-tl将前端富文本生成的HTML内容转换为可插入word的内容。利用poi-tl将前端富文本生成的HTML内容转换为可插入word的内容。
  • poi-tl相关的请参考:http://deepoove.com/poi-tl/ 相关思路是先通过Jsoup将富文本Html迭代循环,在特定的方法里处理每一个标签,目前支持处理的标签包括img,table,sup,以及类似span,h等文本标签,其他的标签处理...
  • POI-TL 使用总结

    万次阅读 2019-02-24 22:08:21
    poi-tl官网:http://deepoove.com/poi-tl/ 流程概述: XWPFTemplate template = XWPFTemplate.compile("~/template.docx").render(new HashMap&lt;String, Object&gt;(){{ put("title&...

    poi-tl官网:http://deepoove.com/poi-tl/

    流程概述:

    XWPFTemplate template = XWPFTemplate.compile("~/template.docx").render(new HashMap<String, Object>(){{  
            put("title", "Poi-tl 模板引擎");
    }});
    FileOutputStream out = new FileOutputStream("out_template.docx");
    template.write(out); 
    out.flush();
    out.close();
    template.close();
      编译模板
      渲染数据
      输出到流

    TDO模式:Template + data-model = output

    基础标签:

    文本模板{{var}}

    TextRenderData 的结构体

    {
      "text": "Sayi",
      "style": {
        "strike": false, //	删除线
        "bold": true, //粗体
        "italic": false, //斜体
        "color": "00FF00", //颜色
        "underLine": false, //下划线
        "fontFamily": "微软雅黑", //字体
        "fontSize": 12 //字号
      }
    }

    tip: 输出文本的样式,既可以用代码设定,也可以直接在word文档中直接对{{var}}标签设置样式;

    图片模板{{@var}}

    指定图片长宽 和传入图片路径

    /**
         * @param width 宽度
         * @param height 高度
         * @param path  本地图片路径
         */
        public PictureRenderData(int width, int height, String path) {
            this.width = width;
            this.height = height;
            this.path = path;
        }

        /**
         * @param width 宽度
         * @param height 高度
         * @param path 标识图片后缀,如.png、.jpg等
         * @param data 图片byte[]数据,可以通过工具类{@link BytePictureUtils}生成
         */
        public PictureRenderData(int width, int height, String path, byte[] data) {
            this.width = width;
            this.height = height;
            this.path = path;
            this.data = data;
        }

     

    表格模板{{#var}}

    Style、TableStyle:样式设置;

    TextRenderData:创建单元格数据并设置样式

    RowRenderData:创建行数据;

    MiniTableRenderData:可以满足创建基本的表格;

    {
      "datas": [ 
        {
          "rowData": [TextRenderData],
          "style": {
            "align": "center",
            "backgroundColor": "ff9800"
        }
        }
      ],
      "headers": { 
        "rowData": [TextRenderData],
        "style": { 
          "align": "center",
          "backgroundColor": "ff9800"
        }
      },
      "noDatadesc": "No Data Desc", 
      "style": { 
          "align": "center"
        }
      "width": 14.65 
    }

     TableTools:

     /**
         * 合并行单元格
         * 
         * @param table
         *            表格对象
         * @param row
         *            行 从0开始
         * @param fromCol
         *            起始列
         * @param toCol
         *            结束列
         */
        public static void mergeCellsHorizonal(XWPFTable table, int row, int fromCol, int toCol)

        /**
         * 合并列单元格
         * 
         * @param table
         *            表格对象
         * @param col
         *            列 从0开始
         * @param fromRow
         *            起始行
         * @param toRow
         *            结束行
         */
        public static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow)       

    合并单元格的方法均需要操作XWPFTable,新增RenderPolicy策略 和 自定义模板策略 均方便于做合并单元格操作

    自定义模板策略

    /**
         * 配置文档渲染模板
         * 
         * @param prospectus
         * @param outPutUrl
         * */
        public void createConfigureBuilder(Prospectus data) {
            //组装整体数据
            ConfigureBuilder builder = Configure.newBuilder();
            builder.customPolicy("gap_table", new GapTable()); //渲染模板一
            builder.customPolicy("plan_table", new PlanTable());//渲染模板二
            data.setBuilder(builder);
        }

        GapTable、PlanTable实现DynamicTableRenderPolicy中的render(XWPFTable table, Object data)方法即可;

            新增RenderPolicy策略 :和自定义语法配合使用;

           (如果需要在嵌套模板中对表格做合并操作,感觉这种方法比较适用)

     @Override
      public void doRender(RunTemplate runTemplate, Object data, XWPFTemplate template)
          throws Exception {
    
        NiceXWPFDocument doc = template.getXWPFDocument();
        XWPFRun run = runTemplate.getRun();
        // 定义行列
        int row = 10, col = 8;
        // 插入表格
        XWPFTable table = doc.insertNewTable(run, row, col);
    
        // 定义表格宽度、边框和样式
        TableTools.widthTable(table, MiniTableRenderData.WIDTH_A4_FULL, col);
        TableTools.borderTable(table, 4);
    
        // TODO 调用XWPFTable API操作表格:data对象可以包含任意你想要的数据,包括图片文本等
        // TODO 调用MiniTableRenderPolicy.renderRow方法快速方便的渲染一行数据
        // TODO 调用TableTools类方法操作表格,比如合并单元格
        // ......
        TableTools.mergeCellsHorizonal(table, 0, 0, 7);
        TableTools.mergeCellsVertically(table, 0, 1, 9);
    
        // 清空原先模板
        clearPlaceholder(run);
      }
    }
    展开全文
  • poi-tl解析Word文档

    2016-12-21 16:08:10
    poi-tl解析Word文档,包含表格类型的也可以
  • * poi-tl引擎实现world模板内容替换(支持docx) * 依赖poi-tl,commons-lang3, poi-ooxml-schemas, poi-ooxml, poi,slf4j
  • POI-TL使用及工具类

    千次阅读 2020-04-15 16:16:15
    -- poi-tl --> <!-- http://deepoove.com/poi-tl/ --> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <ver...
  • poi-tl动态遍历

    2020-07-19 16:28:40
    最近工作需要导出word文档,选择使用了poi-tl这个word模板引擎 官网文档 Poi-tl Documentation 在使用过程中需要动态遍历一个集合数据,可以使用ListRenderPolicy这个插件,但是官方文档不知为何没有写出具体实例,...
  • Java Word模板引擎-Poi-tl

    2021-01-26 10:51:22
    本文内容从Poi-tl官方文档摘录,poi-tl是一个基于Java POI的Word模板引擎,有着非常强大的功能 此处只摘录了一些我现在需要用到的功能 文章目录一、简单示例1.准备一个模板文档 `template.docx`2.写一个测试方法二...
  • poi-tl(poi-template-language) Word模板引擎,基于Apache POI-Microsoft文档的Java API。 什么是poi-tl FreeMarker,Velocity基于文本模板和数据生成新HTML页面,配置文件等,poi-tl是Word模板引擎,基于...
  • 使用poi-tl 1.5.0-SNAPSHOT 仍然报错 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLDocumentPart。 读取说明,会升级到poi4,请问大概什么时候可以正常使用poi 4版本的poi-tl??...
  • Java 使用poi-tl下载Word

    2019-04-15 11:19:54
    poi-tl官网 poi-tl(poi template language)是基于Apache POI的Word模板引擎。纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。 引入包 compile group: 'com.deepoove', name: 'poi-tl', ...
  • 学习分享:POI-TL 导出Word复杂表格合并分享

    千次阅读 多人点赞 2021-01-11 15:39:35
    学习分享:POI-TL 导出Word合并表格 文章目录学习分享:POI-TL 导出Word合并表格关于POI-TL 导出Word的一些使用一、前期准备?二、代码演示1.数据结构2.代码示例2.1 写入表头表体的数据2.2 设置合并规则2.3 输出结果...
  • 文章目录1、技术背景2、官方网站3、引入依赖4、代码示例 1、技术背景 很多时候我们网站或者系统需要提供一些word文件,例如证明.docx或者订单.docx等文件供用户下载打印等 ...poi-tl(poi template langu
  • springboot整合poi-tl根据模板导出word

    千次阅读 2019-08-19 17:08:58
    springboot整合poi-tl根据模板导出word poi-tl中文文档:http://deepoove.com/poi-tl/ 引入所需包 <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</...
  • poi-tl的使用

    千次阅读 2020-09-17 16:03:31
    1.入门 1.添加依赖 <dependency> <...poi-tl</artifactId> <version>1.7.3</version> </dependency> 2.定义模板 3.代码 import com.deepoove.poi.XWPFTempla
  • poi-tl——Word模板引擎应用

    千次阅读 2018-12-17 20:18:49
    poi-tl(poi template language)是基于Apache POI的Word模板引擎。纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。支持DOCX格式的Word模板。 关于poi-tl的入门介绍在官网比较清晰,...
  • poi-tl实现根据模板生成合同和html转doc,doc转docx的Demo,可以直接运行,jdk1.8, poi-tl 是新的1.6版本的,
  • Java 采用Poi-Tl实现word导出示例

    千次阅读 2019-07-06 16:09:27
    官方poi-tl的教程地址 : poi-tl 准备一个word模板templete.docx,放在resource文件夹下。具体路径在代码中有体现。 模板中插入表格格式2列4行就行。 编写插件类 TableRenderPolicy.java package ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 447
精华内容 178
关键字:

poi-tl