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

实现一个插件就是要告诉我们在模板的某个地方用某些数据做某些事情,我们可以通过实现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();  // 一定要记得关闭
    }


结果

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小蟹呀^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值