【清楚理解后台利用ireport到处报表的原理】ireport制作jasperreport报表详细过程(包括jsp端代码实现)

转自:http://blog.csdn.net/jiebacai/article/details/7871517

概述:

现在简要的介绍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_1
a_4  b_4  c_4 d_4
a_5  b_5  c_5 d_5

 

 

 

 

 

 

  如果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文件:

 1 <%@ page language="java" pageEncoding="GB18030"%>
 2 <%@ page session="false"%>
 3 <%@ page import="java.util.*"%>
 4 <%@ page import="javax.naming.*"%>
 5 <%@ page import="java.sql.*"%>
 6 <%@ page import="javax.sql.*"%>
 7 <%@ page import="java.util.*"%>
 8 <%@ page import="java.io.*"%>
 9 
10 <%@ page import="dori.jasper.engine.*"%>
11 <%
12     String path = request.getContextPath();
13     String basePath = request.getScheme() + "://"
14             + request.getServerName() + ":" + request.getServerPort()
15             + path + "/";
16 %>
17 <html>
18     <head>
19         <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
20         <title></title>
21         <%
22             DataSource ds = null;
23             try {
24                 InitialContext ctx = new InitialContext();
25                 ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
26                 Connection conn = ds.getConnection();
27                 //装载jasper 文件
28                 File business_rpt = new File(application
29                         .getRealPath("/reports/BusinessRpt.jasper"));
30                 // http://blog.csdn.net/jemlee2002/archive/2004/10/08/JJem3.aspx
31                 //ProjectName 就是iReport 的变量$P{ProjectName}的名称,
32                 //proname 就是从界面上获取的值。
33                 Map parameters = new HashMap();
34                 parameters.put("ProjectName ", proname);
35                 // JasperRunManager是一个输出控制管理类,下文会提及部分内容
36                 JasperRunManager.runReportToHtmlFile(business_rpt.getPath(),
37                         parameters, conn);
38                 //如果创建报表成功,则转向该报表,其实可以把报表套在框架内,这样实现比较有意义的报表格式。
39                 response.sendRedirect("/reports/BusinessRpt.html");
40             } catch (Exception ex) {
41                 out.print("出现例外,信息是:" + ex.getMessage());
42                 ex.printStackTrace();
43             }
44         %>
45     </head>
46     <body>
47     </body>
48 </html>

2.使用servlet处理报表:

主要区别就是,servlet是直接输出report报表流:

先写一个CustomDataSource类实现report的JRDataSource接口,转化vector向量为数据源:

 1 public class CustomDataSource implements JRDataSource {
 2     private Vector dataVector = new Vector();
 3     private int index = -1;
 4 
 5     public CustomDataSource(Vector DataVector) {
 6         dataVector = DataVector;
 7     }
 8 
 9     public boolean next() throws JRException {
10         index++;
11         return (index < dataVector.size());
12     }
13 
14     public Object getFieldValue(JRField field) throws JRException {
15         Object value = null;
16         String fieldName = field.getName();
17 
18         value = ((Map) dataVector.get(index)).get(fieldName);
19         return value;
20     }
21 
22 }

输出html:

 1 <%@ page language="java" pageEncoding="GB18030"%>
 2                         ServletContext context = this.getServletConfig().getServletContext();
 3                         File reportFile = new File(context
 4                                 .getRealPath("/reports/test.jasper"));// 加载报表路径
 5                         if (!reportFile.exists()) {
 6                             response.setContentType(CONTENT_TYPE);
 7                             PrintWriter out = response.getWriter();
 8                             out.print("<script language='javascript'>");
 9                             out.print("alert('找不到报表!');");
10                             out.print("</script>");
11                             return;
12                         }
13                       
14                         Map parameters = new HashMap();
15                       
16                         response.setContentType(CONTENT_TYPE);
17                         PrintWriter out = response.getWriter();
18                         try {
19   
20                             JasperReport jasperReport = (JasperReport) JRLoader
21                                     .loadObject(reportFile.getPath());// 加载报表
22   
23                             /*
24                              * java.lang.reflect.Field pageHeight =
25                              * 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%\">&nbsp;</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();
78                             
pdf输出:
 1   byte[] bytes = null;
 2 
 3   try {
 4       bytes = JasperRunManager.runReportToPdf(reportFile
 5               .getPath(), parameters,
 6               new CustomDataSource((Vector) re.get(1)));
 7       if (bytes != null && bytes.length > 0) {
 8           response.setContentType("application/pdf");
 9           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 }

 excel输出:

 1                     try {
 2   
 3                             JasperReport jasperReport = (JasperReport) JRLoader
 4                                     .loadObject(reportFile.getPath());
 5   
 6                           
 7                             ServletOutputStream ouputStream = response
 8                                     .getOutputStream();
 9   
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                         }

 

代码不够完善,这几天刚好要做报表,到时把一个完整的代码贴上来,现在先拿别人的学习下。

posted @ 2013-03-30 10:32  古来征战几人回  阅读(864)  评论(0编辑  收藏  举报