小小的导出也被模块化了

141 阅读1分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」

嵌套

{{+var}}

image-20211130141652989

  • 还是这张老生常谈的图,这次我们将焦点移动到DocxRenderData,他就是用来处理我们的嵌套逻辑的。
  • +我们可以理解成导入的意思。官方的解释也是导入,包含,合并的意思。

image-20211130141458087

  • 我们在DocxRenderData类中可以发现他有三个属性。实际上我们使用最多的就是下面两个属性
  • file表示我们子模版的位置
  • dataModels表示我们子模版渲染需要的数据
 ​
 @Test
 public void mergeTest() {
   String name = "parent";
   List<Map<StringObject>> subList = new ArrayList<>();
   subList.add(new HashMap<StringObject>() {
    {
       put("address""中国");
       put("fav""上网");
    }
  });
   Map<StringObject> map = new HashMap<>();
   map.put("child"new DocxRenderData(this.getClass().getResourceAsStream("/child.docx"), subList));
   init(name,map);
 }
  • 我们准备好数据后,看看父子模板是如何制作的吧。

image-20211130142036293

  • 最终导出的效果如下

image-20211130142117001


为了达到这种效果,我参考了官方示例,使用到了嵌套的方法,相关代码如下:

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的其他技能