当前位置: 代码网 > it编程>编程语言>Java > Java使用poi-tl库操作wold文档的方法

Java使用poi-tl库操作wold文档的方法

2025年11月26日 Java 我要评论
poi-tl是一个基于apachepoi的word模板引擎,也是一个免费开源的java类库,适用范围:在线文档生成、合同签订、信息替换方面具有很大优势、采用 标签-替换的实现策略,简单易上手、避免实际

poi-tl 是一个基于apache poi的word模板引擎,也是一个免费开源的java类库,

适用范围:

在线文档生成、合同签订、信息替换方面具有很大优势、采用 标签-替换的实现策略,简单易上手、避免实际业务中的重复开发. 业务与设计解藕.

开始操作

引入 poi-tl 项目

        <poi-version>5.4.0</poi-version>
        
        -- poi 项目依赖

        <dependency>
            <groupid>org.apache.poi</groupid>
            <artifactid>poi</artifactid>
            <version>${poi-version}</version>
        </dependency>

        <dependency>
            <groupid>org.apache.poi</groupid>
            <artifactid>poi-ooxml</artifactid>
            <version>${poi-version}</version>
        </dependency>

        -- poi-tl 项目依赖
        <dependency>
            <groupid>com.deepoove</groupid>
            <artifactid>poi-tl</artifactid>
            <version>1.12.2</version>
        </dependency>

本讲介绍模版生成(poi - tl支持无模版生成)

读取模版文件、并且定义结果输出

        xwpftemplate
                .compile("模版文档.docx")
                .render(map)
                .writeandclose(new fileoutputstream("01.docx"));
  • xwpftemplate :  模版操作类
    • compile : 模版文档
    • render : 数据
    • writeandclose : 结果输出

普通图文本替换 (文档内容 {{key}})

模版文件

代码

        hashmap<string, object> rendermap = new hashmap<>();

        rendermap.put("text","我是被替换的内容");

        xwpftemplate
                .compile("空白文档.docx")
                .render(rendermap).
                writeandclose(new fileoutputstream("01.docx"));

输出文件

