iReport柱状图.docx

上传人:b****8 文档编号:30618575 上传时间:2023-08-18 格式:DOCX 页数:14 大小:20.99KB
下载 相关 举报
iReport柱状图.docx_第1页
第1页 / 共14页
iReport柱状图.docx_第2页
第2页 / 共14页
iReport柱状图.docx_第3页
第3页 / 共14页
iReport柱状图.docx_第4页
第4页 / 共14页
iReport柱状图.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

iReport柱状图.docx

《iReport柱状图.docx》由会员分享,可在线阅读,更多相关《iReport柱状图.docx(14页珍藏版)》请在冰豆网上搜索。

iReport柱状图.docx

iReport柱状图

最近由于工作项目需要,尝试着利用ireport+jasperreport进行报表开发。

以前曾用过一款商用的报表开发工具,所以对这类工具的使用模式还是比较熟悉的,但还是遇到了很多麻烦和问题。

最大的问题就是没有文档和售后技术支持,遇到问题只能时到网上搜索,但在网上也很难找到几篇有用的能解决问题的文章,且大量抄来抄去的重复文章,找到的几篇却在关键的地方语焉不详。

没办法,问题的解决还得靠自己去琢磨。

怎样利用上述工具进行图表开发,我整整琢磨尝试了2天。

网上没找到有用的文档,看jasperreport的demo,也不知其所以然。

好在经过自己的琢磨和不断试验,整理出了一条图表开发的思路和步骤。

尽管还是有很多不清楚的地方,但眼下总结出来的已经足够项目的开发应用了。

下面以柱状图(bar3DChart)为例,详细说明图表的开发过程。

1.确定数据源类型和其中参数

我选择的是JRDataSourceProvider类型的数据源。

我也试过JDBC数据源,没问题,只是我的应用需求是要根据用户的选择展示,所以用JRDataSourceProvider更灵活和方便些,不必每次选择都去查数据库。

用iReport开发图表,在定义图表属性中的数据时,需要添加categoryseries,一个categoryseries中包括seriesexpression、categoryexpression、Valueexpression、labelexpression等。

当我开始看到这些东西时,真的时搞不明白是什么意思。

试来试去,基本上弄清楚了,关键是前3个,Valueexpression很明白是指数据的值,categoryexpression代表分组,seriesexpression则代表分组中的不同指标。

举例说明:

我公司的一款数据产品销往全国各地的不同电信运营商,图表要按地区展示各运营商的产品套数,那么这里的地区就是categoryexpression,运营商就是seriesexpression,Valueexpression就是产品的套数了。

于是图表数据源的参数有3个就够了,即category、series和value。

其他一些图表可能情况略有不同,如饼图(piechart),xylinechart等,如要做的通用些,可再加入些其他参数。

我这里有3个足够了。

2.开发数据源类

首先定义一个用户图表的bean:

ChartDataBean,包括3个成员变量及相应的getter和setter。

3个成员变量的名称如前所述,无论图表要显示什么样的数据,都按这3个变量进行对应并赋值即可。

这样的名称也与iReport中图表的数据相对应,不至于搞错。

如下:

publicclassChartDataBean{

Stringserieas;

Stringcategory;

floatvalue;

publicStringgetCategory(){

returncategory;

}

publicvoidsetCategory(Stringcategory){

this.category=category;

}

publicStringgetSerieas(){

returnserieas;

}

publicvoidsetSerieas(Stringserieas){

this.serieas=serieas;

}

publicfloatgetValue(){

returnvalue;

}

publicvoidsetValue(floatvalue){

this.value=value;

}

}

然后定义一个ChartDataSource类,该类应用了JRDataSource接口。

该类用于在生成图表时将数据传入。

如下:

