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

相关推荐
小王不爱笑13220 小时前
LangChain4J 整合多 AI 模型核心实现步骤
java·人工智能·spring boot
西凉的悲伤20 小时前
spring-boot-starter-validation使用注解进行参数校验
java·spring boot·参数校验·validation·注解校验参数
LucDelton20 小时前
Java 读取无限量文件读取的思路
java·运维·网络
夹锌饼干20 小时前
mysql死锁排查流程--(处理mysql阻塞问题)
java·mysql
小信丶20 小时前
@EnableTransactionManagement注解介绍、应用场景和示例代码
java·spring boot·后端
To Be Clean Coder20 小时前
【Spring源码】createBean如何寻找构造器(四)——类型转换与匹配权重
java·后端·spring
-孤存-21 小时前
SpringBoot核心注解与配置详解
java·spring boot·后端
Hx_Ma1621 小时前
BCrypt
java
We....21 小时前
鸿蒙与Java跨平台Socket通信实战
java·服务器·tcp/ip·arkts·鸿蒙
笃行客从不躺平21 小时前
Token 复习
java·分布式·spring cloud