需求: 使用Jasper studio 生成pdf模板,模板中有个柱状图。
Jasper中使用Chart可以生成各种图形统计表,Jasper本身的文档中介绍饼状图较多,对其它的图形统计表价绍很少。我们这里,要使用的是BarChart:
- BarChart
BarChart中有四维参数需要设置,Series、Value、Category、Label:
这里举个例子来解释一些,假设我要统计1991年到2021年各产业的GDP,Value就是只GDP的具体数值,Category就是指年份[1991~ 2021],而Series就是指第一产业到第三产业,而Label我暂时不清楚啥意义,但也很重要。
网上大多数例子都说是忽略Label的,后面我会说明为啥不能如此。
- 参数设置
我们需要求是单柱状图,因此我们不需要Series,可以如下设置Legend=false:
为了对Chart进行数据绑定,我们需要新建一个DataSet,然后定义我们需要的各域:
<subDataset name="Dataset1" uuid="2aee24e3-d354-45a4-bf6a-7cc8200b4773">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="New Data Adapter "/>
<queryString>
<![CDATA[]]>
</queryString>
<field name="chartValue" class="java.lang.Integer"/>
<field name="chartCategory" class="java.lang.String"/>
</subDataset>
然后可以设置数据绑定:
完整代码如下:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{chartList})
注意chartList的类型是ArrayList。当然你也可以直接$P{chartList},然后类型用JRDataSource,Java代码传参的时候需要重载一个JRDataSource类。
同时需要注意的是 Reset on这里改为Report。
- 问题
所有的设置好了,然后我按网上的(忽略Label)方案,Java传参后却发现,无论我的ArrayList是多大,柱状图只显示最后一个数据。后来才发现,需要将Label设置为与Catogery一致就OK了:
<seriesExpression><![CDATA["series 1"]]></seriesExpression>
<categoryExpression><![CDATA[$F{
chartCategory}]]></categoryExpression>
<valueExpression><![CDATA[$F{
chartValue}]]></valueExpression>
<labelExpression><![CDATA[$F{
chartCategory}]]></labelExpression>
还有各问题是,柱状图的颜色的随机的,对于我们这周单柱状图,我们只需要一种颜色,修改Series color即可:
在这里添加一种颜色,然后选中即可。
效果:
- 完整代码参考
<?xml version=