「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」
嵌套
{{+var}}
- 还是这张老生常谈的图,这次我们将焦点移动到
DocxRenderData,他就是用来处理我们的嵌套逻辑的。
+我们可以理解成导入的意思。官方的解释也是导入,包含,合并的意思。
- 我们在
DocxRenderData类中可以发现他有三个属性。实际上我们使用最多的就是下面两个属性 - file表示我们子模版的位置
- dataModels表示我们子模版渲染需要的数据
@Test
public void mergeTest() {
String name = "parent";
List<Map<String, Object>> subList = new ArrayList<>();
subList.add(new HashMap<String, Object>() {
{
put("address", "中国");
put("fav", "上网");
}
});
Map<String, Object> map = new HashMap<>();
map.put("child", new DocxRenderData(this.getClass().getResourceAsStream("/child.docx"), subList));
init(name,map);
}
- 我们准备好数据后,看看父子模板是如何制作的吧。
- 最终导出的效果如下
为了达到这种效果,我参考了官方示例,使用到了嵌套的方法,相关代码如下:
public static void writeToWord(WordModle wordModle) {
TheameData theameData = init(wordModle);
WordData wordData = theameData.getWordData();
List<WordParagraphData> wordParagraphData = theameData.getWordParagraphDataList();
wordData.setWordParagraphData(Includes.ofLocal("src/模板集合/paragraph.docx").setRenderModel(wordParagraphData).create());
XWPFTemplate.compile("E:\\base.docx").render(wordData).writeToFile("output.docx");
}
理解
- 嵌套实际上我们理解成主从表。我们在设计项目时大佬从来只是把控框架,具体实现时不关心的,嵌套也是我只需要这么一处,具体绘制成什么样子还是需要下游路径自己实现的。
- 通过嵌套的技术,我们可以实现在打印功能也进行模块化,比如A组负责user打印,B组负责role打印。最终我仅仅将AB嵌套即可。提高开发效率。
总结
- 到这里我们基本上讲poitl学习完了。后面我们在继续更新poitl的其他技能