【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还有更多的用法还待后续研究。

相关推荐
企微自动化2 小时前
企业微信二次开发:深度解析外部群主动推送的实现路径
java·开发语言·企业微信
武子康2 小时前
Java-216 RocketMQ 4.5.1 在 JDK9+ 从0到1全流程启动踩坑全解:脚本兼容修复(GC 参数/CLASSPATH/ext.dirs)
java·大数据·分布式·消息队列·系统架构·rocketmq·java-rocketmq
austin流川枫2 小时前
🔥MySQL的大表优化方案 (实战分享)
java·mysql·性能优化
码界奇点2 小时前
基于Spring Boot和Vue.js的视频点播管理系统设计与实现
java·vue.js·spring boot·后端·spring·毕业设计·源代码管理
爱吃山竹的大肚肚2 小时前
MySQL 支持的各类索引
java·数据库·sql·mysql·spring·spring cloud
程序员水自流2 小时前
MySQL常用内置函数详细介绍
java·数据库·mysql
廋到被风吹走2 小时前
【Spring】Spring Boot详细介绍
java·spring boot·spring
期待のcode2 小时前
Java中的继承
java·开发语言
计算机毕设指导62 小时前
基于微信小程序的智慧社区娱乐服务管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·娱乐