poi-tl模板引擎根据树形结构输出word文档(文档模板)

        最近在做一个需求,就是根据当前的树形结构,输出到word文档中。下面展示一下小demo

目录

1、输入:

2、输出:文档.docx

3、代码展示

4、测试结果

4.1、模板文档内容

4.2、输出文档

5、总结


1、输入:

root---树节点1------树节点1.1------树节点1.2---树节点2------树节点2.1------树节点2.1.1------树节点2.1.2------树节点2.1.3------树节点2.2

2、输出:文档.docx

文档内容:
1、树节点1树节点1.text
1.1、树节点1.1树节点1.1.text
1.2、树节点1.2树节点1.2.text
2、树节点2树节点2.text
2.1、树节点2.1树节点2.1.text
2.1.1、树节点2.1.1树节点2.1.1.text
2.1.2、树节点2.1.2树节点2.1.2.text
2.1.3、树节点2.1.3树节点2.1.3.text
2.2、树节点2.2树节点2.2.text

3、代码展示

//测试类
public static void main(String[] args) {//模板文件路径,后续会给出模板文档全部内容String templatePath = "D:\\git_projec\\区块对v3.docx";//输出文档文件路径String outputPath = "D:\\git_project\\测试输出v3.docx";outputToWord(templatePath,outputPath);}
//文档输出函数
private static void outputToWord(String templatePath,String outputPath) {ArrayList<TitleAndContent> list = new ArrayList<>();setWordDataList(list);//需要将数据封装到Map集合中HashMap<String, Object> data = new HashMap<>();//使用模板中的占位符,就要告诉模板占位符为哪个,即下面map的key值data.put("titleAndContentList", list);/*//下面的配置是完成的标签绑定的配置,例如:标签占位符为哪个、标签的开头以什么字符开头ConfigureBuilder builder = Configure.builder();builder.bind("titleContentList", new TitleContentRender());Configure config = builder.build();XWPFTemplate template = XWPFTemplate.compile(templatePath, config).render(data);*/Configure configure = Configure.builder().useSpringEL().build();XWPFTemplate template = XWPFTemplate.compile(templatePath,configure).render(data);// 保存生成的 Word 文档try (FileOutputStream out = new FileOutputStream(outputPath)) {template.write(out);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 关闭模板try {template.close();} catch (IOException e) {e.printStackTrace();}}
//手动创建结构树数据
private static void setWordDataList(List<TitleAndContent> titleAndContentList) {Title title1 = new Title("标题1", 1, "style1");Title title2 = new Title("标题2", 1, "style1");Title title3 = new Title("标题3", 1, "style1");Title title1_1 = new Title("标题1.1", 2, "style2");Title title1_2 = new Title("标题1.2", 2, "style2");Title title2_1 = new Title("标题2.1", 2, "style2");Title title3_1 = new Title("标题3.1", 2, "style2");Title title3_2 = new Title("标题3.2", 2, "style2");Title title1_1_1 = new Title("标题1.1.1", 3, "style3");Title title1_1_2 = new Title("标题1.1.2", 3, "style3");TitleAndContent titleAndContent3_1 = new TitleAndContent(title3_1, "content3_1",null);TitleAndContent titleAndContent3_2 = new TitleAndContent(title3_2, "content3_2",null);TitleAndContent titleAndContent3 = new TitleAndContent(title3, "content2");List<TitleAndContent> contents1 = titleAndContent3.getTitleAndContents();contents1.add(titleAndContent3_1);contents1.add(titleAndContent3_2);TitleAndContent titleAndContent2_1 = new TitleAndContent(title2_1, "content2_1",null);TitleAndContent titleAndContent2 = new TitleAndContent(title2, "content2");List<TitleAndContent> contents2 = titleAndContent2.getTitleAndContents();contents2.add(titleAndContent2_1);TitleAndContent titleAndContent1_1_1 = new TitleAndContent(title1_1_1, "content1_1_1",null);TitleAndContent titleAndContent1_1_2 = new TitleAndContent(title1_1_2, "content1_1_2",null);TitleAndContent titleAndContent1_1 = new TitleAndContent(title1_1, "content1_1");List<TitleAndContent> contents3 = titleAndContent1_1.getTitleAndContents();contents3.add(titleAndContent1_1_1);contents3.add(titleAndContent1_1_2);TitleAndContent titleAndContent1_2 = new TitleAndContent(title1_2, "content1_2", null);TitleAndContent titleAndContent1 = new TitleAndContent(title1, "content1");List<TitleAndContent> contents = titleAndContent1.getTitleAndContents();contents.add(titleAndContent1_1);contents.add(titleAndContent1_2);//将数据添加到list中titleAndContentList.add(titleAndContent1);titleAndContentList.add(titleAndContent2);titleAndContentList.add(titleAndContent3);}
//自定义的标题类
public class Title {private String titleName;private int level;private String style;public Title() {}public Title(String titleName, int level, String style) {this.titleName = titleName;this.level = level;this.style = style;}public String getTitleName() {return titleName;}public void setTitleName(String titleName) {this.titleName = titleName;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}public String getStyle() {return style;}public void setStyle(String style) {this.style = style;}
}
//自定义的类,用于封装数据,可以说是树节点
public class TitleAndContent {private Title title;private String content;private List<TitleAndContent> titleAndContents = new ArrayList<>();public TitleAndContent() {}public TitleAndContent(Title title, String content) {this.title = title;this.content = content;}public TitleAndContent(Title title, String content, List<TitleAndContent> titleAndContents) {this.title = title;this.content = content;this.titleAndContents = titleAndContents;}public Title getTitle() {return title;}public void setTitle(Title title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public List<TitleAndContent> getTitleAndContents() {return titleAndContents;}public void setTitleAndContents(List<TitleAndContent> titleAndContents) {this.titleAndContents = titleAndContents;}
}

4、测试结果

4.1、模板文档内容

        文档内容如下所示,其中的1、1.1等是设置文章标题级别,自行设置即可,输出的内容格式会被设置成文档中标签的格式。

##章节+文本
{{?titleAndContentList}}
1	{{title.titleName}}
{{content}}
{{?titleAndContents}}
1.1	{{title.titleName}}
{{content}}
{{?titleAndContents}}
1.1.1	{{title.titleName}}
{{content}}
{{?titleAndContents}}
1.1.1.1	{{title.titleName}}
{{content}}
{{?titleAndContents}}
1.1.1.1.1	{{title.titleName}}
{{content}}
{{?titleAndContents}}
1.1.1.1.1.1	{{title.titleName}}
{{content}}
{{?titleAndContents}}
1.1.1.1.1.1.1	{{title.titleName}}
{{content}}
{{?titleAndContents}}
1.1.1.1.1.1.1.1	{{title.titleName}}
{{content}}
{{/titleAndContents}}
{{/titleAndContents}}
{{/titleAndContents}}
{{/titleAndContents}}
{{/titleAndContents}}
{{/titleAndContents}}
{{/titleAndContents}}
{{/titleAndContentList}}

文档内容截图

图1.文档内容截图

4.2、输出文档

图2.输出文档内容截图

5、总结

        以上就是一个小demo的实现过程,简单记录下,有什么问题可以探讨下。

下面附上poi-tl文档官网,github上也可以搜索到。

        最后祝你写代码从头顺到尾!

学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
                                                                                                        ------不写代码不会凸的小刘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/422919.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity New Input System 及其系统结构和源码浅析【Unity学习笔记·第十二】

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/132534422 作者&#xff1a;CSDN|Ringleader| 主要参考&#xff1a; 官方文档&#xff1a;Unity官方Input System手册与API官方测试用例&#xff1a;Unity-Technologies/InputS…

Aria2 WebUI控制台 任意文件读取漏洞复现(CVE-2023-39141)

0x01 产品简介 Aria2 WebUI控制台是用于下载文件的实用程序。它支持 HTTP(S)/FTP/SFTP/BitTorrent 和 Metalink 协议。aria2可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP/SFTP和BitTorrent下载文件,而从HTTP(S)/FTP/SFTP下载的数据上…

算法之【前缀和】讲解

前言&#xff1a; 我们首先要明白何前缀和&#xff1f; 前缀和就是快速求出数组中某一个连续区间的和。算法的时间复杂度会将一个等级&#xff01; 本文章主要讲解前缀和模板&#xff0c;分别为一维前缀和和二维前缀和。 一维前缀和&#xff1a; 第一步&#xff1a;预处理…

Vue+ElementUI渲染select下拉框

User.java /*实现getter和setter方法注解*/ Data public class User {private Integer id;private String name; } UserMapper.java Mapper public interface CommonUserMapper {/**查询所有*/List<CommonUser> selectAllCommonUser(); } UserMapper.xml <?xml …

makefile 编译动态链接库使用(.so库文件)

makefile 编译动态链接库使用&#xff08;.so库文件&#xff09; 动态链接库:不会把代码编译到二进制文件中&#xff0c;而是在运行时才去加载&#xff0c; 好处是程序可以和库文件分离&#xff0c;可以分别发版&#xff0c;然后库文件可以被多处共享 动态链接库 动态&#…

支付宝:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败&#xff0c;则…

2011-2022年全国各地级市互联网普及率/互联网宽带接入用户数数据

2011-2022年全国各地级市互联网宽带接入用户数/互联网普及率数据 1、时间&#xff1a;2011-2022年 2、范围&#xff1a;包括295个地级市 3、指标&#xff1a;行政区划代码、年份、地区、互联网宽带接入用户_千户、常住人口数_千人、户籍人口数_千人、每百人互联网宽带用户_常…

续签KES证书

MiniO KES&#xff08;密钥加密服务&#xff09;是 MinIO 开发的一项服务&#xff0c;旨在弥合在 Kubernetes 中运行的应用程序与集中式密钥管理服务 &#xff08;KMS&#xff09; 之间的差距。中央 KMS 服务器包含所有状态信息&#xff0c;而 KES 在需要执行与获取新密钥或更新…

docker运行redis,jdk,nginx

Redis 1.查询redis [rootlocalhost ~]# docker search redis NAME DESCRIPTION STARS OFFICIAL redis Redis is an open source key-value store that… 12620 …

网络安全全栈培训笔记(WEB攻防-51-WEB攻防-通用漏洞验证码识别复用调用找回密码重定向状态值)

第51天 WEB攻防-通用漏洞&验证码识别&复用&调用&找回密码重定向&状态值 知识点&#xff1a; 1、找回密码逻辑机制-回显&验证码&指向 2、验证码验证安全机制-爆破&复用&识别 3、找回密码客户端回显&Response状态值&修改重定向 4、…

革新区块链:代理合约与智能合约升级的未来

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 代理合约&#xff08;Prox…

地方债务余额数据,Shp、excel格式,2008-2020年,含公共财政收入、支出、负债率等多个字段

基本信息&#xff1a; 数据名称: 地方债务余额数据 数据格式: Shp、excel 数据时间: 2008-2020年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1zfzqsl地方政府债-债券数量(只)2zfzqye地方政府…