內建策略是poi-tl自带的一些渲染策略,用来处理文本、图片、列表、表格、文档合并等:

    • TextRenderPolicy

    • PictureRenderPolicy

    • NumbericRenderPolicy

    • DocxRenderPolicy

    我们可以通过实现 接口扩展自己的渲染策略:

    示例:我们创建一个自己的表格渲染策略CustomTableRenderPolicy,使用表格API来操作表格,doc.insertNewTable() 是在当前模板位置插入表格,正如可以实现任何渲染逻辑一样,我们可以随心所欲的操作表格了。

    AbstractRenderPolicy是一个抽象模板类,定义了一些骨架步骤并且将数据模型的校验和渲染逻辑分开,新的策略继承AbstractRenderPolicy类不是必须的。

    1. public class CustomTableRenderPolicy extends AbstractRenderPolicy<Object> {
    2. @Override
    3. protected void afterRender(RenderContext context) {
    4. // 清空模板标签所在段落
    5. }
    6. @Override
    7. public void doRender(RunTemplate runTemplate, Object data, XWPFTemplate template)
    8. NiceXWPFDocument doc = template.getXWPFDocument();
    9. XWPFRun run = runTemplate.getRun();
    10. // 定义行列
    11. int row = 10, col = 8;
    12. // 插入表格
    13. XWPFTable table = doc.insertNewTable(run, row, col);
    14. // 定义表格宽度、边框和样式
    15. TableTools.borderTable(table, 4);
    16. // 调用XWPFTable API操作表格:data对象可以包含任意你想要的数据,包括图片文本等
    17. // 调用MiniTableRenderPolicy.Helper.renderRow方法快速方便的渲染一行数据
    18. // 调用TableTools类方法操作表格,比如合并单元格
    19. // ......
    20. TableTools.mergeCellsHorizonal(table, 0, 0, 7);
    21. TableTools.mergeCellsVertically(table, 0, 1, 9);
    22. }
    23. }

    当我们有个模板标签为{{report}},它本身是一个文本模板,如果希望在这个位置做些不一样或者更复杂的事情,我们可以通过构建器设定模板的渲染策略:

    1. builder.customPolicy("report", new MyRenderPolicy());

    比如增加%语法:{{%var}},对应自定义的渲染策略 PercentRenderPolicy,加载插件代码如下:

    由于內建模板也是通过插件方式加载的,我们甚至可以改变它们的语法:

    1. builder.addPlugin('#', new PictureRenderPolicy());

    这样{{@var}}就变成了表格模板,{{#var}}变成了图片模板,虽然不建议改变內建模板,但是从中可以看到poi-tl插件的设计思想,深藏功与名。