【Poi-tl】 Word模板填充导出

近期有个需求,需要根据预设的Word模板填充数据导出,做完后再来回顾记录下,以备后续不时之需。

本次Word模板填充导出采用的是 Poi-tl (https://deepoove.com/poi-tl/#_why_poi_tl),整个导出非常的友好便捷,不需要额外的环境配置。

一、pom.xml

java 复制代码
        <!-- poi-tl word导出 -->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.12.2</version>
        </dependency>
        <!-- 增强富文本导出 -->
        <dependency>
            <groupId>io.github.draco1023</groupId>
            <artifactId>poi-tl-ext</artifactId>
            <version>0.4.24-poi5</version>
        </dependency>

注:poi-tl-ext 用于富文本导出

二、导出模板

注:

1. 图片参数必须是下划线形式的,不支持驼峰式命名,图片加载方式有好几种,注意区分。

详见:https://deepoove.com/poi-tl/#_%E5%9B%BE%E7%89%87

2.列表参数,把外层key写在循环行的上一列,循环显示是参数用[参数]

详见:https://deepoove.com/poi-tl/#_%E5%88%97%E8%A1%A8

三、代码示例

java 复制代码
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.data.Texts;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.ruoyi.common.exception.ServiceException;
import org.ddr.poi.html.HtmlRenderPolicy;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Poi-tl Word模板填充导出
 */
public class WordDemo {

    public static void main(String[] args) {
        String templateFile = "模板示例.docx";   //模板路径
        String targetFile = "模板填充_123.docx"; //生成的目标文件路径
        String picUrl = "11223.jpg";    //图片路径

        /**
         * 组装待导出的数据
         */
        Map dataMap = new HashMap();

        LoopRowTableRenderPolicy renderPolicy = new LoopRowTableRenderPolicy();
        ConfigureBuilder configureBuilder = Configure.builder();
        //html渲染插件
        HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();

        //普通文本数据
        dataMap.put("text", Texts.of("我是普通文本").create());

        //图片数据(本地数据)
        dataMap.put("img_url", Pictures.ofLocal(picUrl).sizeInCm(9.78, 11.16).create());

        //列表数据
        List<Map> tableList = new ArrayList<>();
        Map temp1 = new HashMap();
        temp1.put("name", "张三");
        temp1.put("sex", "男");
        tableList.add(temp1);
        Map temp2 = new HashMap();
        temp2.put("name", "小花");
        temp2.put("sex", "女");
        tableList.add(temp2);
        dataMap.put("tableData", tableList);
        //绑定列表数据code
        configureBuilder.bind("tableData", renderPolicy);

        //富文本
        String richText = 
                "<p style=\"text-align: center;\"><span style=\"font-size: 14pt;\"><strong>xxx年度安全生产教育培训工作计划</strong></span></p>\n" +
                "                <p style=\"text-align: center;\"><span style=\"font-size: 14pt;\"><span style=\"font-size: 10pt; color: #e67e23;\">(模板,可上传企业自有制度或修改模板)</span></span></p>\n" +
                "                <p>&nbsp;</p>\n" +
                "                <p><span style=\"font-size: 14pt;\">&nbsp; &nbsp; &nbsp; &nbsp;<span style=\"color: #ba372a;\">为进一步规范公司安全宣传和教育培训工作,不断提高公司员工安全生产意识和安全素质,增强安全生产法制观念,有力推动公司安全生产基础建设、安全生产诚信建设、安全生产标准化建设和企业安全文化建设,确保今年的安全生产目标指标的实现,特制定本计划如下:</span></span></p>"
                
                ;
        dataMap.put("richText", richText);
        //绑定富文本code
        configureBuilder.bind("richText", htmlRenderPolicy);

        //Poi-tl 导出
        Configure configure = configureBuilder.bind("tableData", renderPolicy).build();
        XWPFTemplate template = XWPFTemplate.compile(templateFile, configure).render(dataMap);

        //文件流导出
        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(targetFile);
            template.write(outputStream);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServiceException("根据模板生成Word文件失败。" + e.getMessage());
        } finally {
            try {
                if (null != outputStream) {
                    outputStream.flush();
                    outputStream.close();
                }
                if (null != template) {
                    template.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

四、导出结果

五、写在最后

以上仅为本人依据当前项目需求做出的一点记录和理解,如有其他见解,欢迎留言。Poi-tl还有更多的用法还待后续研究。

相关推荐
sheji34161 小时前
【开题答辩全过程】以 家庭教育资源网为例,包含答辩的问题和答案
java
百***78751 小时前
Grok-4.1与GPT-5.2深度对比:技术差异、适用场景及Python集成指南
java·python·gpt
Mr -老鬼1 小时前
Java VS Rust
java·开发语言·rust
北凉军1 小时前
java连接达梦数据库,用户名是其他库的名称无法指定库,所有mapper查询的都是以用户名相同的库内的表
java·开发语言·数据库
程序员张32 小时前
Mybatis条件判断某属性是否等于指定字符串
java·spring boot·mybatis
wuk9982 小时前
基于C#与三菱PLC通过TCPIP实现MC协议通信示例
java·网络·c#
沛沛老爹2 小时前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别
java·开发语言·前端·人工智能·架构·企业开发
码农小卡拉2 小时前
Maven与Gradle选型指南:如何匹配项目的依赖管理需求
java·gradle·maven
黎雁·泠崖2 小时前
吃透Java操作符进阶:算术+移位操作符 全解析(Java&C区别+完整案例+避坑指南)
java·c语言·python