承接上篇

第四章主要介绍了分组交叉表的展现的内容以及在实际过程中可能会遇到的问题,案例仅仅是案例,希望小伙伴们能在实际开发中举一反三,切合实际去做分组交叉表,遇到的问题不要着急欢迎私我,有问题一起解决,共同进步,这是我们程序猿乐于助人的一面!报表之路本就繁琐,不能一蹴而就,万丈高楼平地起,耐心制作,jasperreport还你一个完美的报表!!!
本章开始在上一章基础上做柱形图的编写,后面的坑会越来越少,比起前面的简直就是小巫见大巫!话不多说,开始干活!

案例回顾

案例:
清华之下存在三个组(系),No1:计算机科学与技术(csGroup);No2:软件工程(seGroup);No3:物联网(webGroup);每个组(系)的人数都是150,具体分成三个班级:一班(40人)、二班(50人)、三班(60人);
沿用上一章的分组交叉表的数据,我们做一个分组的柱形图(三个柱形图用的同一组数据),后面拆分开我们三个组人数设置不一样,看看分组柱形图效果!!

数据准备

同上一章!!!!!

聊聊柱形图

我们都知道柱形图分为x轴(1月、2月等),y轴(0,20等)以及柱形图对应小标题(实际、目标),所以显示柱形图是需要这三个变量进行填充的,对应我们的案例x轴(一班、二班、三班),y轴(对应人数刻度),小标题(男生女生)。

画柱形图用到的数据源和交叉表一样都是用的同一个list,柱形图的数据是可以为null的,y轴的刻度是按照最大最小值去判断的,模板会自动筛选出数据源中的数据最大最小值,然后去自适应画出所需要的适中刻度。试问:如果数据源中的数据不存在最大值或者最小值,那么此时会存在什么问题?后面看看这个问题吧!!!

柱形图模板准备

1. 新建柱形图模板

  1. 打开子子报表demo2_sub1.jrxml,detail1里面写了分组交叉表,我们上一章说过,交叉表要保证纯净,防止数据覆盖的问题,所以我们新建一个detail2用于柱形图模板的编写;
  2. 拖动组件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 {@Overridepublic 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

到这差不多把柱形图的一些事宜就算是说完了,考虑不周的地方欢迎在评论区提示我,后续补充,更新的速度比较慢,主要也是自己有点懒,平时上完班抽空写一点,慢慢补全,边写边思考,确保不会存在错误的问题。小伙伴们若有参考的地方注意一下细节,还是那句话细节决定成败,报表之路本就繁琐,静下心来,终有收获。
下一章就准备写饼图了,也快接近了尾声,有疑问的欢迎评论区给我留言,一起进步!!!

Jasperreport_6.18的吐血记录五之柱形图相关推荐

  1. Jasperreport_6.18的吐血记录一之安装软件

    开篇先说一说自己的心路历程,不想看的直接下拉 吐槽一下 软件以及jar包.字体配置下载链接 下载软件以及中文配置用法 总结 吐槽一下 2月份接到了来自公司的任务,使用报表技术编写一份月度报告,包括导出 ...

  2. Jasperreport_6.18的吐血记录三之简易交叉表 + 页面预览和导出

    承接上篇 第二章主要介绍了目录页的一些预览技巧,包括字体库注入到软件中,最后的目录页顺利的生成了,中间有几个小坑也给小伙伴们说了一下,报表在于要细心和耐心,不要急于求成,慢慢入手,终有成效! 本章准备 ...

  3. Jasperreport_6.18的吐血记录四之分组交叉表

    承接上篇 第三章主要说了交叉表的简单使用以及列出了在交叉表制作过程中可能会遇到的实际场景,还有就是实际场景中出现的一些坑,为了方便演示所以案例数据比较简单,希望小伙伴们认真阅读,细节很多,各位伙伴多注 ...

  4. Jasperreport_6.18的吐血记录二之目录页

    承接上篇 第一篇已经介绍了基本的安装方法和一些基本的配置,可能暂时还用不到,毕竟还没有做最后的导出,可能还不能看到效果,只能算是环境准备吧! 说一下编写思路,我的想法是分段编写,本章主要讲创建目录的案 ...

  5. FPGA实验记录五:I2C读取AHT10温湿度传感器

    FPGA实验记录五:I2C读取AHT10温湿度传感器 一.AHT10温湿度传感器 1. 简介 AHT10,新一代温湿度传感器在尺寸与智能方面建立了新的标准:它嵌入了始于回流焊的双列扁平无引脚SMD封装 ...

  6. 老师看完都吐血的五道题

    全世界只有3.14 % 的人关注了 爆炸吧知识 老师看完都要吐血的五道题哈哈哈哈哈 虽然小编觉得最后一答完全没问题 哈哈哈 图片来源于网络,如有侵权请联系删除. 你点的每个在看,我都认真当成了喜欢

  7. MySQL学习记录 (五) ----- 存储函数、存储过程和触发器

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  8. Altium Designer 18 速成实战 第五部分 PCB流程化设计常用操作(二)常用PCB快捷键的介绍

    Altium Designer 18 速成实战 第五部分 PCB流程化设计常用操作(二)常用PCB快捷键的介绍 常用系统快捷键----来自PCB联盟网,若侵联系即删. 目录 一.组合快捷键如何得来呢? ...

  9. Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)

    Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...

最新文章

  1. springcloud 之 bus 消息总线
  2. angular监听图片加载完成_angular1.0 如何监听页面渲染完毕 (转)
  3. 2018智能反欺诈洞察报告:黑中介、黑产智能化趋势明显
  4. 2020新年发红包Java实现
  5. 控件与应用程序许可授权的100%托管的先进控件IntelliLock
  6. C#与数据库访问技术总结(十七)
  7. html/css题库,DIV+CSS题库
  8. 【Python】Python3.7.3 源代码编译安装 CentOS
  9. Hadoop学习笔记—6.Hadoop Eclipse插件的使用
  10. 文章被推荐到首页,在哪里可以看到?
  11. 【转载】HBase基本概念和hbase shell常用命令用法
  12. 字节瞧不上老程序员?我很慌…
  13. C语言:判断一个数是否为素数
  14. colorkey口红怎么样_colorkey小众品牌口红唇釉效果好吗 – 爱分享
  15. 连接已重置,请检查代理
  16. 智能驾驶传感器的工作原理
  17. 第八章 内存共享 windows程序设计王艳平版
  18. COMSOL建立孔隙尺度多孔介质结构模型教程 AbyssFish
  19. bootstrap后台管理系统前后台实现(含数据库)
  20. 全栈开发 乾坤大挪移

热门文章

  1. 一个荣获JOLT大奖图书的背后故事
  2. 上海市水电煤热线电话一览
  3. 护照身份证识别阅读器
  4. java 根据点画不规则封闭图形
  5. 因为需求理解不到位,视频自动播放列表又重写了
  6. 【matlab学习笔记】安装
  7. 使用gitbash创建一个翻译词典
  8. 2022第37届深圳国际医疗器械展览会
  9. Ueditor自定义开发地图功能
  10. 通过神经网络将音频维度信息降低到某个维度