您的位置:首页 > 编程语言 > ASP

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

2017-02-24 20:47 513 查看

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

创建一个实体类

上一节已经介绍了如何传入参数填充报表,这一节要用另一个数据源来填充报表,也就是上一节介绍到的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<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;
}

}


然后用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();
}
}
}


运行工程,生成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;
}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