前段时间做了一个需求:需要快速生成一份数据报告,里面包含了文字、图片和数据报表,同时生成的图形数据也可以随意修改。之前想着使用Apache POI来进行实现,在翻阅一些资料后,发现poi-tl更适合我们的业务,也更容易上手,于是对其进行了研究、也对其中的一些标签进行了封装,形成一个快速实现的工具类。
废话不多说,直接开撸。
1、Poi-tl简介
poi-tl是一个免费开源的Java类库,是基于Apache POI的模板引擎,纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。
因此在使用的时候需要实现设置好模板,就像Freemarker一样,但是比其简单,也易操作。
2、常用标签
2.1 文本
格式:{ {var}}
数据模型:
类型 |
描述 |
String |
纯文本 |
TextRenderData |
带有样式的文本 |
HyperLinkTextRenderData |
超链接文本 |
Object |
调用toString()方法转化成文本 |
例如:
java复制代码put("name", "Sayi");
put("author", new TextRenderData("000000", "Sayi"));
// 超链接
put("link",
new HyperLinkTextRenderData("website", "http://deepoove.com"));
2.2 图片
格式:以@开始,{ {@var}}
数据模型:
类型 |
描述 |
PictureRenderData |
可以支持本地图片、也可以支持远程的URL地址(主要讲URL图片转成BufferedImage) |
例如:
java复制代码/ 本地图片
put("local", new PictureRenderData(80, 100, "./sayi.png"));
// 图片流
put("localbyte", new PictureRenderData(80, 100, ".png", new FileInputStream("./logo.png")));
// 网络图片(注意网络耗时对系统可能的性能影响)
put("urlpicture", new PictureRenderData(50, 50, ".png", BytePictureUtils.getUrlBufferedImage("http://deepoove.com/images/icecream.png")));
2.3 表格
poi-tl默认实现了N行N列的样式(如下图),同时提供了当数据为空时,展示一行空数据的文案。
格式:以#开头,{ {#var}}
数据模型:
类型 |
描述 |
MiniTableRenderData |
该类主要也是调用TextRenderData,提供样式等 |
2.4 列表
格式:以*开头,{ {*var}}
数据模型:
类型 |
描述 |
NumbericRenderData |
该类主要也是调用TextRenderData,提供样式等 |
NumbericRenderData中支持列表样式,主要有罗马字符、有序无序等。
FMT_DECIMAL //1. 2. 3.
FMT_DECIMAL_PARENTHESES //1) 2) 3)
FMT_BULLET //● ● ●
FMT_LOWER_LETTER //a. b. c.
FMT_LOWER_ROMAN //i ⅱ ⅲ
FMT_UPPER_LETTER //A. B. C.
2.5 单系列图表
单系列图标,是指在图形中只展示一列数据,例如:单数据的柱状图,饼图等。
格式:先创建单系列图,然后在图表区格式 ->可选文字->标题。与文字一样,以{ {val}},如图:
数据模型:
类型 |
描述 |
ChartSingleSeriesRenderData |
该类提供了设置标题、类别等 |
例如:
java复制代码ChartSingleSeriesRenderData singleSeriesRenderData = new ChartSingleSeriesRenderData();
singleSeriesRenderData.setCategories(new String[] { "俄罗斯", "加拿大", "美国", "中国" }");
singleSeriesRenderData.setChartTitle("测试");
pie.setSeriesData(new SeriesRenderData("countries", new Integer[] { 17098242, 9984670, 9826675, 9596961 }));
2.6 多系列图表
在报表应用中,很多时候使用的是多系列组合,例如:柱状图与折线图组合等。
格式:与单系列一致。
数据模型:
类型 |
描述 |
ChartMultiSeriesRenderData |
该类提供了设置标题、类别等 |
例如:
java复制代码ChartMultiSeriesRenderData chart = new ChartMultiSeriesRenderData();
chart.setChartTitle("MyChart");
chart.setCategories(new String[] { "中文", "English" });
List<SeriesRenderData> seriesRenderData = new ArrayList<>();
seriesRenderData.add(new SeriesRenderData("countries", new Double[] { 15.0, 6.0 }));
seriesRenderData.add(new SeriesRenderData("speakers", new Double[] { 223.0, 119.0 }));
chart.setSeriesDatas(seriesRenderData);
3、代码封装
上述我们介绍了几种常用标签,更多的标签大家可以参考官方网站。
既然我们已经知道标签,那我们来进行代码的整合,主要是封装一个工具类,快速实现多标签一起生成报表。
引入jar包,我们以1.8.2版本为例:
xml复制代码<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.8.2</version>
</dependency>
3.1 创建标签类型
标签类型指程序中支持哪些标签,例如:文字,图片等。使用一个枚举来实现,方便后期进行扩展。
java复制代码/**
* @author: jiangjs
* @description: 标签类型
* @date: 2022/11/24 13:44
**/
public enum WordContentTypeEnum {
/**
* 文本
*/
TEXT,
/**
* 图片