publicclassChartDataSourceimplementsJRDataSource{

privateintm_nldx;

privateVectorv;

publicChartDataSource(){

this(newVector());

}

publicChartDataSource(Vectorv){

this.m_nldx=-1;

this.v=v;

}

publicObjectgetFieldValue(JRFieldarg0)throwsJRException{

Objecto=null;

StringsName=arg0.getName();

ChartDataBeanresultset=v.elementAt(m_nldx);

if(resultset==null)

returnnull;

if(sName.equals("serieas"))

o=resultset.getSerieas();

elseif(sName.equals("category"))

o=resultset.getCategory();

elseif(sName.equals("value"))

o=resultset.getValue();

returno;

}

publicbooleannext()throwsJRException{

//TODOAuto-generatedmethodstub

m_nldx++;

return(m_nldx

}

}

最后定义一个ChartDataSourceProvider类,该类继承类JRAbstractBeanDataSourceProvider,如下:

publicclassChartDataSourceProviderextendsJRAbstractBeanDataSourceProvider{

publicChartDataSourceProvider(Classarg0){

super(arg0);

//TODOAuto-generatedconstructorstub

}

publicChartDataSourceProvider(){

super(ChartDataBean.class);

//TODOAuto-generatedconstructorstub

}

publicJRDataSourcecreate(JasperReportarg0)throwsJRException{

//TODOAuto-generatedmethodstub

ChartDataSourceds=newChartDataSource(getQueryResult());

returnds;

}

publicvoiddispose(JRDataSourcearg0)throwsJRException{

//TODOAuto-generatedmethodstub

}

publicstaticVectorgetQueryResult(){

Vectorvector=newVector();

ChartDataBeanresult=newChartDataBean();

result.setCategory("北京");

result.setSerieas("联通");

result.setValue(1500);

vector.addElement(result);

result=newChartDataBean();

result.setCategory("北京");

result.setSerieas("电信");

result.setValue(1600);

vector.addElement(result);

result=newChartDataBean();

result.setCategory("北京");

result.setSerieas("移动");

result.setValue(2000);

vector.addElement(result);

result=newChartDataBean();

result.setCategory("上海");

result.setSerieas("联通");

result.setValue(1900);

vector.addElement(result);

result=newChartDataBean();

result.setCategory("上海");

result.setSerieas("电信");

result.setValue(600);

vector.addElement(result);

result=newChartDataBean();

result.setCategory("上海");

result.setSerieas("移动");

result.setValue(1200);

vector.addElement(result);

result=newChartDataBean();

result.setCategory("天津");

result.setSerieas("联通");

result.setValue(900);

vector.addElement(result);

result=newChartDataBean();

result.setCategory("天津");

result.setSerieas("电信");

result.setValue(800);

vector.addElement(result);

result=newChartDataBean();

result.setCategory("天津");

result.setSerieas("移动");

result.setValue(1400);

vector.addElement(result);

returnvector;

}

}

以上getQueryResult()方法中加入了一些数据用于在iReport开发中测试预览用。

实际上我认为,ChartDataSourceProvider类只是为iReport设计时从数据源中提取field信息而用的,在报表生成过程中并不会用到该类。

3.图表设计

在前面工作的基础上,我们就可以利用iReport进行图表开发了。

首先新建一个报表文件,文件名最好能反应报表的内容,如bar3DChart;

然后定义报表数据源,在定义数据源前要先设置classpath,通过菜单option->classpath,在classpath对话框中点击AddFolder,将你前面开发数据源类的java工程中放置编译后的.class文件的目录添加到classpath列表中,如我的是web工程,class的目录是D:

\Myprj\prj1\WebRoot\WEB-INF\classes;

添加一个新数据源,通过菜单data->connection/datasource,打开connection/datasource,点击new按钮,在connectionproperties对话框中选择JRDataSourceProvider,点击next按钮,在新打开的对话框中有两个输入项:

name和jasperreportsdatasourceproviderclass。

Name可任意输入,如:

ChartDataSourceProvider;jasperreportsdatasourceproviderclass则要输入你前面定义的ChartDataSourceProvider类,一定要输入全路径类名,和你在java工程中的包名类名一致:

如com.project1.report.chart.ChartDataSourceProvider,输入完成后可点击test按钮测试一下,如弹出Connectiontestsuccessful!

对话框则表明数据源类添加成功,否则要检查一下classpath是否正确设置。

注:

这里有个情况说明一下,如果ChartDataSourceProvider类是在iReport打开后编译的,那么即使classpath设置正确,类名输入也无问题,还是测试失败。

这时就必须将iReport关闭后再打开,测试才会成功,数据源才可用,我也不知道这是为什么。

这个问题在我刚开始用iReport时困扰了我一天,我新加了一个数据源,但怎么都连不通,反复检查各种设置、路径、名称、大小写等,就是不行,实在是莫名其妙呀!

第二天上班,我开机后再试试,我什么都没改动,还是昨天那些东西,竟然连接成功了!

我就琢磨了,是不是跟机器关开了一次有关系?

机器一天都是开着的,下班才关,什么都没动,再开机问题就解决了?

可也不能那么邪乎吧,什么东西做得非要重启机器?

于是经过几次试验我就发现:

数据源类在重新编译后,必须重新启动一次iReport。

注意要将新加的数据源设为默认。

读取Field,菜单file->reportquery打开reportquery对话框,在DataSourceProvider属性页中点击Getfieldsfromdatasource按钮,下面的列表里会出现field的列表,有serieas、category、value和class,多了个class,不去管他;点击ok;

下面设计图表了。

在报表title或summaryband中加入一个图表工具(charttool),在弹出的图表选择对话框中选择bar3D,并点击ok确定。

将band和图表调整至合适的大小;

双击bar3D图表,打开bar3DChart对话框,在chart属性页中将EvaluationTime设为report(如选其他选项会出现我不想要的效果,我还没去仔细琢磨),然后点击Editchartproperties按钮,打开chartproperties对话框;

在chartproperties对话框选择ChartData属性页,在ChartData属性页中选择Details属性页;

点击Add按钮添加一个categoryseries,在弹出的对话框的data属性页中有4个需要定义的表达式(expression),我们定义前3个。

如SeriesExpression,可以通过点击右边的按钮打开表达式编辑器,在编辑器下边的objectsandexpression属性页中左边第一个框中选Field,然后在第二个框中双击seriesas,在上边的文本编辑区中就会出现表达式:

$F{serieas}。

点击应用按钮(?

我的iReport中显示的是套用,我估计英文应该是apply,按咱们的习惯还是较应用吧)。

其他两个表达式如法炮制,结果应该是这样的:

seriesexpression:

$F{serieas}、categoryexpression:

$F{category}、Valueexpression:

$F{value}、labelexpression:

空白;点击ok;然后关闭chartproperties对话框。

这时可以通过菜单build->executereport(Usingactiveconn.)来预览图表了。

至此,在iReport中的图表设计工作完成。

图表在web工程中的部署、载入、展现等与报表的方法是一样的。

4.图表部署

我用的web服务器是tomcat5,假定web工程部署在webapps/myproject/中,在webapps/myproject/下新建一个目录reports用来放置报表文件。

将前面iReport编译生成的bar3DChart.jasper文件放在该目录下。

.jasper文件默认生成在iReport的安装目录下。

部署和生成报表所需的几个jar包也要放到myproject/WEB-INF/lib下,这些jar包有:

jasperreports-2.0.4、iReport、jfreechart-1.0.9、jcommon-1.0.12等。

版本可能不太一样。

注意的是,iReport和jasperreport的图表功能实际上是用了jfreechart工具来实现的,所以一定要将jfreechart的jar包导入到工程中。

5.图表的生成和展示

开发servlet。

我这里以servlet方式生成图表。

Servlet如下:

publicclassReportServletextendsBaseHttpServlet{

/**

*

*/

publicvoidservice(

HttpServletRequestrequest,

HttpServletResponseresponse

)throwsIOException,ServletException

{

PrintWriterout=response.getWriter();

try

{

HttpSessionsession=request.getSession(false);

//获得图表数据。

图表数据是在其他地方查表得到并生成Vector的数据列,然后保存在session中传递到servlet。

VectordataList=(Vector)session.getAttribute("storedDataList");

//载入图表,一定要指对路径和文件名

FilereportFile=newFile(context.getRealPath("/reports/bar3DChart.jasper"));

if(!

reportFile.exists())

thrownewJRRuntimeException("FileWebappReport.jaspernotfound.Thereportdesignmustbecompiledfirst.");

JasperReportjasperReport=(JasperReport)JRLoader.loadObject(reportFile.getPath());

//图表的参数,及ireport中的定义变量,如报表标题、图表日期等,也是于他处设置保存在session中

Mapparameters=(Map)session.getAttribute

("jasper_parameters");//这里导入图表数据,并生成报表

JasperPrintjasperPrint=

JasperFillManager.fillReport(

jasperReport,

parameters,

newChartDataSource(dataList)

);

//JasperPrintjasperPrint=(JasperPrint)session.getAttribute

//(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE);

//注:

以上的步骤实际上都可以在他处完成,最后将jasperPrint保存到session中,这样在servlet中只需从session中取得jasperPrint即可(如上面注释掉的这条语句),可以将servlet做成通用的类来展示输出所有的报表。

//输出html用JRHtmlExporter

JRHtmlExporterexporter=newJRHtmlExporter();

MapimagesMap=newHashMap();

response.setContentType("text/html");

request.getSession().setAttribute("IMAGES_MAP",imagesMap);

request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);

exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);

exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,out);

exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP,imagesMap);

exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,"image?

image=");

exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML,"");

exporter.exportReport();

}

catch(JRExceptione)

{

out.println("");

out.println("");

out.println("JasperReports-WebApplicationSample");

out.println("");

out.println("");

out.println("");

out.println("JasperReportsencounteredthiserror:

");

out.println("

");

e.printStackTrace();

out.println("

");

out.println("");

out.println("");

}

}

6.添加servlet映射

在web.xml中添加如下设置:

ReportServlet

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职业技术培训

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1