最近在做一个需求,就是根据当前的树形结构,输出到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}}
文档内容截图
4.2、输出文档
5、总结
以上就是一个小demo的实现过程,简单记录下,有什么问题可以探讨下。
下面附上poi-tl文档官网,github上也可以搜索到。
最后祝你写代码从头顺到尾!
学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
------不写代码不会凸的小刘