POI-tl 知识整理:整理5 -> 开发一个插件

news2024/11/17 15:40:23

实现一个插件就是要告诉我们在模板的某个地方用某些数据做某些事情,我们可以通过实现RenderPolicy接口开发自己的插件

模板 

 

写一个将标签替换为Hello, world的插件

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.policy.RenderPolicy;
import com.deepoove.poi.template.ElementTemplate;
import com.deepoove.poi.template.run.RunTemplate;
import org.apache.poi.xwpf.usermodel.XWPFRun;


public class HelloWorldRenderPolicy implements RenderPolicy {
    @Override
    public void render(ElementTemplate elementTemplate, Object o, XWPFTemplate xwpfTemplate) {
        XWPFRun run = ((RunTemplate) elementTemplate).getRun();

        String text = "Hello World!";

        run.setText(text, 0);
    }
}

测试就跟下方自定义插件生成表格一起了,继续往下学习!!

 

2 写一个更复杂的插件,在模板标签位置完完全全使用代码创建一个表格

poi-tl提供了抽象模板类 AbstractRenderPolicy ,它定义了一些骨架步骤并且将数据模型的校验和渲染逻辑分开,使用泛型约束数据类型,让插件开发起来更简单,AbstractRenderPolicy实现地也是RenderPolicy接口


import com.deepoove.poi.data.style.BorderStyle;
import com.deepoove.poi.data.style.Style;
import com.deepoove.poi.policy.AbstractRenderPolicy;
import com.deepoove.poi.policy.TableRenderPolicy;
import com.deepoove.poi.render.RenderContext;
import com.deepoove.poi.util.TableTools;
import com.deepoove.poi.util.UnitUtils;
import com.deepoove.poi.xwpf.BodyContainer;
import com.deepoove.poi.xwpf.BodyContainerFactory;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;


public class CustomTableRenderPolicy extends AbstractRenderPolicy<Object> {

    @Override
    protected void afterRender(RenderContext<Object> renderContext) {
        // 清空模板标签所在的段落
        clearPlaceholder(renderContext, true);
    }

    @Override
    public void doRender(RenderContext<Object> renderContext) throws Exception {
        // 自定义渲染逻辑
        XWPFRun run = renderContext.getRun();
        BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(run);

        // 定义行列
        int row = 10;
        int col = 8;
        XWPFTable table = bodyContainer.insertNewTable(run, row, col);
        XWPFParagraph paragraph = bodyContainer.insertNewParagraph(run);
        XWPFRun paragraphRun = paragraph.createRun();
        paragraphRun.setText("自定义表格");
        paragraphRun.setColor("0000FF");

        Style style = new Style();
        style.setFontSize(18);

        // 表格宽度
        TableTools.setWidth(table, UnitUtils.cm2Twips(14.63f) + "", null);
        // 表格边框和样式
        TableTools.borderTable(table, BorderStyle.DEFAULT);

        TableTools.mergeCellsHorizonal(table, 0, 0, 7);
        TableTools.mergeCellsVertically(table, 1, 1, 9);

    }
}

3 测试

    @Test
    public void testPlugins() throws Exception {
        CustomTableRenderPolicy policy = new CustomTableRenderPolicy();
        HelloWorldRenderPolicy policy1 = new HelloWorldRenderPolicy();
        Configure config = Configure.builder().bind("report", policy)
                .bind("title",policy1).build();
        XWPFTemplate template = XWPFTemplate.compile("D:\\Idea-projects\\POI_word\\templates_Plugins.docx",config);

        Map<String, Object> map = new HashMap<>();

        XWPFTemplate render = template.render(map);

        FileOutputStream fileOutputStream = new FileOutputStream("D:\\Idea-projects\\POI_word\\output_Plugins.docx");
        template.writeAndClose(fileOutputStream);

        template.close();  // 一定要记得关闭
    }


结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1386499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS2 仿真学习01 Gazebo 操作界面介绍

打开终端&#xff0c;输入命令 ros2 launch gazebo_ros gazebo.launch.py即可看到图所示的软件环境 Gazebo软件环境 界面中间栅格部分为场景&#xff0c;作为模拟器的主要组成部分&#xff0c;场景是模拟对象被放置的地 方&#xff0c;也是用户与模拟器交互的可视化区域&am…

2014年408真题----二叉树求带权路径值

#include <stdio.h> #include <stdlib.h>typedef int BiElemType; typedef struct BiTNode {BiElemType data;struct BiTNode *lChild;struct BiTNode *rChild;//左右节点 } BiTNode, *BiTree; //辅助队列 typedef struct tag {BiTree p;//树的某一个节点&#xff…

写点东西《 Kickstart:搭建 JS 项目的最快方式!》

写点东西《&#x1f680; Kickstart&#xff1a;搭建 JS 项目的最快方式&#xff01;》 如何使用它&#xff1f; 想象一下&#xff1a;你刚刚有一个新的项目创意&#xff0c;你对创意充满热情&#xff0c;并准备好编码。 但是&#xff0c;在实际编写代码之前&#xff0c;您必须…

翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一 1. 使用Streamlit显示图表Graphs 1.1 为什么我们需要可视化&#xff1f; 数据可视化通过将数据整理成更容易理解的格式来讲述故事&#xff0c;凸显趋势和异常点。好的可视化能够讲述一个故…

ThingsPanel部署和使用

前置条件&#xff1a; 首先默认大家有一台服务器或者云服务器并且已经搭建好环境。小编是基于Linux宝塔环境以Docker安装ThingsPanel平台。 一.Docker和Docker-compose 1.概述 Docker是一个开源的容器化平台&#xff0c;它可以帮助开发者将应用程序与其依赖项打包到一个轻量…

