`
chengyue2007
  • 浏览: 1471129 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

iReport_web开发配置向导

    博客分类:
  • java
阅读更多

一、iReport简介

说到iReport不得不先介绍Jasperreport,Jasperreport是一个报表制作程序,用户需要按照它制定的规则编写一个XML文件,然后得到用户需要输出的格式文件。它支持输出的文件格式包括PDF,HTML,XML,XLS,CVS等等。而iReport就是一个制作Jasperreport的XML文件的可视化开发工具。只是一个UI。

二、安装说明

2.1 基本安装
现在最新的版本是iReport 0.5.1 (Aug 27, 2005).
下载后解压然后在根目录双击iReport.bat就可以用了,但是为了可以使用external ttf font还必须要把 iReport-0.5.1/fonts 加到环境变量里面去。

2.2 了解制作报表用的包
下载后到到 iReport-0.5.1/lib 里看看,你就可以发现iReport的真面目了。
(1)        jasperreports-1.0.1.jar
jasperreports是iReport的核心内容。它是一个强力的报表产生工具,他有能力描述丰富内容到屏幕上、到打印机或到PDF, HTML, XLS, CSV和XML文件。它完全用Java编写的,并可在各种Java应用(包括J2EE或WEB应用)中用来产生动态内容。它的主要目的是以一种简单而灵活的方式来帮助创建导向的页面。
JasperReports组织根据在一个XML文件中定义的报表设计通过JDBC来接受来自一个关系数据库中的数据. 为了以数据来填充报表,报表设计必须首先被编译。
jasperreports的官方网站:http://jasperreports.sourceforge.net/

(2) itext-1.3.1.jar
iText是一个开放源码的Java类库,是用来生成PDF文件的。
iText的官方网站:http://itext.sourceforge.net
如果要在生成的pdf文件显示中文等亚洲字符,还必须下载itext的亚洲字符包。
tTextAsian的官方下载地址:http://itextdocs.lowagie.com/downloads/iTextAsian.jar
  
(3) jfreechart-1.0.0-rc1.jar
jfreechart是一款免费的、功能强大的统计图生成工具,可以直接生成PNG,JPG等各式的文件。
这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
jfreechart的官方下载地址:http://www.jfree.org/jfreechart/
   
(4) jcommon-1.0.0-rc1.jar
JCommon是一组有用的classes集合.它已经用在JFreeChart,JFreeReport与其它项目上. 这个类库包含了以下功能: 文本工具类(text utilities), 用来显示关于应用程序信息的用户界面类,布局定制管理器,一个日期选择面板,序列化工具类,XML解析器支持类.
jcommon的官方下载地址:http://www.jfree.org/jcommon/

(5) poi-2.0-final-20040126.jar
Apache的Jakata项目的POI子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。
直接调用poi包的不是ireport,而是jasperreport。
poi的官方下载地址:http://www.apache.org/dyn/closer.cgi/jakarta/poi/

这些是用来制作报表用的包,所以可以用最新的版本来代替原有包。但是务必保持与项目中的包一致,因为很多开源的项目都不向下兼容。(例如jasperreport)

三、制作jrxml、jasper

3.1 选择语言
Tools->Option->General->Language
3.2 连接数据库
资料来源->连结/资料来源
如果要使用mysql以外的数据库,要保证jdbc包在环境变量里。放到iReport-0.5.1/lib 下也可以。name相当于一个JNDI。添好后点击test按钮如果显示成功就可以执行下一步了。
3.3 新建一个Report
定位可以控制报表是横向的还是纵向的。Portrait是纵向,Landscape是横向。
边距是可以调整的。

3.4 基本域
title域用来放报表的总标题
pageHeaher域顾名思义页头
columnHeader域是用来放static text的,也就是不循环的部分。
detail域是用来放text field的,也就是循环部分。
pageFooter域是用来放本页的统计参数的。
summary域是用来放整个表的统计参数的。

可以直接调整每个域的长度,也可以通过Band properties来调整。当然总长度是不会超过页面的原长。

3.5 报表查询
3.5.1 为报表添加SQL查询语句
资料来源->报表查询
在Report SQL query里填写SQl语句。如果语句正确,在下面的field里就会显示正常的表字段。

3.5.2 为报表添加动态字段
预览->报表字段
把fields里的字段直接拖到报表上就行了。

3.5.3 为SQL语句添加参数
预览->报表参数
在parameters里新增一个参数
paratemeter name 是参数名,在SQL语句里写成"$P{参数名}"
paratemeter class type里选择参数类型。
注意:如果是int型的数据,最好在报表字段里将该字段的Class type改成java.lang.String型的。
另外一种办法,不管该字段原来是什么数据类型,直接在paratemeter class type里选择java.lang.String类型,然后在Default value expression 填写"Integer.toString(整数)"。

3.5.4 添加报表变量
预览->报表变量 $V{变量名}

3.5.5 处理字体
3.5.5.1 基本设置
选中字段->右键->properties->font(双击也可以)
Report font 选择全局的字体(仅限于该报表)
Font name 选择在ireport里面显示的字体
Pdf font name 选择在pdf里面显示的字体
Rotation 选择内容是否旋转(很有用的选项)
PDF Encoding 中文要用UniGB-UCS2-H,外部字体要选Identity-H

3.5.5.2 选择外部字体
第一步 先在Pdf font name里选择External TTF font,然后在下面的Ture Type font里选择外部字体,当然要用的外部字体放在iReport-0.5.1/fonts目录下面。
第二步 在web项目的WEB-INF/classes/下面放要用到的外部字体,才能在程序里正常显示。

3.5.5.3 设定该报表的全局字体
预览->报表字型

3.6 编译jrxml
建立->编译
编译后生成一个后缀名为jasper的binary文件,可以直接给程序调用。

四、web项目应用

4.1 jsp输出PDF报表

4.1.1 需要放到项目里的包
itext-1.3.1.jar
iTextAsian.jar
jasperreports-1.0.1.jar

4.1.2 输出PDF注意事项:

4.1.3 jsp输出PDF的例子:pdf.jsp

<%@page contentType="application/pdf;charset=GB2312"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page import="net.sf.jasperreports.engine.*"%>
<%@page import="java.util.*"%>
<%@page import="java.io.*"%>
<%@page import="java.sql.*"%>

<%
    System.out.println("chenggong");
    File reportFile = new File(application.getRealPath("ireports/report3.jasper "));
    System.out.println(reportFile.getPath());
    Map parameters = new HashMap();
    parameters.put("getId", "50");
    Connection conn = null;
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      conn = DriverManager.getConnection("jdbc:oracle:thin:@*", "*", "*");
      System.out.println("连接数据库成功");
    }
    catch (Exception e) {
      System.out.println(e);
    }
    //JasperRunManager run = new JasperRunManager();
    System.out.println("abc");
    byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, conn);
    System.out.println("def");
    response.setContentType("application/pdf");
    response.setContentLength(bytes.length);
    ServletOutputStream ouputStream = response.getOutputStream();
    ouputStream.write(bytes, 0, bytes.length);
    ouputStream.flush();
    ouputStream.close();
%>

4.2 jsp输出EXCEL报表

4.2.1 需要放到项目里的包
jasperreports-1.0.1.jar
poi-2.0-final-20040126.jar

4.2.2 输出excel要注意的:
(1) 输出excel报表必须fields的边界刚好填充满整个页面,不然会有大量的空白出现。
(2) 删除记录最下面的空行需要加上参数
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);
(3) 删除多余的ColumnHeader需要加上参数
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);
(4) 在ireport里给fields加上border,那输出的excel就会有很黑的边框,跟excel默认的灰度边框就会很不协调。但是如果不加border,在输出的excel里就不会显示每个表格的边框。
解决方法是:
第一步 在选中字段->右键->properties->Common->Transparent 打上勾。
第二步 在输出的jsp页面加上参数
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);

4.2.3 jsp输出EXCEL的例子:xls.jsp
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>
<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@ page import="net.sf.jasperreports.engine.JRException"%>
<%@ page import="net.sf.jasperreports.engine.JRExporterParameter"%>//excel
<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%>//excel
<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporter"%>//excel

<%
    String rowid = "1";
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn= DriverManager.getConnection("jdbc:oracle:thin:@*:*", "*","*");

    //装载jasper文件application
    File exe_rpt = new File(application.getRealPath("/ireports/report3.jasper"));
  
    //rowid就是iReport的变量$P{rowid}的名称
    Map parameters = new HashMap();
    parameters.put("getId", "50");
  
    try{

     // fill
     JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
   
     // excel输出
     ByteArrayOutputStream oStream = new ByteArrayOutputStream();
  
      JRXlsExporter exporter = new JRXlsExporter();  
    
      exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
      exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream);
      exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); // 删除记录最下面的空行
      exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);// 删除多余的ColumnHeader
      exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);// 显示边框
      exporter.exportReport();
    
     byte[] bytes = oStream.toByteArray();
   
     if(bytes != null && bytes.length > 0) {
      response.reset();
      response.setContentType("application/vnd.ms-excel");
       response.setContentLength(bytes.length);
      ServletOutputStream ouputStream = response.getOutputStream();
      ouputStream.write(bytes,0,bytes.length);
      ouputStream.flush();
      ouputStream.close();
  
     }else{
      out.print("bytes were null!");
     }
   
     conn.close();
     }catch(JRException ex){
     out.print("Jasper Output Error:"+ex.getMessage());
    }

%>

 

4.3 jsp输出html报表
没有意义,不想不写:tohtml.jsp

<%@page session="false"%>
<%@page import="net.sf.jasperreports.engine.*"%>
<%@page import="javax.naming.*"%>
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="java.util.*"%>
<%@page import="java.io.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title></title>
<%
    DataSource ds = null;
    try {
     // InitialContext ctx = new InitialContext();
      //ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
      //Connection conn = ds.getConnection();
      Class.forName("oracle.jdbc.driver.OracleDriver");
      Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@*:*", "*","*");

    //装载jasper 文件
      File business_rpt = new
          File(application.getRealPath("/ireports/report3.jasper"));
    //配置参数,可以参考《第二部分:使用Jasperreport 作为报表控件开发胖客户端报表应用》
    // http://blog.csdn.net/jemlee2002/archive/2004/10/08/JJem3.aspx
    //ProjectName 就是iReport 的变量$P{ProjectName}的名称,
    //参考第一部分的5.6 添加参数和使用参数
    //proname 就是从界面上获取的值。
      Map parameters = new HashMap();
      parameters.put("getId", "50");
    // JasperRunManager是一个输出控制管理类,下文会提及部分内容
      JasperRunManager.runReportToHtmlFile(business_rpt.getPath(), parameters, conn);
    //如果创建报表成功,则转向该报表,其实可以把报表套在框架内,这样实现比较有意义的报表格式。
      response.sendRedirect("/ireport/ireports/report3.html");
    }
    catch (Exception ex) {
      out.print("出现例外,信息是:" + ex.getMessage());
      ex.printStackTrace();
    }
%>
</head>
<body></body>
</html>

4.4把报表直接输出到word
我认为这是采用web方式的OA做报表的好方式。制作简单,只要修改原jsp文件,把输出方式该成调用word就行 。那么输出的报表直接调用word,运行是会弹出对话框问是否打开还是保存,选择打开,ie就直接调用word, 那客户就可以在word里直接编辑输出的报表了。
jsp文件修改的地方:<%@ page contentType="application/msword;charset=gb2312" %>
就是修改contentType的值。
例子:mytest.jsp

<%@ page contentType="application/msword;charset=gb2312" %>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>报表></title>
</head>
<body bgcolor="#FFFFFF">
<center><h1>报表</h1></center>
<table border=1 cellspacing=0 cellpadding=0 bordercolor=#000000 align=center>
<tr>
<td>用户名</td>
<td>真实姓名</td>
<td>性别</td>
</tr>
<%
java.sql.Connection sqlCon; //数据库连接对象
java.lang.String strCon; //数据库连接字符串
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//连接user数据库
strCon ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=kenoah" ;
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"sa","sa");
Statement stmt=sqlCon.createStatement();
ResultSet rs=stmt.executeQuery("select * from kenoahuser ");
//查询user表
while(rs.next()){
%>
<tr>
<td><%= rs.getString("fullname") %></td>
<td><%= rs.getString("mobile") %></td>
<td><%= rs.getString("workemail") %></td>
</tr>
<% } %>
<%
rs.close();
stmt.close();
sqlCon.close();
%>
</table>


五、备注

5.1 下载地址
iReport的官方网站:http://ireport.sourceforge.net/
jasperreports的官方网站:http://jasperreports.sourceforge.net/
tTextAsian的官方下载地址:http://itextdocs.lowagie.com/downloads/iTextAsian.jar
jfreechart的官方下载地址:http://www.jfree.org/jfreechart/
jcommon的官方下载地址:http://www.jfree.org/jcommon/
poi的官方下载地址:http://www.apache.org/dyn/closer.cgi/jakarta/poi/

 

JasperReport有如下几个主要的Manager:

JasperCompileManager

将jrxml文件编译成jasper文件或JasperReport对象

JasperFillManager

从数据源中获取数据并填充jasper文件或JasperReport对象,产生JasperPrint对象

JasperPrintManager

将JasperPrint对象直接输出到打印机打印

JasperExportManager

将JasperPrint对象导出成PDF或HTML文件(或流)

JasperRunManager

运行一个jasper文件或JasperReport对象并输出到PDF或Html文件(或流)中,我的理解是等于集成了JasperFillManagerJasperExportManager的功能

对于上述对象的详细说明请参阅JasperReport的文档。

例程:
public static void main(String[] args) {
        try {
          Class.forName("org.gjt.mm.mysql.Driver");
          Connection con = DriverManager.getConnection(
              "jdbc:mysql://wes:3306/umpdb?useUnicode=true&characterEncoding=GBK", "root", "elite");
          File f1 = new File("Account.jrxml");
          File f2 = new File("Contact.jrxml");
          JasperReport main = JasperCompileManager.compileReport(f1
              .getAbsolutePath());
          JasperReport report = JasperCompileManager.compileReport(f2
              .getAbsolutePath());
          Map props = new HashMap();
          props.put("subreport", report);
          JasperPrint print = JasperFillManager.fillReport(main, props,con);
          //JasperPrintManager.printReport(print,true);
          JasperExportManager.exportReportToPdfFile(print, "a.pdf");
          //JasperRunManager.runReportToPdfFile("Account.jasper", "a.pdf", props, con);
        } catch (ClassNotFoundException e) {
          // TODO 自动生成 catch 块
          e.printStackTrace();
        } catch (SQLException e) {
          // TODO 自动生成 catch 块
          e.printStackTrace();
        } catch (JRException e) {
          // TODO 自动生成 catch 块
          e.printStackTrace();
        }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics