ireport制作jasperreport报表详细过程(包括jsp端代码实现)

来源:互联网 发布:中国互联网主干网络 编辑:程序博客网 时间:2024/06/06 17:24

概述:

现在简要的介绍Jasperreport 是
如何工作的,这样你可以更好的理解iReport 是如何帮助Jasperreport 实现前端的
工作,其实这些工作在我们看来就是“脏活”,为什么呢?看看下面的资料就知
道了:

image

首先是要有一个XML
文件(一般是以jrxml后缀),那么这个XML文件从那里来呢?做什么用呢? 这
个XML 文件就是报表的定义文件,整个报表的每一个细节都在这个XML 文件
之中定义,一个简单报表的xml文件就有几百行,你可以手工编辑这个XML文
件(一行一行,一段一段的编辑吧――这就是所谓的“脏活”),然后可以在jsp后台使用JasperCompileManager将xml文件编译为jasper文件

ireport工具就是简化编写xml文件和编译的这个流程,而且提供可视化编辑窗口,非常方便

ireport部分:

我使用的是ireport3.0和现在最新的4.0界面上有很大的不同:

3.0界面:

QQ截图未命名

 

这里,我假设ireport的环境已经配置完毕,点击左上角的档案,选择开启新档,设置报表初始化参数:

QQ截图未命名

注意一下里边的字段数的按钮,字段数设置默认为1,如果设置为2的话,就相当于每一列会有2个字段排列,这样讲有点抽象,请看下边

的例子:

假设我们的数据表是这样:

namesexrealnameremarka_1b_1c_1d_1a_2b_2c_2d_2a_3b_3c_3d_3a_4b_4c_4d_4

如果ireport的字段数设为2,结果会变成:

namesexrealnameremarka_1 a_2b_1 b_2c_1 c_2d_1 d_2a_3 a_4b_3 b_4c_3 c_4d_3 d_4

所以,一般设置字段数为1即可。

新建后,可以看到中间的控制面板:

QQ截图未命名

这里,假设您只需要报表显示表格和统计数据,所以title和lastpagefooter可以不要,在左上角的预览里,选择栏,把title和lastpagefooter高度设为0.

下面开始设计报表:

QQ截图未命名

 

QQ截图未命名

然后可以拖拉到控制面板对应字段对齐

这里假设各位都会对其,效果图如下:

QQ截图未命名

使用报表变量,计算统计值:

document下右键添加variable,出现这个界面,然后按照这样设置:

QQ截图未命名

QQ截图未命名

这里我是统计列a的个行相加值,因为前面image 已经设置了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<%
13DataSource ds = null;
14try{
15InitialContext ctx=new InitialContext();
16ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
17Connection conn = ds.getConnection();
18//装载jasper 文件
19File business_rpt = new
20File(application.getRealPath("/reports/BusinessRpt.jasper"));
21// http://blog.csdn.net/jemlee2002/archive/2004/10/08/JJem3.aspx
22//ProjectName 就是iReport 的变量$P{ProjectName}的名称,
23//proname 就是从界面上获取的值。
24Map parameters = new HashMap();
25parameters.put("ProjectName ", proname);
26// JasperRunManager是一个输出控制管理类,下文会提及部分内容
27JasperRunManager.runReportToHtmlFile(business_rpt.getPath(),parameters,conn);
28//如果创建报表成功,则转向该报表,其实可以把报表套在框架内,这样实现比较有意
29义的报表格式。
30response.sendRedirect("/reports/BusinessRpt.html");
31}catch(Exception ex){
32out.print("出现例外,信息是:"+ex.getMessage());
33ex.printStackTrace();
34}
35%>
36</head>
37<body>
38</body>
39</html>

2.使用servlet处理报表:

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

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

01public 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:

01ServletContext context = this.getServletConfig().getServletContext();
02File 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%\">&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();
1pdf输出:
01byte[] 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                        }
1excel输出:
view sourceprint?
01try {
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                        }