场景
若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出:
若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出_若依导出前端获得到后端的execl流之后怎么操作-CSDN博客
上面讲的是Excel的导出,如果是需要根据word文档的模板,比如根据数据库中数据或者其它数据源循环
根据模板填充数据,可填充文字、图片、表格、图表等数据。
poi-tl
poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。
poi-tl是一款采用Apache License 2.0开源协议的开源产品
poi-tl的github地址:
GitHub - Sayi/poi-tl: Generate awesome word(docx) with template
poi-tl技术文档地址:
Poi-tl Documentation
为什么使用poi-tl
poi-tl模板引擎功能
Word模板引擎功能 | 描述 |
---|---|
文本 | 将标签渲染为文本 |
图片 | 将标签渲染为图片 |
表格 | 将标签渲染为表格 |
列表 | 将标签渲染为列表 |
图表 | 条形图(3D条形图)、柱形图(3D柱形图)、面积图(3D面积图)、折线图(3D折线图)、雷达图、饼图(3D饼图)、散点图等图表渲染 |
If Condition判断 | 根据条件隐藏或者显示某些文档内容(包括文本、段落、图片、表格、列表、图表等) |
Foreach Loop循环 | 根据集合循环某些文档内容(包括文本、段落、图片、表格、列表、图表等) |
Loop表格行 | 循环复制渲染表格的某一行 |
Loop表格列 | 循环复制渲染表格的某一列 |
Loop有序列表 | 支持有序列表的循环,同时支持多级列表 |
Highlight代码高亮 | word中代码块高亮展示,支持26种语言和上百种着色样式 |
Markdown | 将Markdown渲染为word文档 |
Word批注 | 完整的批注功能,创建批注、修改批注等 |
Word附件 | Word中插入附件 |
SDT内容控件 | 内容控件内标签支持 |
Textbox文本框 | 文本框内标签支持 |
图片替换 | 将原有图片替换成另一张图片 |
书签、锚点、超链接 | 支持设置书签,文档内锚点和超链接功能 |
Expression Language | 完全支持SpringEL表达式,可以扩展更多的表达式:OGNL, MVEL… |
样式 | 模板即样式,同时代码也可以设置样式 |
模板嵌套 | 模板包含子模板,子模板再包含子模板 |
合并 | Word合并Merge,也可以在指定位置进行合并 |
用户自定义函数(插件) | 插件化设计,在文档任何位置执行函数 |
注:
博客:
霸道流氓气质-CSDN博客
实现
1、快速开始
注意这里poi-tl与poi的对应关系
当前poi-tl的最新版本为1.12.2,需要对应poi的版本5.2.2+
如果poi不是用的该版本,则找对应版本的对应关系。
比如这里使用的poi版本为
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>
则需要引入对应的poi-tl的版本为1.8.2
<dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.8.2</version> </dependency>
相应的文档地址
Poi-tl Documentation
2、新建模板文件,以docx后缀结尾
并在模板文件中需要显示内容的位置,添加标签
{{title}}
文本标签测试
新建渲染方法
public static void render(Map<String, Object> map){ XWPFTemplate template = XWPFTemplate.compile("D://test//temp.docx").render(map); try { FileOutputStream out = new FileOutputStream("D://test//output.docx"); template.write(out); out.flush(); out.close(); template.close(); } catch (IOException e) { e.printStackTrace(); } }
其中temp.docx是模板文件,oupput.docx是输出的文件
调用渲染方法
render(new HashMap<String, Object>(){{ put("title", "Hi, poi-tl Word模板引擎"); }});
运行结果
3、文本标签复杂属性
数据模型
String :文本
TextRenderData :有样式的文本
HyperLinkTextRenderData :超链接文本
Object :调用 toString() 方法转化为文本
示例代码
HashMap<String, Object> data = new HashMap<>(); data.put("name", "Sayi"); data.put("start_time", "2019-08-04"); data.put("author", new TextRenderData("000000", "Sayi")); data.put("author2", new TextRenderData("霸道的程序猿", StyleBuilder.newBuilder() .buildColor("00FF00")//颜色 .buildStrike()//删除线 .buildBold()//粗体 .buildItalic()//斜体 .buildUnderLine()//下划线 .buildFontFamily("微软雅黑")//字体 .buildFontSize(12)//字号 .build() )); // 超链接 data.put("link", new HyperLinkTextRenderData("website", "卅一")); // 锚点 data.put("anchor", new HyperLinkTextRenderData("anchortxt", "anchor:appendix1")); render(data);
运行效果
4、图片标签
图片标签以@开始:{{@var}}
示例代码
HashMap<String, Object> data = new HashMap<>(); // 本地图片 data.put("local", new PictureRenderData(80, 100, "D://test//test.png")); // 图片流 try { data.put("localbyte", new PictureRenderData(80, 100, ".png", new FileInputStream("D://test//test.png"))); } catch (FileNotFoundException e) { e.printStackTrace(); } // 网络图片(注意网络耗时对系统可能的性能影响) data.put("urlpicture", new PictureRenderData(50, 50, ".png", BytePictureUtils.getUrlBufferedImage("http://deepoove.com/images/icecream.png"))); // java 图片 try { BufferedImage image = ImageIO.read(new File("D://test//test.png")); data.put("bufferimage", new PictureRenderData(80, 100, ".png", image)); } catch (IOException e) { e.printStackTrace(); } render(data);
运行结果
5、表格标签
表格标签以#开始:{{#var}}
示例代码
HashMap<String, Object> data = new HashMap<>(); RowRenderData header = RowRenderData.build(new TextRenderData("000000", "姓名"), new TextRenderData("000000", "学历")); RowRenderData row0 = RowRenderData.build("张三", "研究生"); RowRenderData row1 = RowRenderData.build("李四", "博士"); data.put("table", new MiniTableRenderData(header, Arrays.asList(row0, row1))); render(data);
运行结果
6、图表标签-饼状图
模板文件中插入图表-饼状图
右击饼图,查看可选文字-输入
{{pieChart}}
编写测试代码
HashMap<String, Object> data = new HashMap<>(); ChartSingleSeriesRenderData pie = new ChartSingleSeriesRenderData(); pie.setChartTitle("ChartTitle"); pie.setCategories(new String[] { "俄罗斯", "加拿大", "美国", "中国" }); pie.setSeriesData(new SeriesRenderData("countries", new Integer[] { 17098242, 9984670, 9826675, 9596961 })); data.put("pieChart", pie); render(data);
运行结果
其它图表使用参考官网。
7、pot-tl还有更多的功能、模板、示例代码可参考官网