ireport制作jasperreport报表详细过程(包括jsp端代码实现)
概述:
现在简要的介绍Jasperreport 是
如何工作的,这样你可以更好的理解iReport 是如何帮助Jasperreport 实现前端的
工作,其实这些工作在我们看来就是“脏活”,为什么呢?看看下面的资料就知
道了:
首先是要有一个XML
文件(一般是以jrxml后缀),那么这个XML文件从那里来呢?做什么用呢? 这
个XML 文件就是报表的定义文件,整个报表的每一个细节都在这个XML 文件
之中定义,一个简单报表的xml文件就有几百行,你可以手工编辑这个XML文
件(一行一行,一段一段的编辑吧――这就是所谓的“脏活”),然后可以在jsp后台使用JasperCompileManager将xml文件编译为jasper文件
ireport工具就是简化编写xml文件和编译的这个流程,而且提供可视化编辑窗口,非常方便
ireport部分:
我使用的是ireport3.0和现在最新的4.0界面上有很大的不同:
3.0界面:
这里,我假设ireport的环境已经配置完毕,点击左上角的档案,选择开启新档,设置报表初始化参数:
注意一下里边的字段数的按钮,字段数设置默认为1,如果设置为2的话,就相当于每一列会有2个字段排列,这样讲有点抽象,请看下边
的例子:
假设我们的数据表是这样:
name | sex | realname | remark |
a_1 | b_1 | c_1 | d_1 |
a_2 | b_2 | c_2 | d_2 |
a_3 | b_3 | c_3 | d_3 |
a_4 | b_4 | c_4 | d_4 |
如果ireport的字段数设为2,结果会变成:
name | sex | realname | remark |
a_1 a_2 | b_1 b_2 | c_1 c_2 | d_1 d_2 |
a_3 a_4 | b_3 b_4 | c_3 c_4 | d_3 d_4 |
所以,一般设置字段数为1即可。
新建后,可以看到中间的控制面板:
这里,假设您只需要报表显示表格和统计数据,所以title和lastpagefooter可以不要,在左上角的预览里,选择栏,把title和lastpagefooter高度设为0.
下面开始设计报表:
然后可以拖拉到控制面板对应字段对齐
这里假设各位都会对其,效果图如下:
使用报表变量,计算统计值:
document下右键添加variable,出现这个界面,然后按照这样设置:
这里我是统计列a的个行相加值,因为前面 已经设置了sum,所以,报表会自动计算列a的相加值。
这里设计报表要注意几点:
1.字段间要对齐,方框为红色的,表明是超出报表边界
2.写表达式的时候,与java类型兼容,但是写法有点不同,类型转换要用new 类型 不然会报错
jsp处理报表部分
设置report环境:
1.每个Web应用都会有WEB-INF目录,但是lib 是不一定有的,如果没有就创
建它,本文需要的jar库文件有3个:
jasperreports-0.5.3.jar :jasperreports执行时需要的API
iTextAsian.jar :亚洲字符集支持
itext-1.02b.jar :其他字符集支持
2.在Web应用中根目录下创建repotrs目录,其实这是一种建议,没有必要完
全按照这样做,你可以根据你的业务需要创建N个目录或是层次目录。
把.jasper文件拷贝到repotrs目录下,比如例子中的BusinessRpt.jasper
文件。
jsp两种模式:
1.直接使用jsp处理报表
2.使用servlet处理报表
1.使用jsp处理报表:
jsp文件:
01 | <%@ page session= "false" %> |
02 | <%@ page import = "dori.jasper.engine.*" %> |
03 | <%@ page import = "javax.naming.*" %> |
04 | <%@ page import = "java.sql.*" %> |
05 | <%@ page import = "javax.sql.*" %> |
06 | <%@ page import = "java.util.*" %> |
07 | <%@ page import = "java.io.*" %> |
08 | <html> |
09 | <head> |
10 | <meta http-equiv= "Content-Type" content= "text/html; charset=gb2312" > |
11 | <title></title> |
12 | <% |
13 | DataSource ds = null ; |
14 | try { |
15 | InitialContext ctx= new InitialContext(); |
16 | ds=(DataSource)ctx.lookup( "java:comp/env/jdbc/mysql" ); |
17 | Connection conn = ds.getConnection(); |
18 | //装载jasper 文件 |
19 | File business_rpt = new |
20 | File(application.getRealPath( "/reports/BusinessRpt.jasper" )); |
22 | //ProjectName 就是iReport 的变量$P{ProjectName}的名称, |
23 | //proname 就是从界面上获取的值。 |
24 | Map parameters = new HashMap(); |
25 | parameters.put( "ProjectName " , proname); |
26 | // JasperRunManager是一个输出控制管理类,下文会提及部分内容 |
27 | JasperRunManager.runReportToHtmlFile(business_rpt.getPath(),parameters,conn); |
28 | //如果创建报表成功,则转向该报表,其实可以把报表套在框架内,这样实现比较有意 |
29 | 义的报表格式。 |
30 | response.sendRedirect( "/reports/BusinessRpt.html" ); |
31 | } catch (Exception ex){ |
32 | out.print( "出现例外,信息是:" +ex.getMessage()); |
33 | ex.printStackTrace(); |
34 | } |
35 | %> |
36 | </head> |
37 | <body> |
38 | </body> |
39 | </html> |
2.使用servlet处理报表:
主要区别就是,servlet是直接输出report报表流:
先写一个CustomDataSource类实现report的JRDataSource接口,转化vector向量为数据源:
01 | public class CustomDataSource implements JRDataSource |
02 | { |
03 | private Vector dataVector = new Vector(); |
04 | private int index = - 1 ; |
05 | |
06 | public CustomDataSource(Vector DataVector) |
07 | { |
08 | dataVector=DataVector; |
09 | } |
10 | |
11 | public boolean next() throws JRException |
12 | { |
13 | index++; |
14 | return (index < dataVector.size()); |
15 | } |
16 | |
17 | public Object getFieldValue(JRField field) throws JRException |
18 | { |
19 | Object value = null ; |
20 | String fieldName = field.getName(); |
21 | |
22 | value=((Map)dataVector.get(index)).get(fieldName); |
23 | return value; |
24 | } |
25 | |
26 | |
27 | } |
输出html:
01 | ServletContext context = this .getServletConfig().getServletContext(); |
02 | File reportFile = new File(context |
03 | .getRealPath( "/reports/test.jasper" )); //加载报表路径 |
04 | if (!reportFile.exists()) { |
05 | response.setContentType(CONTENT_TYPE); |
06 | PrintWriter out = response.getWriter(); |
07 | out.print( "<script language='javascript'>" ); |
08 | out.print( "alert('找不到报表!');" ); |
09 | out.print( "</script>" ); |
10 | return ; |
11 | } |
12 | |
13 | Map parameters = new HashMap(); |
14 | |
15 | |
16 | |
17 | response.setContentType(CONTENT_TYPE); |
18 | PrintWriter out = response.getWriter(); |
19 | try { |
20 | |
21 | JasperReport jasperReport = (JasperReport) JRLoader |
22 | .loadObject(reportFile.getPath()); //加载报表 |
23 | |
24 | /* |
25 | java.lang.reflect.Field pageHeight = JRBaseReport.class.getDeclaredField("pageHeight"); |
26 | pageHeight.setAccessible(true); |
27 | pageHeight.setInt(jasperReport, 500); |
28 | */ |
29 | |
30 | |
31 | JasperPrint jasperPrint = JasperFillManager |
32 | .fillReport(jasperReport, parameters, |
33 | new CustomDataSource((Vector) re |
34 | .get( 1 ))); //加载数据源和parameters,这里的数据源用到的是JRDataSource,所以要实现JRDataSource接口 |
35 | |
36 | JRHtmlExporter exporter = new JRHtmlExporter(); |
37 | |
38 | Map imagesMap = new HashMap(); |
39 | request.getSession().setAttribute( "IMAGES_MAP" , |
40 | imagesMap); |
41 | |
42 | String header = "" ; |
43 | header = "<script language='javascript'>/n" ; |
44 | header += "window.history.forward(1);/n" ; |
45 | header += "document.onkeydown=function(){if(event.keyCode==8){if((document.activeElement.type!='text')&&(document.activeElement.type!='textarea')){event.keyCode=0}};}/n" ; |
46 | header += "document.oncontextmenu=function() {return false;};/n" ; |
47 | header += "</script>/n" ; |
48 | |
49 | header += "<html>/n" ; |
50 | header += "<head>/n" ; |
51 | header += " <meta http-equiv=/"Content-Type/" content=/"text/html; charset=GBK/">/n" ; |
52 | header += "<style type=/"text/css/">/n" ; |
53 | header += " a {text-decoration: none}/n" ; |
54 | header += " </style>/n" ; |
55 | header += "</head>/n" ; |
56 | header += "<body text=/"#000000/" link=/"#000000/" alink=/"#000000/" vlink=/"#000000/">/n" ; |
57 | header += "<table width=/"100%/" cellpadding=/"0/" cellspacing=/"0/" border=/"0/">/n" ; |
58 | header += "<tr><td width=/"50%/"> </td><td align=/"center/">/n" ; |
59 | header += "/n" ; |
60 | |
61 | exporter.setParameter( |
62 | JRExporterParameter.JASPER_PRINT, |
63 | jasperPrint); |
64 | exporter.setParameter( |
65 | JRExporterParameter.OUTPUT_WRITER, out); |
66 | exporter.setParameter( |
67 | JRHtmlExporterParameter.IMAGES_MAP, |
68 | imagesMap); |
69 | exporter.setParameter( |
70 | JRHtmlExporterParameter.IMAGES_URI, |
71 | "/Images/" ); |
72 | exporter |
73 | .setParameter( |
74 | JRHtmlExporterParameter.HTML_HEADER, |
75 | header); |
76 | |
77 | exporter.exportReport(); |
1 | pdf输出: |
01 | byte [] bytes = null ; |
02 | |
03 | try { |
04 | bytes = JasperRunManager.runReportToPdf(reportFile |
05 | .getPath(), parameters, |
06 | new CustomDataSource((Vector) re.get( 1 ))); |
07 | if (bytes != null && bytes.length > 0 ) { |
08 | response.setContentType( "application/pdf" ); |
09 | response.setContentLength(bytes.length); |
10 | ServletOutputStream ouputStream = response |
11 | .getOutputStream(); |
12 | ouputStream.write(bytes, 0 , bytes.length); |
13 | ouputStream.flush(); |
14 | ouputStream.close(); |
15 | } |
16 | |
17 | } catch (Exception e) { |
18 | e.printStackTrace(); |
19 | System.out.println( "ErrorTime:" + new Date()); |
20 | response.setContentType(CONTENT_TYPE); |
21 | PrintWriter out = response.getWriter(); |
22 | out.print( "<script language='javascript'>" ); |
23 | out.print( "alert('" |
24 | + e.toString().replace( "'" , " " ) + "');" ); |
25 | out.print( "</script>" ); |
26 | |
27 | } |
1 | excel输出: |
01 | try { |
02 | |
03 | JasperReport jasperReport = (JasperReport) JRLoader |
04 | .loadObject(reportFile.getPath()); |
05 | |
06 | |
07 | ServletOutputStream ouputStream = response |
08 | .getOutputStream(); |
09 | |
10 | JasperPrint jasperPrint = JasperFillManager |
11 | .fillReport(jasperReport, parameters, |
12 | new CustomDataSource((Vector) re |
13 | .get( 1 ))); |
14 | |
15 | response.setContentType( "application/ms-excel" ); |
16 | response.setHeader( "Content-Disposition" , |
17 | "inline;filename=/"" |
18 | + jasperPrint.getName() + ".XLS/"" ); |
19 | |
20 | JRXlsExporter exporter = new JRXlsExporter(); |
21 | |
22 | exporter.setParameter( |
23 | JRExporterParameter.JASPER_PRINT, |
24 | jasperPrint); |
25 | exporter.setParameter( |
26 | JRExporterParameter.OUTPUT_STREAM, |
27 | ouputStream); |
28 | exporter |
29 | .setParameter( |
30 | JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, |
31 | Boolean.TRUE); |
32 | exporter |
33 | .setParameter( |
34 | JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, |
35 | Boolean.FALSE); |
36 | exporter |
37 | .setParameter( |
38 | JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, |
39 | Boolean.FALSE); |
40 | exporter.exportReport(); |
41 | |
42 | } |
43 | |
44 | catch (Exception e) { |
45 | e.printStackTrace(); |
46 | System.out.println( "ErrorTime:" + new Date()); |
47 | |
48 | response.setContentType(CONTENT_TYPE); |
49 | PrintWriter out = response.getWriter(); |
50 | out.print( "<script language='javascript'>" ); |
51 | out.print( "alert('" |
52 | + e.toString().replace( "'" , " " ) + "');" ); |
53 | out.print( "</script>" ); |
54 | |
55 |