Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源

用实体类实现报表数据填充

创建一个实体类

上一节已经介绍了如何传入参数填充报表,这一节要用另一个数据源来填充报表,也就是上一节介绍到的jasper.fill()方法的第三个参数JRDataSource,JavaBeanColletion可以用来生成一个JRDataSource的实现 类,所以我们可以传入实体类对象集合来实现报表数据填充。
这个实体类很简单,就是学生的各科成绩,排名等这些参数。

public class StudentScore {
    private String name;
    private String id;
    private String rank;
    private String yuwne;
    private String shuxue;
    private String english;
    private String shengwu;
    private String wuli;
    private String huaxue;
    private String rankone;
    public StudentScore(String name, String id, String rank, String yuwne, String shuxue, String english,
            String shengwu, String wuli, String huaxue, String rankone) {
        super();
        this.name = name;
        this.id = id;
        this.rank = rank;
        this.yuwne = yuwne;
        this.shuxue = shuxue;
        this.english = english;
        this.shengwu = shengwu;
        this.wuli = wuli;
        this.huaxue = huaxue;
        this.rankone = rankone;
    }
}

创建一个可以生成Bean对象的Jar包

注意:在模板设计中,Jaspersoft studio只能识别Jar包文件,如果要在模板中加入实体类对象集合作为数据源,就必须将生成实体类对象集合的一个工具类,还有实体类本身打包成一个Jar然后在Jaspersoft studio中导入该Jar包,否则studio是读不到这个实体类的对象的。
该工具类由一个静态方法组成,该方法返回实体类对象的集合,一定要记住该静态方法名,后面会用到。

package test.bean;

import java.util.ArrayList;

public class StudentBeanFactory {

    public static ArrayList getBeanCollection(){
           ArrayList dataList=new ArrayList<>();
            dataList.add(new StudentScore("王小白", "95279527", "3", "102", "113", "108", "80", "82", "83", "6"));
            dataList.add(new StudentScore("王小红", "95289528", "6", "103", "101", "134", "81", "76", "68", "10"));
        dataList.add(new StudentScore("王小黑", "95299529", "11", "99", "123", "133", "79", "88", "92", "12"));
        return dataList;
    }

}

然后用Eclipse将工具类和实体类导出成一个Jar包
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第1张图片

选择Export为Jar
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第2张图片

找到bean包,并只选中这个包,选择好保存的路径与包名,点击Finish即可生成一个Jar包
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第3张图片
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第4张图片

在Jaspersoft studio导入该jar包到项目中,跟Eclipse相同的操作。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第5张图片
点击External jar包,找到刚才生成的jar包,点击ok导入。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第6张图片

在JasperSoft Studio中创建一个实体类对象集合数据源

上面步骤完成后,创建一个新的adapter,命名为JavaBeanAdapter以Collection of JavaBeans为数据来源
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第7张图片
点击Next出现一个对话窗,这一步很关键,要把上面工具类的静态方法填入第二个输入框中,第二个输入框填入getBeanCollection,与工具类StudnetBeanFactory里的静态方法名一致。第一个输入框就是选定生成实体类对象集合的工具类,点击右侧的…

Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第8张图片
出现一个搜索框,填入student会出自动出现我们所导入的jar包里的类,注意如果没有导入Jar包,这里会无法搜索出我们所需要的结果。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第9张图片
点击OK后这个Adatper就创建完成了,接下来还要将之导入到报表模板中。
在项目结构预览outline中右键,然后选中Dataset and query进行配置数据源
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第10张图片
选中我们先前创建的数据源JavaBeanAdapter,Class框跟工具类一样输入student就会出现实体类StudentScore,选中后会发现下面的空白框里出现了实体类的字段,按照图中步骤操作,则实体类字段就成功地导入到模板中,我们就可以去引用它了。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第11张图片

