ireport 學習筆記

來源:互聯網
上載者:User

交流QQ群:26651479

使用iReport製作報表的詳細過程(Windows環境下)

一、準備

1.1、 安裝JDK
    :http://www.sun.com
    驗證JDK或是JRE是否可以預設運行,在命令列(CMD)打入X:>java 可用時出現:Usage:java..開頭的一堆資訊
    不可用則必須進行配置,在windows的環境變數設定:
 path:在最後面加入“;java的安裝目錄”
 JAVA_HOME :“java的安裝目錄”
 CLASSPATH:“java的安裝目錄/bin”
    重新驗證JDK或是JRE是否可以在CMD運行

1.2、 下載iReport
    地址:http://ireport.sourceforge.net/

1.3、 準備資料庫
    iReport支援絕大部分資料庫,只要該資料庫能提供JDBC磁碟機。
    【特別提示】資料庫的版本要求與iReport檔案夾下的Lib目錄的使用驅動程式相容,建議下載最新版本的驅動

二、配置基本資料

2.1、配置介面使用的語言
    設定環境,通過【Tools】-【Options】開啟配置iReport系統的基本資料對話方塊。在“Language”裡面選擇語言,【Apply】確認。

2.2、設定資料庫串連
     這是報表與資料庫的介面。點擊[Report Datasources]按鈕開啟對話方塊。
     iReport 會記錄以前使用的所有串連,除非手工刪除,否則都會存在配置列表中,不管是否可用。
     點擊【New】進入配置新串連介面,填寫JDBC串連需要的資訊,iReport支援多種資料來源串連。
     如果需要報表提供中文內容顯示可以在JDBC URL下工夫,比如輸入:
         jdbc:mysql://localhost/SUBRDB?user=****&password=****&useUnicode=true&characterEncoding=GB2312
     [Test]按鈕可測試資料庫是否可用。

2.3、建立一個空報表的基本配置
     單擊工具列的第一個工具“New Report”,建立一個報表。

2.4、幾個重要的概念
     1) iReport 的輸出格式
        可以支援: PDF、HTML、CSV、JAVA2D、Excel、純文字、JRViewer,其中最常用的是PDF、JRViewer。
        JRViewer是直接以C/S方式作為報表的輸出格式,在JFrame架構下輸出。 Jasperreport 提供預設的JRViewer輸出類。
     2) 報表的動態物件變數、參數、欄位
        ·欄位(Fields):是資料庫抽取出來的,希望在報表中出現的資料庫內容。比如一個ID的所有值 $F{ filedsName }
        ·參數(Parameters):這是你的應用需要提供給報表的入口。
         比如你希望在報表被解釋的時候提供 Where語句的條件值,那麼就可以使用參數 $P{ parameterName }
        ·變數(Variables):這是報表中一些邏輯運算的表現,比如統計值 $V{ variablesName }
     3) 編譯、靜態運行、動態運行
        Jasperreport 運行時需要的就是一個jasper尾碼的檔案,編譯過程其實就是把jrxml尾碼的檔案產生 jasper尾碼的檔案。
        靜態運行和動態運行是相對的,後者帶資料來源運行,比如帶資料庫運行。
        靜態運行與資料來源無關,如果報表中出現和資料來源有關的對象,則以null顯示。
     4) 報表結構
        大致有:title、pageHeader、columnHeader、detial、columnFooter、pageFooter、summary、groupHeader、groupfooter。
        ·Title:每個報表一般會有一個名字,比如×××銷售報告,title就是擱置這個名稱的最好地方了
        ·pageHeader:報表的一些公用要素,比如頁碼、建立時間、建立人等資訊放置在這裡是比較好的選擇。
        ·columnHeader:無可非議的這裡是放置列的名稱,記住不是列資料。
        ·Detial:放置需要迴圈的資料,比如銷售記錄資料。
        ·columnFooter:放置列層級的統計計算值或是列的說明。
        ·pageFooter:放置頁層級的統計值或是頁的說明。
        ·Summary:可能需要對幾頁(你的報表可能由幾個頁組成)的統計值。在幾頁的Detial之後,出現一個統計頁面。
        ·groupHeader:每個表的內容可能需要根據某個屬性進行劃分顯示內容和計算內容。
         比如以月份為單位每組分開顯示記錄,那麼就可以定義一個組,groupHeader就是放置組說明或是組標誌最好的地方。
        ·Groupfooter:放置組的統計或是說明。

