承接上篇
第四章主要介绍了分组交叉表的展现的内容以及在实际过程中可能会遇到的问题,案例仅仅是案例,希望小伙伴们能在实际开发中举一反三,切合实际去做分组交叉表,遇到的问题不要着急欢迎私我,有问题一起解决,共同进步,这是我们程序猿乐于助人的一面!报表之路本就繁琐,不能一蹴而就,万丈高楼平地起,耐心制作,jasperreport还你一个完美的报表!!!
本章开始在上一章基础上做柱形图的编写,后面的坑会越来越少,比起前面的简直就是小巫见大巫!话不多说,开始干活!
案例回顾
案例:
清华之下存在三个组(系),No1:计算机科学与技术(csGroup);No2:软件工程(seGroup);No3:物联网(webGroup);每个组(系)的人数都是150,具体分成三个班级:一班(40人)、二班(50人)、三班(60人);
沿用上一章的分组交叉表的数据,我们做一个分组的柱形图(三个柱形图用的同一组数据),后面拆分开我们三个组人数设置不一样,看看分组柱形图效果!!
数据准备
同上一章!!!!!
聊聊柱形图
我们都知道柱形图分为x轴(1月、2月等),y轴(0,20等)以及柱形图对应小标题(实际、目标),所以显示柱形图是需要这三个变量进行填充的,对应我们的案例x轴(一班、二班、三班),y轴(对应人数刻度),小标题(男生女生)。
画柱形图用到的数据源和交叉表一样都是用的同一个list,柱形图的数据是可以为null的,y轴的刻度是按照最大最小值去判断的,模板会自动筛选出数据源中的数据最大最小值,然后去自适应画出所需要的适中刻度。试问:如果数据源中的数据不存在最大值或者最小值,那么此时会存在什么问题?后面看看这个问题吧!!!
柱形图模板准备
1. 新建柱形图模板
- 打开子子报表demo2_sub1.jrxml,detail1里面写了分组交叉表,我们上一章说过,交叉表要保证纯净,防止数据覆盖的问题,所以我们新建一个detail2用于柱形图模板的编写;
- 拖动组件chart图表到detail2中 —> 选择Bar chart柱形图组件 —> 下一步进入柱形图设置
首先选择数据源Main Dataset --> 和交叉表一样选择Dataset1 --> 注入studentList数据源:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{studentList})
然后设置小标题,点击三个小点进去设置性别小标题,点击ok即可
然后设置x坐标班级显示,点击category设置进入选择grade班级,点击finish
最后设置y坐标显示数值,点击value的三个小点进入设置,选择personNumber,点击finish即可;
所有的设置差不多完成点击finish,看一下柱形图的样式,可以自行拖拽,看着位置合适就可以,这里提醒一下柱形图是占据实际大小的空间,你的柱形图有多大,位置就会占用多大的空间,记得柱形图最下方和detail2边缘重合,这样打印出来的柱形图不会占用其之下的空间,这个我们前面提到过了。
2. 柱形图的基本设置
2.1 中文字体设置
设置柱形图的字体为微软雅黑,涉及到设置的地方主要有小标题,x轴显示以及y轴显示的字体
点击柱形图,找到属性中的chart,将titile,subTitle以及legend的字体全部设置成微软雅黑,只要是你能看到的字体统统设置成微软雅黑。
再打开chart旁边的属性栏Chart Plot全部设置成微软雅黑,能看得到需要设置字体的地方。
这样字体就设置成功了!!!
2.2 给柱形图加个标题
打开chart属性,展开title设置,在expression中可以动态添加一个标题,这个标题可以从外部传进来接收一个参数,因为它本身是一个表达式的写法,我们这里就写个 测试标题 + 组名(动态)演示一下即可;标题设置完毕!!!
3. 编译模板测试效果
老样子重新编译模板,我们这里只改动了demo2_sub1.jrxml,所以只需要重新编译这个即可!
然后放入项目中重新编译项目rebuild,查看效果!!!
可以看到柱形图能正常显示,但是x轴对应班级中文显示不全,变成三个小点,那是因为班级太多了,左右文字放不下,导致挤压成了三个小点;解决办法:x轴显示数量最好不要太多,当然一般也不会太多,太多的话无论怎样x轴底下的文字都会挤压的;还有一种解决方式就是让x轴的文字旋转一个角度,比如向下展开。
方案1:将x轴显示字体进行角度偏移设置,选中柱形图找到属性设置如图,设置偏移70度,重新编译查看效果
文字差不多能显示出来了,但总归差那么点意思,数据太多画出来的柱形图就会不太美观。
方案2:数据减少到一开始的三条数据 注释掉测试的4-30条数据,重置x轴角度,回复正方向展示,再次编辑模板启动项目测试效果。
数据少,就显得好看多了,看着也很舒服,没啥太大问题!!!
看下整体预览效果:
分组柱形图效果出来了,至于柱形图位置可以自行调整,不做太多说明!
4. 聊聊分组柱形图存在的问题
4.1 分组柱形图重复打印的问题
显示为软件工程组,但是打印的柱形图为物联网柱形图(标题),发现打印的所有柱形图全是物联网柱形图,造成的原因是因为模板显示数据的时候,柱形图目前的打印方式是全局刷新,所以最后打印的柱形图覆盖了组内所有的柱形图,所以最终显示的是物联网柱形图!!
解决办法:设置柱形图打印时机,从全局刷新更改为实时刷新;
打开柱形图设置 —> 选中柱形图 —> 选择属性的chart —> 更改执行时机Evaluation Time 为 now(如图),重新编译demo1_sub1.jrxml模板进行测试:
查看效果:
分组柱形图完成!!! 注意设置柱形图刷新时机为now — 实时刷新!!
4.2 数值0造成的错误刻度(刻度科学计数法)
我们现在模拟的数据是正常数据,修改数据再次测试,置空所有数据,只保留一个一班男生人数为0,其他全部置空,再次测试!
y轴的刻度出现了科学计数法,出现原因是由于只有一个男生人数为0,导致柱形图无法判断人数的最大值和最小值,所以出现了刻度错乱 科学计数法;但是如果人数全是null并不会出现这个问题,默认会是0-1的刻度。
解决办法:业务层主动设置最大值和最小值,我这里的建议是找出所有人数中的最小值向下取整,最大值 + 1向上取整,保证最大最小值能够覆盖所有值,如果是像这样只有一个0的值,就可以设置最大值为1,最小值为0;然后将最大最小值注入到当前模板中,主动适配y轴的刻度(如图注入的位置)
第一步:添加最大最小值的表达式,业务层中的分组属性类需要添加两个字段personMax(人数最大值),personMin(人数最小值)
** 第二步:判断人数最大最小值,这里业务逻辑我就不写了,我默认就给个0和1**
给每个组都主动加上最大最小值,便于刻度计算!!!
** 第三步:模板中添加最大最小值字段并且在柱形图中注入最大最小值字段 ,打开demo1_sub1.jrxml模板,在fields中添加字段personMax和personMin,如图:注意类型都是Integer类型**
** 第四步:模板中注入最大最小值,如图: **
** 再次编译模板demo1_sub1.jrxml进行测试,重启项目进行测试 **
好了,效果出来了,很好的解决了科学计数法的问题,所以提醒一下遇到柱形图的时候记得设置最大最小值刻度,不要过度相信你的数据,防止类似的情况出现!!!
4.3 男女分类的外黑色边框去除(优化坑)
有一些不太喜欢黑色边框的,想直接显示分类的要求,所以这里选择一个优化坑,不算是坑吧,这里的设置无法直接通过设置模板属性来解决,必须要靠外部代码来实现,然后注入到模板中;具体代码如下:
ChartPlotEnclosingReport工具类:
public class ChartPlotEnclosingReport implements JRChartCustomizer {
@Override
public void customize(JFreeChart chart, JRChart jasperChart) {
if(chart.getLegend()!=null) {
chart.getLegend().setBorder(0.0, 0.0, 0.0, 0.0);
}
}
}
以上代码可以去除男女外侧的边框,我们需要将这个类打成一个可用的外部jar,怎么打的,大家可以百度,不细说了!!!
这是我通过idea打出来的可用jar,然后将外部jar导入到我们的模板项目中;选择项目右击build path添加外部jar到项目中;**
请注意:这里打包的jar路径一定要和你的项目中路径是一致的,不然就会提示找不到该类,记得选择.class文件不要选择.java,.class启动一次项目就会自动编译出来!!!**
然后选中柱形图,选择属性中的chart,注入Chart Customizers,选择add添加,选择自定义格式,搜索我们的自定义样式PiePlotEnclosingReport,点击finish即可。
最后我们重新编译模板,重新启动项目测试:
这样就可以实现去除男女分类的外黑色边框!!!
4.4 无数据不显示柱形图(优化坑)
有的时候,如果当前交叉表没有数据,那我们也不需要画出我们的柱形图,需求就是那么奇奇怪怪!这个比较简单,只需要对交叉表的list进行判断即可,模板中是自带判断逻辑的;统一都是在属性设置中的appearance中,有一个print when设置属性,表示当什么条件下打印当前组件,柱形图的判断可以写成list不为null && list.size() != 0的时候才会去打印,可以试一下!
设置完点击finish即可!
首先把list数据给注释掉,当前重新编译查看效果:
现在只剩个标题了,交叉表会自动不显示,同时柱形图也不显示了,实现了效果,小伙伴们可以根据自己的实际情况去设置柱形图是否显示!
5. 总结summary
到这差不多把柱形图的一些事宜就算是说完了,考虑不周的地方欢迎在评论区提示我,后续补充,更新的速度比较慢,主要也是自己有点懒,平时上完班抽空写一点,慢慢补全,边写边思考,确保不会存在错误的问题。小伙伴们若有参考的地方注意一下细节,还是那句话细节决定成败,报表之路本就繁琐,静下心来,终有收获。
下一章就准备写饼图了,也快接近了尾声,有疑问的欢迎评论区给我留言,一起进步!!!