列表内容生成 {{#key}}

模版

代码实现

        hashmap<string, object> rendermap = new hashmap<>();

        rendermap.put("text", "我是被替换的内容");

        hashmap<string, object> ones = new hashmap<>();

        ones.put("name", "981129-1");
        ones.put("date", new date());

        arraylist<object> list = new arraylist<>();
        list.add(ones);
        list.add(ones);
        list.add(ones);
        list.add(ones);

        rendermap.put("list", list);

        // 表格循环插件
        looprowtablerenderpolicy rowtablerenderpolicy = new looprowtablerenderpolicy();
        configure configure = configure.builder()
                .bind("list", rowtablerenderpolicy)
                .build();


        xwpftemplate
                .compile("空白文档.docx", configure)
                .render(rendermap).
                writeandclose(new fileoutputstream("01.docx"));

复杂结构列表内容生成 (循环生成普通文本 + 列表)

自定义实现(代码)

package com.bu.poi.world.plugns;

import com.bu.poi.world.vsety;
import com.bu.poi.world.domain.dtentity;
import com.bu.poi.world.domain.objety;
import com.deepoove.poi.policy.abstractrenderpolicy;
import com.deepoove.poi.render.rendercontext;
import com.deepoove.poi.template.run.runtemplate;
import com.deepoove.poi.xwpf.bodycontainer;
import com.deepoove.poi.xwpf.bodycontainerfactory;
import com.deepoove.poi.xwpf.xwpfparagraphwrapper;
import org.apache.poi.xwpf.usermodel.*;

import java.util.list;

/**
 * @author haizhuangbu
 * @date 03 8月 2025 06:46
 * @mark customtablerenderpolicy
 */
public class customtablerenderpolicy extends abstractrenderpolicy<vsety> {

    @override
    protected void afterrender(rendercontext<vsety> context) {
        clearplaceholder(context, true);
    }

    @override
    public void dorender(rendercontext<vsety> rendercontext) {

        // 编辑行
        xwpfrun run = rendercontext.getrun();


        runtemplate runtemplate = (runtemplate) rendercontext.geteletemplate();


        // 数据
        vsety data = rendercontext.getdata();

        bodycontainer bodycontainer = bodycontainerfactory.getbodycontainer(run);


        list<dtentity> list = data.getlist();
        for (dtentity dtentity : list) {

            xwpfrun nvrun = createrun(runtemplate, (xwpfparagraph) run.getparent());

            nvrun.settext(dtentity.gettitle() + "\n");

            bodycontainer.insertnewparagraph(nvrun);
            nvrun.addbreak();

            xwpfrun nvrun1 = createrun(runtemplate, (xwpfparagraph) nvrun.getparent());

            nvrun1.settext(dtentity.getidx() + "\n");
            bodycontainer.insertnewparagraph(nvrun1);
            nvrun1.addbreak();


            list<objety> objetylist = dtentity.getlist();

            for (objety objety : objetylist) {
//                createrun(run);
//                xwpfrun tbrun = createrun(runtemplate, (xwpfparagraph) nvrun1.getparent());
                xwpfrun tbrun = createrun(run);
                xwpftable table = bodycontainer.insertnewtable(tbrun, 0, 0);
                createrow(table, objety);
                table.setwidth(8000);

            }


        }


    }

    private xwpfrun createrun(runtemplate runtemplate, xwpfparagraph parent) {
        xwpfparagraphwrapper paragraphwrapper = new xwpfparagraphwrapper(parent);
        return paragraphwrapper.insertnewrun(runtemplate.getrunpos());

    }

    public void createrow(xwpftable table, objety objety) {

        table.setinsidehborder(xwpftable.xwpfbordertype.single, 10, 2, "e8e8e8");
        table.setleftborder(xwpftable.xwpfbordertype.single, 10, 2, "e8e8e8");
        table.setrightborder(xwpftable.xwpfbordertype.single, 10, 2, "e8e8e8");
        table.settopborder(xwpftable.xwpfbordertype.single, 10, 2, "e8e8e8");
        table.setbottomborder(xwpftable.xwpfbordertype.single, 10, 2, "e8e8e8");
        xwpftablerow r1 = table.getrow(0);


        xwpftablecell left = r1.getcell(0);
        left.settext("姓名");


        xwpftablecell right = r1.createcell();
        right.settext(objety.getname());


        xwpftablerow r2 = table.createrow();
        xwpftablecell r2left = r2.getcell(0);
        r2left.settext("码值");
        xwpftablecell r2right = r2.getcell(1);
        r2right.settext(objety.gettcode());

        xwpftablerow r3 = table.createrow();
        xwpftablecell r3left = r3.getcell(0);
        r3left.settext("中文名");
        xwpftablecell r3right = r3.getcell(1);
        r3right.settext(objety.gettname());


    }


    public xwpfrun createrun(xwpfrun run) {
        xwpfdocument document = run.getdocument();
        xwpfparagraph paragraph = document.createparagraph();
        return paragraph.createrun();
    }


}
        vsety vsety = new vsety();

        arraylist<dtentity> dtentities = new arraylist<>();


        dtentity dtentity = new dtentity();
        dtentity.setidx("我是下标\n");
        dtentity.settitle("我是标题\n");

        list<objety> objeties = new arraylist<>();

        objety objety = new objety();
        objety.setname("name");
        objety.settname("name1");
        objety.settcode("code1");


        objety objety2 = new objety();
        objety2.setname("name");
        objety2.settname("name1");
        objety2.settcode("code1");

        objeties.add(objety);
        objeties.add(objety2);


        dtentity.setlist(objeties);

        dtentities.add(dtentity);


        vsety.setlist(dtentities);

        rendermap.put("report", vsety);

        customtablerenderpolicy customtablerenderpolicy = new customtablerenderpolicy();

        // 表格循环插件
        looprowtablerenderpolicy rowtablerenderpolicy = new looprowtablerenderpolicy();
        configure configure = configure.builder()
                .bind("list", rowtablerenderpolicy)
                .bind("report", customtablerenderpolicy)
                .build();


        xwpftemplate
                .compile("空白文档.docx", configure)
                .render(rendermap).
                writeandclose(new fileoutputstream("01.docx"));

模版

输出样式

官方文档地址:https://deepoove.com/poi-tl/#loop-col-table

总结

到此这篇关于java使用poi-tl库操作wold文档方法的文章就介绍到这了,更多相关java poi-tl操作word文档内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com