交流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>