內建策略是poi-tl自带的一些渲染策略,用来处理文本、图片、列表、表格、文档合并等:
TextRenderPolicy
PictureRenderPolicy
NumbericRenderPolicy
DocxRenderPolicy
我们可以通过实现 接口扩展自己的渲染策略:
示例:我们创建一个自己的表格渲染策略CustomTableRenderPolicy,使用表格API来操作表格,doc.insertNewTable()
是在当前模板位置插入表格,正如可以实现任何渲染逻辑一样,我们可以随心所欲的操作表格了。
AbstractRenderPolicy是一个抽象模板类,定义了一些骨架步骤并且将数据模型的校验和渲染逻辑分开,新的策略继承AbstractRenderPolicy类不是必须的。
public class CustomTableRenderPolicy extends AbstractRenderPolicy<Object> {
@Override
protected void afterRender(RenderContext context) {
// 清空模板标签所在段落
}
@Override
public void doRender(RunTemplate runTemplate, Object data, XWPFTemplate template)
NiceXWPFDocument doc = template.getXWPFDocument();
XWPFRun run = runTemplate.getRun();
// 定义行列
int row = 10, col = 8;
// 插入表格
XWPFTable table = doc.insertNewTable(run, row, col);
// 定义表格宽度、边框和样式
TableTools.borderTable(table, 4);
// 调用XWPFTable API操作表格:data对象可以包含任意你想要的数据,包括图片文本等
// 调用MiniTableRenderPolicy.Helper.renderRow方法快速方便的渲染一行数据
// 调用TableTools类方法操作表格,比如合并单元格
// ......
TableTools.mergeCellsHorizonal(table, 0, 0, 7);
TableTools.mergeCellsVertically(table, 0, 1, 9);
}
}
当我们有个模板标签为{{report}},它本身是一个文本模板,如果希望在这个位置做些不一样或者更复杂的事情,我们可以通过构建器设定模板的渲染策略:
builder.customPolicy("report", new MyRenderPolicy());
比如增加%语法:{{%var}},对应自定义的渲染策略 PercentRenderPolicy
,加载插件代码如下:
由于內建模板也是通过插件方式加载的,我们甚至可以改变它们的语法:
builder.addPlugin('#', new PictureRenderPolicy());
这样{{@var}}就变成了表格模板,{{#var}}变成了图片模板,虽然不建议改变內建模板,但是从中可以看到poi-tl插件的设计思想,深藏功与名。