Jasper + ireport 集成报表到Web应用,操作说明
北京xxxxxxxxx公司
JasperReport + ireport集成报表到Web应用
操作说明
郝建柱
2011/2/24
第一部分,下载与安装
Ireport官网:https://www.360docs.net/doc/1f308293.html,/,从这里可以下载到
下载后的文件名
安装:没什么注意的,一路回车就好了
第二部分,ireport与JasperReport简单说明
1,ireport,是一个制作报表的工具,用其设计报表样式2,JasperReport,是在程序里操作ireport报表的一套类库先简单介绍,以下详细说明
第三部分,使用ireport制作报表
以ireport3.7.6为例,依次选择“文件–》New…”出现下图
在接下来出现的对话框中选择保存位置就好了。
建好的报表分这样几个部分,下面依次说明
Title : 报表标题,也就是在报表首页出现的
Page Header : 报表每页的页头,Page Footer页脚
Column Header : 列头,Column Footer 列脚
Detail : 对数据源进行循环显示
Summary : 汇总,也就是在报表最后一页出现的
不需要的部分可以在ireport左边删掉,如下图示
接下来以Oracle数据库的scott用户中DEPT表为例,制做一个简单的报表
1,设置报表语言
在报表边缘外单击,在ireport右边的属性面板中找到
Language属性,设置为Java,如下图示
2,以数据库为报表的数据源,显示简单的报表
首先,把oracle的jdbc驱动引到ireport里,具体做法为:
点击:工具-》选项,找到Classpath选项卡,按下图操作
找到oracle的JDBC,添加进来就好了
然后,点击ireport工具栏上的这个按钮在弹出的窗口中点new按向导,建一个数据源,注意,这个数据源我们在ireport里设计报表用的,与程序并没有关系
接下来点工具栏上这个在弹出的窗口中写查询语句,如下图示
点OK后,在ireport左边的面板上Fields下边就有了sql所查
出来的列,如图现在只要把Fields下边的,将来要显示字段拽到报表设计器中上Detail部分,就好了,
注意:把Field拽到Detail中后,在Column Header会自动出现对应的列头,只要双击,就可以写中文了
接下来从ireport右边的组件面板中找到Static Text控件,拽
到Title里,双击就可以输入文字,结果如下
注意:这里所有的Static 和Field,需要在右边的属性面板中,逐一设置两个属性,如图
这是为了将来把报表集成到程序里之后,让其在页面上显示中文
点击就可以看到结果
一般查询都是有条件的,刚才写的sql是查全部的,现在写带查询条件的sql,具体做法为:
在ireport窗口左边的面板里,找到Parameters右击,添加Parameter,如图
选中刚才添加的这个参数,在右边的属性面板中给其设置名字,比如叫parDname
修改刚才写的sql为这样的
简单说明红色的部分:在ireport里,用$P{参数名}来取参数,这个参数以后可以从程序里传进来,上边的$P!{parDname},多了一个!号,表示,把接来的参数作为字符串拼到sql中,如果去掉!号,写成$P{parDname},就表示SQL参数,相当于在JDBC中写select * from dept where dname like ?
这样就创建了带条件的查询
3,使用Variable(变量)做简单的汇总
以统计查询结果的总条数,和总人数为例
注:在scott的dept表里没人部门人数一列,在此用部门编号来代替
在ireport左边找到Variables点右键,添加两个Variable
添加后,在右边的属性面板分别给两个变量起名,varPcount (统计总人数),varRecordCount(统计总记录数)
在属性面板上,对varPcount设置,如图
这几个属性一看就清楚其作用了,Reset type:Report是对事个报表做统计
在Variable Expression里选择要统计的Field名,如图
在属性面板上,对varRecordCount配置,如图
在Calculation属性中,选择count,表示统计数量
因为是数量,所以,Variable Expression里随便选一列就行对比:在没有分组过的sql里select count(*)和select
count(deptno)的结果是一样的
配置好好,将两个Variable从左边拽到报表中对应位置就好了,可参照下图
预览后就可以看到结果了
4,图表的显示,在此,以显示部门人数为例,做一个图表首先给报表添加一个数据集,操作如图示
起名为dsPcount
按向导完成数据集的创建,之后配置数据集,给数据集添加参数,如图
起名为dsParDname
在创建好的数据集上右键-》Edit Query,添加查询条件
然后在从右边的组件面板中拽一个Chart控件到Summary部分,选择一个样式后,点OK,在接下来的向导中,第一步选择刚创建的数据集,dsPcount,第二步中,选择Key,Value,
分别写两个按钮,选择要显示的键和值
完成后,在生成的图表上右键-》Chart Data,在DataSet标签上下边做如下配置
在Parameters标签中这样配置
在Dataset parameters name,选择数据集的参数,在Value expression里,选择主报表定义的参数
在Detail标签中,这样配置
这样,显示图表的操作就完成了,预览就可以看到效果了
第四部分,把报表集成到Web应用程序中
用MyEclipse新建一个Web Project,在WebRoot下新建一个reports文件夹,用来放ireport生成的jasper文件
找到前边保存ireport报表的路径,报表在预览后,生成jasper 文件,如图
把这个deptReport.jasper文件复制到Web项目里的reports 文件夹中
导入JasperReport的包,包可以从以下路径找到
Ireport安装路径\iReport-3.7.6\ireport\modules\ext
把这里所有的包引到Web项目里,引入oracle的jdbc驱动,接下来进行编程,以Servlet为例
1,生成报表并且以HTML形式在网页上显示
Servlet的主要逻辑代码如下:
request.setCharacterEncoding("utf-8");
// 接收查询参数,将来这个参数就是我们在报表中定义的parDname
String deptName = request.getParameter("dname");
// 报表文件路径,我们用ireport做的jasper文件路径
// JasperReport需要jasper文件的真实路径
String reportPath = request.getSession().getServletContext()
.getRealPath("/reports/deptReport.jasper");
// 报表参数,jasper文件可能不只一个参数
// 在程序里,用一个Map对象,向jasper文件传递他需要的参数
Map reportParameters = new HashMap();
reportParameters.put("parDname", deptName);
// 报表连数据库所用的数据连接
// 因为报表直接以数据库为数据源,所以在这里需要给jasper文件一个jdbc连接
Connection con = null;
// 清空响应流
response.reset();
// 设置输出格式
response.setContentType("application/html");
// 创建JDBC连接
Class.forName("oracle.jdbc.OracleDriver");
con = DriverManager.getConnection(
"jdbc:oracle:thin:@oracle10:1521:oracle", "scott", "tiger");
// JasperReport提供的类,用于生成一个HTML文件
JasperRunManager.runReportToHtmlFile(reportPath, reportParameters, con);
response.sendRedirect(request.getContextPath()
+ "/reports/deptReport.html");
/*
* 如果要在网页上显示PDF文件,把前两句去掉,放开这段注释
* ServletOutputStream out = response.getOutputStream();
* //从jasper报表生成PDF字节
* byte[] pdfBytes = JasperRunManager.runReportToPdf(reportPath, reportParameters, con);
* //设置输出内容长度
* response.setContentLength(pdfBytes.length); //将PDF写入报表
* out.write(pdfBytes, 0, pdfBytes.length);
* out.flush();
* out.close();
*/
// 关闭数据连接
con.close();
这里只写出逻辑代码,实际用的时候,加上各种异常的处理。2,导出PDF和Excel文件
Servlet的逻辑代码如下,还是没写异常处理,开发时加上
// 接收查询参数
request.setCharacterEncoding("utf-8");
String deptName = request.getParameter("dname");
// 在请求的时候多加一个参数,标识要生成文件的格式是xls还是pdf
String format = request.getParameter("format");
// 报表文件路径
String reportPath = request.getSession().getServletContext()
.getRealPath("/reports/deptReport.jasper");
// 报表参数
Map reportParameters = new HashMap();
reportParameters.put("parDname", deptName);
// 报表查数据库的连接
Connection con = null;
// 清空响应流
response.reset();
// 设置输出格式
String contentType = "pdf";
if ("xls".equals(format.toLowerCase())) {
contentType = "xls";
}
response.setContentType("application/" + contentType);
// 设置输出文件名
response.setHeader("Content-Disposition",
"attachment; filename=deptReport." + contentType);
// 输出流,用于向浏览器传送pdf文件
ServletOutputStream out = null;
// 创建数据连接
Class.forName("oracle.jdbc.OracleDriver");
con = DriverManager.getConnection(
"jdbc:oracle:thin:@oracle10:1521:oracle", "scott", "tiger");
// 取响应流
out = response.getOutputStream();
// 创建导出器,JasperReport提供的类
// 这里以xls和pdf为例,如果需要生成其他格式的文件,用其他导出器就行
JRAbstractExporter exporter = new JRRtfExporter();
// PDF导出器
if ("pdf".equals(format.toLowerCase())) {
exporter = new JRPdfExporter();
} else if ("xls".equals(format.toLowerCase())) { // excel导出器exporter = new JRXlsExporter();
exporter.setParameter(
JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, false);
}
// 加载报表文件
JasperReport report = (JasperReport) JRLoader.loadObject(reportPath);
// 创建JasperPrint对象
JasperPrint jasperPrint = JasperFillManager.fillReport(report,
reportParameters, con);
// 设置要输出的jasper对象
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
// 设置输出流
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
// 导出
exporter.exportReport();
out.flush();
out.close();
con.close();
到此为止,JasperReport + ireport 集成报表到Web程序的一般步骤就说完了,本说明中所提到的报表源文件及Web示例,随文档一起,可以参实际例子来学习Jasper 和ireport