您好,欢迎访问一九零五行业门户网

iReport+jasperreport创建子表的几种方式(2)

昨天给大家讲了一种方式,今天换一种方式,就是说,将主报表的某一参数直接传递给子报表作为数据源,当然,这个参数是包含子报表的,这个主要是基于web开发,也是从网友那边拿来的,结合自己的经验再做一遍。 首先创建我们需要的javabean provincebean.java
昨天给大家讲了一种方式,今天换一种方式,就是说,将主报表的某一参数直接传递给子报表作为数据源,当然,这个参数是包含子报表的,这个主要是基于web开发,也是从网友那边拿来的,结合自己的经验再做一遍。
首先创建我们需要的javabean
provincebean.java
package test;import java.util.arraylist;public class provincebean{ private string provincename; private arraylist cities; public string getprovincename() { return provincename; } public void setprovincename(string provincename) { this.provincename = provincename; } public arraylist getcities() { return cities; } public void setcities(arraylist cities) { this.cities = cities; }}
citybean,java
package test;public class citybean{ private string cityname; public string getcityname() { return cityname; } public void setcityname(string cityname) { this.cityname = cityname; }}
注意一下,这里province是主表的元素其中他包含了citybean,那么显然citybean要作为子表之中的元素 
下面创建servlet类这个类我“本地化”一下,改动了一点
package test;
import java.io.ioexception;
import java.io.outputstream;
import java.net.urlencoder;
import java.util.arraylist;
import java.util.hashmap;
import java.util.map;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import com.sun.net.ssl.internal.ssl.debug;
import net.sf.jasperreports.engine.jrdatasource;
import net.sf.jasperreports.engine.jrexporterparameter;
import net.sf.jasperreports.engine.jasperfillmanager;
import net.sf.jasperreports.engine.jasperprint;
import net.sf.jasperreports.engine.jasperreport;
import net.sf.jasperreports.engine.data.jrbeancollectiondatasource;
import net.sf.jasperreports.engine.export.jrpdfexporter;
import net.sf.jasperreports.engine.util.jrloader;
public class childreportservlet extends httpservlet
{
private static final long serialversionuid = -1233414483047719876l;
@override
protected void doget(httpservletrequest req, httpservletresponse resp)
throws servletexception, ioexception
{
this.dopost(req, resp);
}
@override
protected void dopost(httpservletrequest req, httpservletresponse resp)
throws servletexception, ioexception
{
try
{
string root_path = this.getservletcontext().getrealpath(/);
root_path = root_path.replace('\\', '/');
string reportfilepath = root_path + ireport/parent_sub.jasper;
//debug.println(reportfilepath, root_path);
jrdatasource datasource = this.createdatasource();
map parameters = new hashmap();
parameters.put(subreport_dir, root_path + ireport/);
jasperreport report = (jasperreport)jrloader.loadobject(reportfilepath);
jasperprint jasperprint = jasperfillmanager.fillreport(report, parameters, datasource);
outputstream ouputstream = resp.getoutputstream();
resp.setcontenttype(application/pdf);
resp.setcharacterencoding(utf-8);
resp.setheader(content-disposition, attachment; filename=\ +urlencoder.encode(pdf报表, utf-8)+ .pdf\);
// 使用jrpdfexproter导出器导出pdf
jrpdfexporter exporter = new jrpdfexporter();
exporter.setparameter(jrexporterparameter.jasper_print, jasperprint);
exporter.setparameter(jrexporterparameter.output_stream, ouputstream);
exporter.exportreport();
ouputstream.close();
}catch(exception ex)
{
ex.printstacktrace();
}
}
private jrdatasource createdatasource()
{
//生成测试数据
arraylist provinces = new arraylist();
provincebean province = new provincebean();
province.setprovincename(山东);
arraylist cities = new arraylist();
citybean city = new citybean();
city.setcityname(济南);
cities.add(city);
city = new citybean();
city.setcityname(青岛);
cities.add(city);
city = new citybean();
city.setcityname(潍坊);
cities.add(city);
province.setcities(cities);
provinces.add(province);
province = new provincebean();
province.setprovincename(江苏);
cities = new arraylist();
city = new citybean();
city.setcityname(南京);
cities.add(city);
city = new citybean();
city.setcityname(无锡);
cities.add(city);
city = new citybean();
city.setcityname(苏州);
cities.add(city);
province.setcities(cities);
provinces.add(province);
return new jrbeancollectiondatasource(provinces);
}
}
我的文件列表
注意一下,要把jasperreport的jar文件拷贝到lib文件夹下,不然出错找度娘或者问我好了
下面用ireport制作我们需要的报表模板
这两个
打开ireport新建一个报表,数据源的话可以选择空数据源
在主表左侧属性fields中新建字段;从上面我们创建的bean中可以知道有两个字段需要建立一个是provincename一个是cities
创建时候要注意cities的数据类型是list
之后创建子表,这个一路next下去就ok了,将其放到任意一个bands中,如果没有特殊的偏好设置,在主表中点击子表它的属性应该会在右边栏显示,上上次的文章我已经说过要注意connection type属性,一个是不用,一个是和父表相同,还有一个use datasource。。。。这是这次我们要使用的,选择它然后在下面data source exception 中填入
new net.sf.jasperreports.engine.data.jrbeancollectiondatasource($f{cities})
如下图:$f{cities}就是我们要传递给字表的数据,只注重技术,不考虑美观,做的就随意了些
下面切换到子表的设计界面,把那些没有用到的bands删掉或者高度设为0
不知道你还记不记得上面我们创建的citybean,它包含一个属性参数,而我们传给子表的是一个city列表,那么在子表中我们要把它提取出来
所以,在子表的fields中新建字段cityname这个字段属性要和citybean里面的完全一样,不然就会出错的。
之后点击preview,当然是在主表中点击,会跳出些让输入什么的,不用管它,我们只要是想让ireport编译我们的文件形成后缀名为.jasper,也借此检查一下是否有错。
编译之后把主表和子表拷贝到之前说的那位置,运行服务器
打开:
需要源码请留邮箱,欢迎来探讨
其它类似信息

推荐信息