• 【清楚理解后台利用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                         }

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

  • 相关阅读:
    集合set() 和 深浅copy
    Python 数据类型的操作——字典
    Python()- 面向对象
    面向对象的软件开发
    Python数据类型的操作——列表、元组
    Python 数据类型的操作——字符串
    Linux下386中断处理
    任务的休眠与唤醒
    Linux下SIGSTOP的特殊特征和实现
    内核线程对信号的处理策略
  • 原文地址:https://www.cnblogs.com/yaowukonga/p/2989119.html
Copyright © 2020-2023  润新知