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

相关推荐
小小小米粒6 小时前
Maven Tools
java
骆驼爱记录6 小时前
Word样式检查器使用指南
自动化·word·excel·wps·新人首发
kali-Myon6 小时前
2025春秋杯网络安全联赛冬季赛-day1
java·sql·安全·web安全·ai·php·web
我是咸鱼不闲呀6 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
清水白石0087 小时前
深入解析 LRU 缓存:从 `@lru_cache` 到手动实现的完整指南
java·python·spring·缓存
符哥20087 小时前
C++ 进阶知识点整理
java·开发语言·jvm
Sayuanni%37 小时前
初阶_多线程1(线程含义与关键属性)
java
程序媛徐师姐7 小时前
Java基于微信小程序的模拟考试系统,附源码+文档说明
java·微信小程序·java模拟考试系统小程序·模拟考试微信小程序·模拟考试系统小程序·模拟考试小程序·java模拟考试小程序
疯狂敲代码的老刘7 小时前
JDK 1.6到25 全版本网盘合集 (Windows + Mac + Linux)
java·linux·windows·macos·jdk
夕除7 小时前
js--15
java·jvm·spring