JasperReport中使用多个数据源的方法.docx
- 文档编号:23322246
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:48
- 大小:2.51MB
JasperReport中使用多个数据源的方法.docx
《JasperReport中使用多个数据源的方法.docx》由会员分享,可在线阅读,更多相关《JasperReport中使用多个数据源的方法.docx(48页珍藏版)》请在冰豆网上搜索。
JasperReport中使用多个数据源的方法
JasperReport中使用多个数据源的方法
廖章2012年4月15日
几经探索,终于寻找到在一个报表中使用多个数据源的方法,现在分享出来以便后来者少走弯路!
网上很多资料说多数据源只能使用子报表方式,呵呵!
一个报表中使用多个数据源的场景:
在同一张报表中,既有交叉表又有饼状图,交叉表与饼状图分别使用不同的数据源。
具体报表格式如下:
市民需求情况(2012年1月~2012年3月)
办事指南
公共服务
企业服务
社区服务
数量
458
833
74
244
占比
28%
52%
5%
15%
第一、使用iReport报表设计器设计报表(本人使用iReport4.5.1版本),步骤:
1.新建空白报表。
打开iReport软件,点击【File】菜单的【New】子菜单,在弹出的Newfile窗口中按红色框指示选择,然后点击右下角中间的【LaunchReportWizard】按钮,使用向导来新建一张报表。
在下一个窗口中,输入报表文件名以及选择保存的目录路径,点击【下一步】:
在弹出的新窗口中,设置报表使用的查询连接或数据源,可以使用一个jdbc连接或javaobject数据源,如果前你已经设置有数据源,可以选择你原来的数据源,或者你可以点击【New】按钮新建另外一个数据源,这里我选择新建一个数据源。
新建数据源,这里新建一个JavaBean数据源:
在弹出的设置Fields窗口中继续点击【下一步】
在弹出的设置Groupby…(分组)窗口中继续点击【下一步】
新建报表最后一步,按【完成】按钮,至此新建一张空白报表完成。
2.设置报表。
由于目标报表只放置一个交叉表和饼状图表,故报表只需要报表的title和detail两部分其余的pageheader、columnheader等不需要(高度设置为0)
把其他不需要的band(栏)高度设置为0后,报表如下图:
3.为报表添加三个参数:
reportTitle(报表标题)、crosstabData(交叉表的数据)、pieData(饼状图数据)。
添加reportTitle参数,并设置其属性——ParametersClass选择java.lang.String:
添加pieData(饼状图数据参数),并设置其ParameterClass为net.sf.jasperreports.engine.JRDataSource(这一步很重要,否则等会程序传数据时会出错),点击ParameterClass行的最右边【…】按钮后弹出一个小窗口,如下图示:
【添加crosstabData(交叉表数据参数),创建方法和上面的创建饼状图数据参数一样。
】
4.两个参数添加完成后,我们需要设置交叉表和饼状图的子数据集(subDataSet)。
在最右边的ReportInspector面板的报表名中点击右键,在弹出的菜单中选择【AddDataset】:
先新建交叉表的subDataset,在弹出的NewDataSet窗口中输入dataset的名称,然后点击【下一步】:
在这一步选择我们刚才新建报表时的数据源,然后点击【下一步】:
继续点击【下一步】,直至完成。
新建饼状图的subDataset,过程和创建交叉表一样,只是在选择数据源时,需要新建另外一个数据源——ds_bean_pie:
5.subDataset创建完成,还需要为它设置Field(字段)。
我们直接从javabean对象中引入field,步骤如下:
1)设置javabean的classpath。
点击【工具】菜单,在弹出的子菜单中选择【选项】:
在弹出的选项窗口中,点击【Classpath】标签页,点击左边的【AddFolder】按钮,然后选择你的javabean类所在的目录(注意:
是你的javabean的class文件所在的目录,不包括类所在的包路径),如下图所示:
点击【确认】按钮,完成classpath的设置。
2)为交叉表的subDataset设置Field。
在右边ReportInspector的ds_crosstab中点击右键,在弹出的菜单中选择【EditQuery】:
在弹出窗口中选择【JavaBeanDatasource】标签页,然后在Classname中输入javabean(包括包名),点击【Readattributes】按钮,在属性列表中选择需要在交叉表显示的属性,点击【Addselectedfield(s)】按钮,最后点击【OK】按钮。
这样即可完成为subDataset添加Field,效果如下:
3)为饼状图的subDataset设置Field的过程也是一样,只是对于的javabean不同而已。
6.接下来我们需要把交叉表组件添加到报表中。
在组件面板中,把Crosstab组件拖到报表的detail区域,这时弹出一个设置交叉表组件的向导:
选择Dataset,这里选择ds_crosstab:
定义行分组字段,这里我选择axisy字段:
选择列分组,这里我选择typename:
选择交叉表的数据字段,这里我选择amount字段,Function我选择Nothing,因为我在传数据入交叉表时,已经把数据准备好了,所以不需要jasper帮忙处理。
设置交叉表的背景色、是否需要添加行分组汇总、列分组汇总以及是否需要显示表格线等。
最后按【完成】按钮,这时交叉表组件已经添加到报表中:
7.添加饼状图组件。
在组件面板中,把Chart组件拖到报表的detail区域,这时弹出一个设置chart组件的向导,选择饼状图,然后点击【OK】按钮:
选择饼状图的图例及其数值的表达式字段:
按【完成】按钮后,图表已经添加到报表中,调整其宽度和高度,效果如下:
至此,报表的样式基本设计完成。
接下来才是关键,呵呵
第二、为交叉报表和饼状图的设置运行时数据源。
步骤如下:
1.为交叉表设置运行时数据源。
在报表的crosstab组件点击右键,在弹出的菜单中选择【CrosstabData】项:
在弹出的Crosstabdata窗口的Datasetrun部分,在Connection/DatasourceExpression下拉框中,选择Usedatasourceexpression。
在接下来的输入框中输入我们之前定义的交叉表数据参数$P{crosstabData}或点击输入框右边小图标,在弹出的窗口中选择crosstabData,最后点击【Close】按钮完成。
2.为饼状图设置运行时数据源。
在报表的饼状图组件点击右键,在弹出的菜单中选择【ChartData】项:
在弹出的Chartdetails窗口的Datasetrun部分,在Connection/DatasourceExpression下拉框中,选择Usedatasourceexpression。
在接下来的输入框中输入我们之前定义的饼状图数据参数$P{pieData}或点击输入框右边小图标,在弹出的窗口中选择pieData,最后点击【Close】按钮完成。
第三、其他的设置。
设置交叉表字段的字体及其输出中文:
设置饼状图的字体等属性:
第四步:
编译报表文件。
编译成功后将会生成一个jasper后缀的文件:
subDataSetReport.jasper。
第五步:
在Java中生成报表,所需jar文件包括:
jasperreports-4.5.1.jar、jasperreports-applet-4.5.1.jar、jasperreports-fonts-4.5.1.jar、jasperreports-javaflow-4.5.1.jar、jcommon-1.0.15.jar、jfreechart-1.0.12.jar、commons-digester-2.1.jar、groovy-all-1.7.5.jar、iText-2.1.7.jar、iTextAsian.jar。
代码如下:
packagecom.digitalchina.smartcity.myreport;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importnet.sf.jasperreports.engine.JRException;
importnet.sf.jasperreports.engine.JRExporterParameter;
importnet.sf.jasperreports.engine.JasperFillManager;
importnet.sf.jasperreports.engine.JasperPrint;
importnet.sf.jasperreports.engine.JasperReport;
importnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
importnet.sf.jasperreports.engine.export.JRPdfExporter;
importnet.sf.jasperreports.engine.util.JRLoader;
importcom.digitalchina.smartcity.myreport.vo.DataForPie;
importcom.digitalchina.smartcity.myreport.vo.DataForTable;
publicclassTestExampleReport{
publicstaticvoidmain(String[]args){
try{
TestExampleReporttestReport=newTestExampleReport();
testReport.genReport();
}catch(Exceptionex){
ex.printStackTrace();
}
}
/**
*@Method:
genReport
*@Author:
Liaolz
*@Description:
生成报表文件
*
*@param
*@returnvoid
*@throws
*/
publicvoidgenReport()throwsFileNotFoundException,IOException,JRException{
System.out.println("=========开始生成报表=========");
longstartTime=System.currentTimeMillis();
//准备报表数据
List
List
String[][]arrData={{"01","办事指引","458"},{"02","公共服务","833"},{"03","企业服务","74"},{"04","社区服务","244"}};
for(String[]data:
arrData){
//交叉表数据
DataForTabledataCrosstab=newDataForTable();
dataCrosstab.setId(data[0]);
dataCrosstab.setAxisy("数量");
dataCrosstab.setTypename(data[1]);
dataCrosstab.setAmount(data[2]);
listDataCrosstab.add(dataCrosstab);
//饼状图数据
DataForPiedataPie=newDataForPie();
dataPie.setPieId(data[0]);
dataPie.setPieTypename(data[1]);
dataPie.setPieAmount(Integer.parseInt(data[2]));
listDataPie.add(dataPie);
}
/**
for(inti=0;i<5;i++){
//交叉表数据
DataForTabledata=newDataForTable();
data.setId(""+i);
data.setAxisy("占比");
data.setAmount(""+(((i+5)/total*100))+"%");
data.setTypename("非常好_"+i);
listData.add(data);
}*/
//报表主数据源
JRBeanCollectionDataSourceds=newJRBeanCollectionDataSource(listDataCrosstab);
//交叉表数据源
JRBeanCollectionDataSourcedsCrosstab=newJRBeanCollectionDataSource(listDataCrosstab);
//饼状图数据源
JRBeanCollectionDataSourcedsPie=newJRBeanCollectionDataSource(listDataPie);
Map
parameters.put("reportTitle","市民需求情况(2012年1月~2012年3月)");
parameters.put("crosstabData",dsCrosstab);
parameters.put("pieData",dsPie);
//生成JasperPrint
JasperReportreport=(JasperReport)JRLoader.loadObject(newFile("D:
\\iReport\\subDataSetReport.jasper"));
JasperPrintjasperPrint=JasperFillManager.fillReport(report,parameters,ds);
OutputStreamouputStream=newFileOutputStream(newFile("d:
\\iReport\\out\\subDataSetReport.pdf"));
//使用JRPdfExproter导出器导出pdf
JRPdfExporterexporter=newJRPdfExporter();
//设置JasperPrintList
exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,ouputStream);
exporter.exportReport();
ouputStream.close();
System.out.println("=========生成报表完成,所需时间:
"+((System.currentTimeMillis()-startTime)/1000)+"秒=========");
}
}
生成的PDF报表:
完整的jrxml文件:
xmlversion="1.0"encoding="UTF-8"?
>
xsi="http: //www.w3.org/2001/XMLSchema-instance"xsi: schemaLocation="name="subDataSetReport"language="groovy"pageWidth="595"pageHeight="842"columnWidth="555"leftMargin="20"rightMargin="20"topMargin="20"bottomMargin="20"> [CDATA[]]> [CDATA[amount]]> [CDATA[axisy]]> [CDATA[id]]> [CDATA[typename]]> [CDATA[]]> [CDATA[pieAmount]]> [CDATA[pieId]]> [CDATA[pieTypename]]> [CDATA[""]]>
[CDATA[$P{reportTitle}]]>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JasperReport 使用 数据源 方法
![提示](https://static.bdocx.com/images/bang_tan.gif)