• 在poi-tl的区块对中实现用布尔值插入Word分页符的一种方法


    目录

    关于poi-tl

    关于poi-tl区块对

    poi-tl中分页符如何表示

    实现的例子

    准备文档模板

    实现的代码

    测试结果 

    总结


    关于poi-tl

    poi-tl是基于Apache POI的Word模板引擎,它使用java语言来实现,它可以将word文档中的“标签”渲染为用户指定的文字、表格、图片等。使用模板引擎生成word比使用Apache POI的API来生成来说,快捷了不少。关于poi-tl的具体介绍请看poi-tl作者网站。相信能够进来阅读博客的朋友都对此有一定了解的。

    关于poi-tl区块对

    这里直接引用poi-tl作者的原话,“区块对由前后两个标签组成,开始标签以?标识,结束标签以/标识:{{?sections}}{{/sections}}”。

    区块对的作用之一是可以遍历java集合(java.util.Collection),将集合内的内容渲染为用户指定的对象。如:

    应用场景一:在一个文档中动态生成段落文本及图片。

    应用场景二:用户想在同一个批量生成一些样式重复、内容不同的表格,可以使用区块对来实现。

    poi-tl中分页符如何表示

    最简单的方法就是直接在word模板中插入分页符。但是这种方式不太灵活,比如说在动态生成段落时,有些段落结尾后,需要分页,而有些段落不需要分页。

    基于此情况,本人认为应该使用布尔值结合Apache POI的API来生成分页符。在POI中org.apache.poi.xwpf.usermodel.XWPFRun类有插入分页符的方法addBreak。而在poi-tl中使用POI的API一般来说需要结合自定义插件(即实现com.deepoove.poi.policy.AbstractRenderPolicy)。

    实现的例子

    准备文档模板

    如下

    实现的代码

    这里为了便于测试,将所有类和方法都写在一个文件中。

    1. import com.deepoove.poi.XWPFTemplate;
    2. import com.deepoove.poi.config.Configure;
    3. import com.deepoove.poi.policy.AbstractRenderPolicy;
    4. import com.deepoove.poi.render.RenderContext;
    5. import org.apache.poi.xwpf.usermodel.BreakType;
    6. import org.apache.poi.xwpf.usermodel.XWPFRun;
    7. import java.io.IOException;
    8. import java.util.ArrayList;
    9. import java.util.HashMap;
    10. import java.util.List;
    11. /**
    12. * poi-tl中自定义插入分页符标签的例子,不可直接用于生产环境
    13. **/
    14. public class PageBreakTest {
    15. static String templatePath = "E:\\测试.docx";
    16. public static void main(String[] args) throws IOException {
    17. pageBreakDemo("E:\\测试输出.docx");
    18. }
    19. public static void pageBreakDemo(String outPut) throws IOException {
    20. List wordDataList = new ArrayList<>();
    21. //生成数据
    22. setWordDataList(wordDataList);
    23. //这里绑定了一个自定义的插件到isPageBreak标签
    24. Configure config = Configure.builder().useSpringEL().bind("isPageBreak", new AbstractRenderPolicy() {
    25. @Override
    26. public void doRender(RenderContext context) throws Exception {
    27. XWPFRun where = context.getWhere();
    28. boolean thing = context.getThing();
    29. where.setText("", 0);
    30. if (thing)
    31. where.addBreak(BreakType.PAGE);
    32. }
    33. }).build();
    34. XWPFTemplate.compile(templatePath, config).render(new HashMap() {
    35. {
    36. put("paragraphList", wordDataList);
    37. }
    38. }).writeToFile(outPut);
    39. }
    40. /**
    41. * 生成测试数据
    42. * @param wordDataList
    43. */
    44. private static void setWordDataList(List wordDataList){
    45. wordDataList.add(new MyParagraph("明月几时有,把酒问青天。",false));
    46. wordDataList.add(new MyParagraph("不知天上宫阙,今夕是何年?",false));
    47. wordDataList.add(new MyParagraph("我欲乘风归去,又恐琼楼玉宇,高处不胜寒。",true));
    48. wordDataList.add(new MyParagraph("大江东去,浪淘尽,千古风流人物。",false));
    49. }
    50. }
    51. /**
    52. * 测试实体类
    53. */
    54. class MyParagraph {
    55. private String content;
    56. private Boolean isPageBreak;
    57. public MyParagraph(String content, Boolean isPageBreak) {
    58. this.content = content;
    59. this.isPageBreak = isPageBreak;
    60. }
    61. public MyParagraph() {
    62. }
    63. public String getContent() {
    64. return content;
    65. }
    66. public void setContent(String content) {
    67. this.content = content;
    68. }
    69. public Boolean getIsPageBreak() {
    70. return isPageBreak;
    71. }
    72. public void setIsPageBreak(Boolean pageBreak) {
    73. isPageBreak = pageBreak;
    74. }
    75. }

    测试结果 

    这里使用word大纲模式展示

    总结

     实现在poi-tl中用自定义的布尔值在word文档中插入分页符,实现的核心还是在poi-tl中实现自定义插件。因为有自定义插件的存在,也使得poi-tl生成文档变得更加灵活。

  • 相关阅读:
    谷粒学院16万字笔记+1600张配图(四)——前端技术
    Two-stage RO: part 1
    C++系统相关操作3 - 获取操作系统的平台类型
    idea开发 java web 酒店推荐系统bootstrap框架开发协同过滤算法web结构java编程计算机网页
    使用Excel批量生成SQL语句,用过的人都说好
    【软件工程】白盒测试:基本路径测试
    Vue 实现 Hover 功能( mouseover 与 mouseenter 的区别)
    计算机网络(HTTPS)
    农业大数据概论-按章节复习
    Vue-cli3 来创建项目
  • 原文地址:https://blog.csdn.net/wzw114/article/details/127545483