DataX的安装使用

DataX概述&#xff1a; DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台&#xff0c;实现包括 MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。DataX采用了框架 插件 的模式&#xff0c;目前已开源&#xff0c;代…

第27集《佛法修学概要》

丁二、天乘分三&#xff1a;戊一、十善业。戊二、四禅定。戊三、四空定 请大家打开讲义第七十七页&#xff0c;这是五乘里面的第二个法门&#xff0c;天乘法门。 大乘佛教把我们众生生命的现象分成了三个部分&#xff1a;第一个部分&#xff0c;叫作 本来清净&#xff1b;第…

如何优化测试用例设计,节约时间?

进一步优化测试用例设计&#xff0c;不仅可以减少测试用例数量和冗余&#xff0c;还可以减少执行时间&#xff0c;缩短测试周期&#xff0c;更快发现和修复问题&#xff0c;提高测试的质量。而没有优化的测试用例设计可能会导致冗余和重复的测试用例&#xff0c;增加了测试人员…

【Flink-1.17-教程】-【一】Flink概述、Flink快速入门

【Flink-1.17-教程】-【一】Flink概述、Flink快速入门 1&#xff09;Flink 是什么1.1.有界流和无界流1.2.Flink 的发展史 2&#xff09;Flink 特点3&#xff09;Flink vs SparkStreaming4&#xff09;Flink 的应用场景5&#xff09;Flink 分层 API6&#xff09;Flink 快速入门6…

Unity寻路A星算法

文章目录 实现步骤概览&#xff1a; 计算移动成本1. **定义移动成本函数**&#xff1a;2. **考虑不同类型的格子**&#xff1a;3. **动态调整成本**&#xff1a;4. **实际应用**&#xff1a; 优先级队列1. **初始化**&#xff1a;2. **节点评估**&#xff1a;3. **更新节点状态…

电脑桌面便签在哪设置?备忘录软件哪个好?

好记性不如烂笔头&#xff01;相信很多打工族在电脑面前办公的时候&#xff0c;都需要随时记录工作中的事项&#xff0c;有的用TXT记录&#xff0c;有的手写笔记&#xff0c;还有一些用电脑桌面便签类软件。而当我们待办事项繁多的时候&#xff0c;手写或文本记录并不能有效帮我…

删除运行框中的文件打开历史记录

当我们使用everything、百度、迅雷等软件&#xff0c;在列表中右键选中打开文件夹时。 当使用 winR 快捷键等方式打开运行时&#xff0c;输入盘符会出现之前打开过的文件夹&#xff0c; 一方面展示的特别多会比较混乱&#xff0c;另一方面 记得在之前的window版本中&#xff08…

What is `@Repository` does?

Repository 是Spring注解&#xff0c;标识数据访问层组件&#xff08;DAO, Data Access Object&#xff09; 当一个类被标记为 Repository 时&#xff1a; 1、组件扫描与自动代理&#xff1a; Spring通过组件扫描&#xff08;Component Scan&#xff09;机制发现带有 Reposit…

KEIL MDK 工程(.uvprojx)目录更改后快速修改方法

概述 在项目过多时&#xff0c;为了方便管理&#xff0c; 需借用文件夹命名来&#xff0c;举例&#xff1a; 1、原工程是在“STM32_Test_Project\MDK-ARM”目录下&#xff0c;我现在创建新文件夹&#xff0c;“Test”&#xff0c;避免原来的受污染&#xff0c;或者好管理等等好…

Linux 多个php版本选择需要的php的版本(修改环境变量)

这两天遇到了个问题&#xff0c; 原本服务器的php版本是7.3.13&#xff0c;经过一些操作之后不知道怎么了变成了5.6 #php版本查看 php -v然后我就对 5.6版本进行了升级&#xff0c;升级到了7.3.33&#xff0c; 这个时候 php -v 是7.3.33&#xff0c; 神奇的一幕出现了&#xf…

鸿蒙开发之组合手势

当我们需要支持多个手势的时候&#xff0c;可以通过GestureGroup来实现&#xff0c;如下实现了同时支持Tap和Pan手势 import Prompt from system.prompt Entry Component struct OfficialGestureGroupPage {State message: string Hello Worldbuild() {Column() {Column() {T…

STM32F103标准外设库——认识STM32(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

SSH远程访问与控制

目录 ssh优点 作用 SSH的 软件 公钥首次连接原理 ssh远程登录 shh命令 远程连接 直接连接先输入ssh IP 连接指定用户 在 /etc/ssh/sshd_config下面修改端口号 修改服务端配置文件 ​编辑 白名单&#xff0c;只能登录本机的mcb用户 SSH服务的最佳实践 openSSH 服…

Vue.js轻量级框架:快速搭建可扩展的管理系统

一、前言 在项目实战开发中&#xff0c;尤其是大平台系统的搭建&#xff0c;针对不同业务场景&#xff0c;需要为用户多次编写用于录入、修改、展示操作的相应表单页面。一旦表单需求过多&#xff0c;对于开发人员来说&#xff0c;算是一种重复开发&#xff0c;甚至是繁杂的工作…

NetCore部署微服务(三)

接上文&#xff0c;服务端部署完成之后&#xff0c;同样我们也需要修改一下客户端代码 Blocking Queries 1.1 服务发现 在客户端代码中使用Nuget安装consul包 修改配置文件&#xff0c;我们首先需要把consul的请求地址配置在配置文件中 修改control方法 using Consul; usin…