第五章主要介绍了柱形图的一些细节操作和过程中可能会遇到的一些坑,希望小伙伴们在实践中能够及时规避一些问题,防止后续问题的出现,报表需要细心再细心。本章准备说一下饼图,饼图和柱形图类似,用的数据源也是交叉表中的数据,不过饼图的一大特色就是将各个数据按照占比会进行扇形分隔。如图类似:
本章说完,差不多报表这一块的东西我们就差不多说完了,因为我目前接触到的仅仅局限于此,差不多是够用了,可能有些伙伴用了折线图,其实也是类似的;还有一些伙伴会遇到用一些列表展示数据,会使用到table组件,本人也没花时间去研究,后续可能会补充上,暂时先不论!本章说完,我会最后给我们的案例补充一个目录以及时间,进一步完善我们的demo!
继续沿用我们的案例:清华之下存在三个组(系),No1:计算机科学与技术(csGroup);No2:软件工程(seGroup);No3:物联网(webGroup);然后我们的饼图数据准备重新写三个不一样的数据,画出不一样的饼图出来;
计科:一班:30人; 二班:30人;三班:40人
软工:一班:40人; 二班:20人;三班:40人;
物联:一班:50人; 二班:40人;三班:10人;
这三组数据能够成饼图的组成,文字用于显示饼图的每个分类,数据用于进行饼图的分割,所以只需要两个字段即可;
- 清华学生类沿用,虽然里面有三个字段我们只用到班级和人数
- QHGroupStudentInfo类 添加饼图的list数据源
public class QHGroupStudentInfo {
private String groupName;
private Integer personMax;
private Integer personMin;
private List studentList;
private List pieStudentList;
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public List getStudentList() {
return studentList;
}
public void setStudentList(List studentList) {
this.studentList = studentList;
}
public Integer getPersonMax() {
return personMax;
}
public void setPersonMax(Integer personMax) {
this.personMax = personMax;
}
public Integer getPersonMin() {
return personMin;
}
public void setPersonMin(Integer personMin) {
this.personMin = personMin;
}
public List getPieStudentList() {
return pieStudentList;
}
public void setPieStudentList(List pieStudentList) {
this.pieStudentList = pieStudentList;
}
}
- StudentFactory学生工厂类中生成新的三个饼图学生数据
public class StudentFactory {
public static List getQHGroupStudentInfo(){
List qhGroupStudentInfoList = new ArrayList<>();
// 计科组
QHGroupStudentInfo ceGroup = new QHGroupStudentInfo();
ceGroup.setGroupName("计算机科学与技术");
ceGroup.setPersonMax(1);
ceGroup.setPersonMin(0);
ceGroup.setStudentList(getQHComputerStudent());
ceGroup.setPieStudentList(getPieOne());
// 软工组
QHGroupStudentInfo seGroup = new QHGroupStudentInfo();
seGroup.setGroupName("软件工程");
seGroup.setPersonMax(1);
seGroup.setPersonMin(0);
seGroup.setStudentList(getQHComputerStudent());
seGroup.setPieStudentList(getPieTwo());
// 物联网组
QHGroupStudentInfo webGroup = new QHGroupStudentInfo();
webGroup.setGroupName("物联网");
webGroup.setPersonMax(1);
webGroup.setPersonMin(0);
webGroup.setStudentList(getQHComputerStudent());
webGroup.setPieStudentList(getPieThree());
qhGroupStudentInfoList.add(ceGroup);
qhGroupStudentInfoList.add(seGroup);
qhGroupStudentInfoList.add(webGroup);
return qhGroupStudentInfoList;
}
public static List getQHComputerStudent(){
List infoList = new ArrayList<>();
QHComputerStudent student1 = new QHComputerStudent();
student1.setGender("男");
student1.setGrade("一班");
student1.setPersonNumber(0);
QHComputerStudent student2 = new QHComputerStudent();
student2.setGender("男");
student2.setGrade("二班");
student2.setPersonNumber(null);
QHComputerStudent student3 = new QHComputerStudent();
student3.setGender("男");
student3.setGrade("三班");
student3.setPersonNumber(null);
QHComputerStudent student4 = new QHComputerStudent();
student4.setGender("女");
student4.setGrade("一班");
student4.setPersonNumber(null);
QHComputerStudent student5 = new QHComputerStudent();
student5.setGender("女");
student5.setGrade("二班");
student5.setPersonNumber(null);
QHComputerStudent student6 = new QHComputerStudent();
student6.setGender("女");
student6.setGrade("三班");
student6.setPersonNumber(null);
infoList.add(student1);
infoList.add(student2);
infoList.add(student3);
infoList.add(student4);
infoList.add(student5);
infoList.add(student6);
// for (int i=4; i<=30; i++){
// QHComputerStudent student7 = new QHComputerStudent();
// student7.setGender("男");
// student7.setGrade(i+"班");
// student7.setPersonNumber(i*1);
// QHComputerStudent student8 = new QHComputerStudent();
// student8.setGender("女");
// student8.setGrade(i+"班");
// student8.setPersonNumber(i*2);
// infoList.add(student7);
// infoList.add(student8);
// }
return infoList;
}
public static List getPieOne(){
List list = new ArrayList<>();
QHComputerStudent t1 = new QHComputerStudent();
t1.setGrade("一班");
t1.setPersonNumber(30);
QHComputerStudent t2 = new QHComputerStudent();
t2.setGrade("二班");
t2.setPersonNumber(30);
QHComputerStudent t3 = new QHComputerStudent();
t3.setGrade("三班");
t3.setPersonNumber(40);
list.add(t1);
list.add(t2);
list.add(t3);
return list;
}
public static List getPieTwo(){
List list = new ArrayList<>();
QHComputerStudent t1 = new QHComputerStudent();
t1.setGrade("一班");
t1.setPersonNumber(40);
QHComputerStudent t2 = new QHComputerStudent();
t2.setGrade("二班");
t2.setPersonNumber(20);
QHComputerStudent t3 = new QHComputerStudent();
t3.setGrade("三班");
t3.setPersonNumber(40);
list.add(t1);
list.add(t2);
list.add(t3);
return list;
}
public static List getPieThree(){
List list = new ArrayList<>();
QHComputerStudent t1 = new QHComputerStudent();
t1.setGrade("一班");
t1.setPersonNumber(50);
QHComputerStudent t2 = new QHComputerStudent();
t2.setGrade("二班");
t2.setPersonNumber(40);
QHComputerStudent t3 = new QHComputerStudent();
t3.setGrade("三班");
t3.setPersonNumber(10);
list.add(t1);
list.add(t2);
list.add(t3);
return list;
}
public static List getStudentInfo(){
List studentInfoList = new ArrayList<>();
StudentInfo studentInfo = new StudentInfo();
// 测试简易交叉表数据
studentInfo.setQhComputerStudentList(getQHComputerStudent());
// 测试分组交叉表
studentInfo.setGroupStudentInfoList(getQHGroupStudentInfo());
studentInfoList.add(studentInfo);
return studentInfoList;
}
}
饼图模板准备
1. 新建饼图模板
- 打开子子报表demo1_sub1.jrxml,新建的detail3用于饼图组件的存放,同时field中新建一个饼图数据源变量pieStudentList,类型为list
- 新建用于注入饼图的数据集dataset2,右击模板新建create dataset,选择创建一个空的数据集即可;在创建好的dataset2中新建用于饼图显示的字段personNumber(人数)和grade(班级);注意字段类型的一一对应,数据类型保持一致
- 拖动chart组件到detail3中,选择Pie chart表示饼图,点击next,数据源选择dataset2,数据源注入饼图:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{pieStudentList}),设置如图,点击finish即可!
**设置文字为中文(微软雅黑),基本和柱形图设置一样,看得到的字体都设置为中文**
** 上一章提到过图表打印时机,设置为实时打印,默认report改为now **
** 给饼图加个小标题— 测试饼图小标题 **
大体是没有什么问题了,但是注意饼图注入的数据不像柱形图那样可以有null值,饼图数据不能为空,不然就会报错!饼图要么不注入,要么注入一定要给值;不能给某个数据置空放进来,切记切记!!!
设置同柱形图(数据为空或者数据为null都可以不打印)
这里就不做演示了
这个部分在设置的时候已经做过调整了,原理和柱形图是一样的,改为实时刷新即可
4.3 对于饼图去除文字和小标题的外黑色边框这个部分和柱形图原理是一样的,需要进行自定义样式校验;
自定义样式配置类:PiePlotEnclosingReport
public class PiePlotEnclosingReport implements JRChartCustomizer {
@Override
public void customize(JFreeChart chart, JRChart jasperChart) {
LegendTitle legend = chart.getLegend();
PiePlot plot = (PiePlot)chart.getPlot();
plot.setLabelBackgroundPaint(null);
plot.setLabelOutlinePaint(null);
plot.setLabelShadowPaint(null);
plot.setShadowXOffset(0.0D);
plot.setShadowYOffset(0.0D);
legend.setFrame(BlockBorder.NONE);
}
}
首先导出配置类作为可用jar,然后注入到模板中,这里的设置也是同柱形图;
导出可执行jar之后,注入到项目中的饼图,首先将jar注入到项目中,在饼图中注入我们自定义的配置类,点击finish即可,如图设置:
配置完成之后,重新编译模板,别忘了重新编译项目,查看效果:
导出的pdf和word也没有问题!
饼图的数据切记不可以塞入null值,不然会报错,例如我们修改一班级人数为null看看会发生啥,可以看到是空指针异常,所以切记,不要有null数据!!!
差不多到这就把饼图说完了,前面铺垫了很多的东西,所以后面这边说起来速度快了很多,还是那句话报表需要你的细心操作,jasperreport真的是个很好的报表工具了,不收费开源,用好了还确实好用,做出来的报表还蛮有感觉的,毕竟都是小伙伴们拼搏了几个周期弄出来的,希望大家看了我的教程之后,你们报表之路能够更加稳健,期待更好的我们!
总的来说,报表的知识点就说完了,下一章应该是最后一章了,准备给现在的案例加一个目录,然后封面加个时间,也给我们开头说的封面和图片和文字不能重叠的情况做一个收尾,写到这里还真的是不容易,磕磕绊绊算是写完了,如果有不明白的地方欢迎大家留言,多多提点小弟~~!!!