2.5、向表添加對象
     1) 添加靜態對象(Static Text)
        添加文本,拖動到[Static Text]Label到需要的地方,雙擊他寫進內容。還可編輯其大小、顏色等。
        添加圖片,點擊[Image Tool],選擇圖片,操作與Text 類似。其他靜態對象操作步驟類似。
     2) 建立 SQL 查詢語句
        通過菜單【資料來源】-【報表查詢】開啟SQL輸入對話方塊,並在【ReportSQL Query】Label中輸入SQL語句
        可自動或手動擷取資料庫表的可用Fields。單擊【OK】 ,儲存報表。
     3) 建立欄位動態對象
        欄位也就是資料庫中的欄位,通過欄位的列表(工具條上可以找到 [Text Field]),可以拖放detial段
     4) 建立組
        組是一個很重要的概念,一個報表可以多個組,每個組以一個關鍵字為標記。
        比如希望Bug統計是根據項目(或是產品)進行統計的。那麼可以設立一個項目標記的組。
     5) 添加參數和使用參數(Parameter)
        參數作用,一般是需要外界提供參數給報表的入口,比如SQL語句的 where 條件的運算式。
        通過【預覽】-【報表參數】開啟報表參數列表對話方塊(工具條上可以找到相應的工具)。
        當應用提供參數時,只要指定提供給這個參數,那麼報表解釋引擎即可替換這些變數然後再執行SQL語句
        例如:添加參數 id 後,可在報表的查詢語句裡加入 where memid = $P{id} ,頁面沒傳來這參數時,它的值為null
     6) 添加變數和使用變數
        變數的定義類似參數,通過【預覽】-【報表變數】開啟報表變數列表對話方塊(工具條上可以找到相應的工具)
        如定義一個Bug的計數器。除了自訂變數,iReport 還有提供一些內嵌(Buildin)的變數,比如頁碼,行記錄數等。

三、JSP組建檔案
     以下是一個產生報表檔案的jsp頁面執行個體

<%@ page pageEncoding="UTF-8" %>
<%@ page import="net.sf.jasperreports.engine.*" %>
<%@ page import="net.sf.jasperreports.engine.util.*" %>
<%@ page import="net.sf.jasperreports.engine.export.*" %>
<%@ page import="net.sf.jasperreports.view.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
<html>
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<%
    request.setCharacterEncoding("UTF-8");
    String printer = request.getParameter("printer");//頁面傳來的參數
    String doc = request.getParameter("doc"); //頁面傳過來的,需要調用的報表的名稱(如“member.jasper”就寫member)
    String loadType = request.getParameter("loadType");//需產生報表的檔案類型

    //串連到資料庫
    String url ="jdbc:mysql://127.0.0.1:3306/test";
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(url,"root", "root");
    //設置產生報表參數
    Map parameters = new HashMap();
    parameters.put("printer", printer);//把頁面參數傳給報表

    //設置jasper檔案
    //如果寫在Servlet裡,則這句的“application”應寫成“this.getServletContext()”
    File reportFile = new File(application.getRealPath("/reports/" + doc +".jasper"));
    JasperPrint jasperPrint = JasperFillManager.fillReport(reportFile.getPath(),parameters,conn);

    try
    {  
     JRExporter exporter = null;
        if ( "xls".compareTo(loadType) == 0 )
     {
         response.setContentType("application/vnd.ms-excel");
         response.addHeader("Content-Disposition", "attachment;filename=" + jasperPrint.getName() + ".xls");
      exporter = new JRXlsExporter();
      exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);

      exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
        exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
     }
     else if ( "pdf".compareTo(loadType) == 0 )
     {
         response.setContentType("application/pdf");
         response.addHeader("Content-Disposition", "attachment;filename=" + jasperPrint.getName() + ".pdf");
            exporter = new JRPdfExporter();
     }
     else if ( "html".compareTo(loadType) == 0 )
     {
         response.setContentType("application/octet-stream");
         response.addHeader("Content-Disposition", "attachment;filename=" + jasperPrint.getName() + ".html");
            exporter = new JRHtmlExporter();
            exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
     }
     else if ( "rtf".compareTo(loadType) == 0 )
     {
         response.setContentType("application/octet-stream");
         response.addHeader("Content-Disposition", "attachment;filename=" + jasperPrint.getName() + ".rtf");
            exporter = new JRRtfExporter();
     }
     else if ( "csv".compareTo(loadType) == 0 )
     {
         response.setContentType("application/octet-stream");
         response.addHeader("Content-Disposition", "attachment;filename=" + jasperPrint.getName() + ".csv");
            exporter = new JRCsvExporter();
     }
     else if ( "xml".compareTo(loadType) == 0 )
     {
            exporter = new JRXmlExporter();
     }
     else
     {
            JasperViewer.viewReport(jasperPrint); //不建議用到這個
            throw new Exception();
     }
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream());
        exporter.exportReport();
    }
    catch ( JRException e )
    {
     System.out.println("-----report.jsp.err: " + e);
     throw new ServletException(e);
    }
    catch ( Exception e )
    {
     System.out.println("----- view report -----");
    }
    finally
    {
        if(conn!=null)try{conn.close();}catch(Exception e){e.printStackTrace();}
    }
%>
</body>
</html>

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.