由下图可以看到实体类的字段已经成功地导入模板了。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第12张图片
接下来,只需把原来的参数换为实体类即可。
如果这时把Fields里的实体类拉入报表模板时,会报如下错误。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第13张图片
意思是不能从SubDataSet中拉字段进模板中,这一步出现的原因是我在Outline这里点的不是Dataset and query,而是新建了一个Dataset,从上面的图就可以看出我的实体类字段单独出现在了MyBeanSet这里,这里的字段看来是不能直接拉入的。
将这个数据源删掉,重新设置,这点要点击Dataset and query,其实我上面的步骤是正确的,只是我以前创建了这个数据源而忘了删掉,于是就出现了不可拉入的错误。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第14张图片
正确的字段数据源应该是在主结构视觉中的Fields里的,如下图所示。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第15张图片
然后将之拉入到对应位置,设置与参数的设置一样,然后记得将变量total的表达式也要改为所有字段相加的和。
PS:yuwen被我笔误写成了yuwne,惭愧。。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第16张图片
记得改total变量的表达式。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第17张图片
点击Preview进行预览。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第18张图片
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第19张图片
可以看到,我们输入了三条数据,所以就填充生成了三个表格,那为什么第一页只生成了一个表格,而第二页就生成了二个表格呢。后面会详细说到,这与报表模板的元素结构有关。

将报表模板导入Java工程中,生成一个Html.

将报表模板编译成二进制文件,参考以前的步骤,熟悉的配方。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第20张图片
调用Jasperreports 方法,生成一个Html文件,方法如下。

package test;

import java.util.ArrayList;
import java.util.HashMap;


import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import test.bean.StudentBeanFactory;
import test.bean.StudentScore;

public class JasperBeanTest {
    public static void main(String[] args) {
        //1.设定模板二进制文件路径,一定要可以通过该路径找到该文件
        String reportPath="./src/JasperBeanSample.jasper";

        //2.设定报表的外部参数,map集合,这里要注意map的key值一定要与模板里Parameters的名字一致
        HashMap map=new HashMap<>();
        //3.新建一个集合,用于存放实体类对象
        ArrayList dataList=StudentBeanFactory.getBeanCollection();

        //4.用实体类对象集合生成一个可以传入的数据源
        JRBeanCollectionDataSource beanDataSource =
                  new JRBeanCollectionDataSource(dataList);
        try {
            //3.通过JasperFillManager工具进行填充报表,填充成功后会生成一个JasperPring文件,该文件用于输出
            JasperPrint jasperPrint=JasperFillManager.fillReport(reportPath, map,beanDataSource);
            //4.设定目标文件输出的路径
             String desFilePath="./src/JasperSampleBeanTest.html";
             //5.通过JasperExportManager管理工具进行报表输出文档,此外设定为输出Html文件
             JasperExportManager.exportReportToHtmlFile(jasperPrint,desFilePath);
        } catch (JRException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行工程,生成Html文件,刷新一下工程目录,可以看到新生成的Html文件,点开预览,可以看到三个实体类对象都已经传进去了。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第21张图片
如果我不只想传三条数据呢,是不是我们放入的Jar包只有三个学生成绩的对象,所以在Java工程中就只能放三条数据呢。我们在生成对象的静态方法里再添加一条数据,然后运行工程,看这条数据会不会被填充进去呢。

public static ArrayList getBeanCollection() {
        ArrayList dataList = new ArrayList<>();
        dataList.add(new StudentScore("王小白", "95279527", "3", "102", "113", "108", "80", "82", "83", "6"));
        dataList.add(new StudentScore("王小红", "95289528", "6", "103", "101", "134", "81", "76", "68", "10"));
        dataList.add(new StudentScore("王小黑", "95299529", "11", "99", "123", "133", "79", "88", "92", "12"));
        dataList.add(new StudentScore("王大白", "85298529", "21", "88", "100", "100", "66", "77", "94", "81"));
        return dataList;
    }

可以看到生成的Html里新添加了一个表格,这就是我们新添加的王大白同学,由此可知,放入模板里的Jar包只是一个模板,不管里面放几条数据,生成的二进制文件放到Java工程中都不会有传入数据条数的限制,即是你会传几条数据,就会生成几个表格。
Jasperreports6.3.1+Jaspersoft studio6.3.1进行报表开发实战教程(五)-实体类集合数据源_第22张图片

你可能感兴趣的:(JavaEE,Java报表开发设计)