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

来源:互联网 发布:单片机反编译 编辑:程序博客网 时间:2024/06/14 07:42

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

创建一个实体类

上一节已经介绍了如何传入参数填充报表,这一节要用另一个数据源来填充报表,也就是上一节介绍到的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;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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

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

package test.bean;import java.util.ArrayList;public class StudentBeanFactory {    public static ArrayList<StudentScore> getBeanCollection(){           ArrayList<StudentScore> 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;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

然后用Eclipse将工具类和实体类导出成一个Jar包 
这里写图片描述

选择Export为Jar 
这里写图片描述

找到bean包,并只选中这个包,选择好保存的路径与包名,点击Finish即可生成一个Jar包 
这里写图片描述 
这里写图片描述

在Jaspersoft studio导入该jar包到项目中,跟Eclipse相同的操作。 
这里写图片描述 
点击External jar包,找到刚才生成的jar包,点击ok导入。 
这里写图片描述

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

上面步骤完成后,创建一个新的adapter,命名为JavaBeanAdapter以Collection of JavaBeans为数据来源 
这里写图片描述 
点击Next出现一个对话窗,这一步很关键,要把上面工具类的静态方法填入第二个输入框中,第二个输入框填入getBeanCollection,与工具类StudnetBeanFactory里的静态方法名一致。第一个输入框就是选定生成实体类对象集合的工具类,点击右侧的…

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

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

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

将报表模板编译成二进制文件,参考以前的步骤,熟悉的配方。 
这里写图片描述 
调用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<String,Object> map=new HashMap<>();        //3.新建一个集合,用于存放实体类对象        ArrayList<StudentScore> 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();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

运行工程,生成Html文件,刷新一下工程目录,可以看到新生成的Html文件,点开预览,可以看到三个实体类对象都已经传进去了。 
这里写图片描述 
如果我不只想传三条数据呢,是不是我们放入的Jar包只有三个学生成绩的对象,所以在Java工程中就只能放三条数据呢。我们在生成对象的静态方法里再添加一条数据,然后运行工程,看这条数据会不会被填充进去呢。

public static ArrayList<StudentScore> getBeanCollection() {        ArrayList<StudentScore> 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;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可以看到生成的Html里新添加了一个表格,这就是我们新添加的王大白同学,由此可知,放入模板里的Jar包只是一个模板,不管里面放几条数据,生成的二进制文件放到Java工程中都不会有传入数据条数的限制,即是你会传几条数据,就会生成几个表格。 
这里写图片描述

0
 
0
阅读全文
0 0
原创粉丝点击