Contenu connexe
Similaire à Report out 2007final (20)
Report out 2007final
- 1. 目 錄
前言..........................................................................................................................................................2
壹.製作準備 .............................................................................................................................................2
(一)下載所需.........................................................................................................2
(二)環境建置.........................................................................................................3
貳.使用 Ireport 設計報表 ........................................................................................................................3
(一)報表欄位、變數與參數設定.........................................................................4
(1)Using Field ................................................................................................4
(2)Using Group ..............................................................................................5
(3)Using variable ...........................................................................................6
(4)Using Parameter ........................................................................................7
(二)報表內文設計.................................................................................................7
(1)設計報表架構...........................................................................................7
(2)加入報表物件...........................................................................................9
(3)編譯 JRxml 檔 ........................................................................................15
參.在網頁上執行 ...................................................................................................................................16
簡介 JasperReport API ........................................................................................16
程式撰寫..............................................................................................................18
HTML 輸出 .................................................................................................18
HTML 呈現 .................................................................................................20
HTML 預覽與列印 .....................................................................................22
其它輸出格式......................................................................................................26
PDF 輸出 .....................................................................................................26
Excel 輸出 ...................................................................................................28
Xls 輸出 .......................................................................................................28
RTF 輸出 .....................................................................................................29
參考文件................................................................................................................................................30
1
- 2. 前言
本文流程是以一個案例來說明報表的製作,因此,其案例需求描述為:將一
份關鍵名單依照”城市別”作分群並記算其筆數,而後以報表印出。(本案例參考
來自:jasperReport_prj1.2.7 的 demo case。)因此,預期會有:
1. 製作「分群」的報表。過程會實作如何設定報表欄位、報表變數以及報表參
數。
2. 藉由 java 網頁程式,以實現用 Borwser 觀看常見的報表格式。
3. 簡介 JasperReport 關於報表輸出格式的 API。
最後,不免俗地,再 review 一下 JasperReport 之目的吧:
The main purpose of JasperReports is to help create page-oriented
ready-to-print documents in a simple and flexible manner。
壹.製作準備
(一)下載所需
1. Ireport1.2.7(內即附有 JasperReport.jar)
http://prdownloads.sourceforge.net/ireport/iReport-1.2.7-windows-installer.e
xe?download
2. ItextAsian.jar (當無此,如指定 pdf 為 output 文件,將無法顯示字型)
http://itext.sourceforge.net/downloads/iTextAsian.jar
3. Tomcat4 or later http://tomcat.apache.org/
4. JDK http://java.sun.com
2
- 3. (二)環境建置
1. 為使編譯後的*.jasper 與*.jrxml 放在同一目錄:
Options > 選項 > 編譯,勾選"編譯在報表資料夾"。
2. 設定外部程式 pdf:
Options > 選項 > 外部程式,設定[pdf 預覽],找到 pdf 的執行程式
AcroRd32.exe。其它如 html, rtf, cvs 等亦是可設定。
3. 啟動一個 tomcat server。
貳.使用 Ireport 設計報表
本範例設計結果如下:
而其執行結果如下:(PDF format)
3
- 4. (一)報表欄位、變數與參數設定
下拉式選單 檔案 > 開啟新檔,在”報表名稱”填入一報表名
稱”PrintReport.jrxml”,其它照預設。
在 檔案 > 存檔,存至<webroot>out_demoreports 下。
(1)Using Field
建立四個欄位,並在 預覽 > 報表欄位 > 新增,設定如下:
欄位名 屬性設定
City 預設
Id: [Field class type]:Java.lang.integer
Name 預設
Street 預設
4
- 5. (2)Using Group
預覽 > 報表群組 > 新增,新增設定如下:
一
群組欄位 屬性設定
CityGroup [Group expression] $F{City}
[Min height to start new page] 60
[Group header(footer) band height] 20
Note:
在報表結構內會產生一”CityGroupHeader”
與”CityGroupFooter”,且[報表變數]會自動產生對應變數。
5
- 6. (3)Using variable
在 預覽 > 報表變數 > 新增,設定如下:
變數名 屬性設定
CityNumber [Variable Name] CityNumber
[class type] Integer
[calcuation type] System
[Reset type] Group
[Reset group] Citygroup
[Increment type] None
[Initial value expression]
($V{CityNumber} != null)?(new
Integer($V{CityNumber}.intValue() + 1)):(new
Integer(1))
(注意不是 variable expression)
6
- 7. (4)Using Parameter
在 預覽 > 報表參數 > 新增,新增設定如下:
參數名 屬性設定
BaseDir,報表之 Logo 圖 [Class type] java.lang.File
片的路徑指定。 勾選 is for prompt
ReportTitle [Class type] java.lang.String
勾選 is for prompt
(二)報表內文設計
(1)設計報表架構
要在報表內文加入各種物件前,先調整高度,以利配置物件:
在 預覽 > 欄,設定 Band height
7
- 8. 分別設定如下:
Document Struct Setup
Title Band:height 50
PageHeader Band:height 20
ColumnHeader Band:height 0
CityGroupHeader Band:height 20
Detailer Band:height 20
CityGroupFooter Band:height 20
ColumnFooter Band:height 0
PageFooter Band:height 40
Summary Band:height 0
8
- 10. Image 【Image】 1.在[Image expresson]加入
new File($P{BaseDir}, "via.gif")
2.[Class]選 java.io.File
【Hyper-link】 1.[hyperlink target]:self
2.[hyperlink type]:reference
3.[hyperlink reference]加入
“www.viatech.com”
Text Field 【Text Field】 [evaluation time]:Now
[Textfield expression]:$P{ReportTitle}
【Font】 [Font name]新細明體(中文字型即可)
[PDF font name] Msung-Light
[PDF Encoding]
UniCNS-UCS2-H (Chinese traditional)
勾取 PDF Embedded
(B)PageHeader
設定如下:
報表物件 頁籤設定 屬性設定
【common】 [backgroup] ,[Foregroup] black
Rectangle
[top]:5
[left]:0
[height]:15
10
- 11. Static text 【common】 [backgroup] black
[Foregroup] white
分別設置三個: 【Font】 [Font name]新細明體(中文字型即可)
ID,Name,Street [PDF font name] Msung-Light
[PDF Encoding]
UniCNS-UCS2-H (Chinese traditional)
勾取 PDF Embedded
【static Text】 分別填入”ID”,”姓名”,”住所街道”
(C)CityGroupHeader
設定如下:
報表物件 頁籤 屬性設定
【common】 1.[bg],[fg]: 銀色
Rectangle
TextField 【common】 勾選[transparent]
(下方圖層看顯現出來)
【Font】 [Font name]新細明體(中文字型即可)
[PDF font name] Msung-Light
[PDF Encoding]
UniCNS-UCS2-H (Chinese traditional)
勾取 PDF Embedded
11
- 12. 【TextField】 [TextField Expression]:
" "+
String.valueOf($V{CityNumber}) + ". "
+ String.valueOf($F{City})
【Common】 依序設定 top, left, height 分別為 19, 0, 1
Line
(D)Detailer
報表物件 頁籤 屬性設定
TextField 【TextField】 在[Textfield expression],分別對三個
物件加入:
分別加入 $F{Id}
三個: $F{Name}
id,name,str $F{Street}
eet 【Font】 [Font name]新細明體(中文字型即可)
[PDF font name] Msung-Light
[PDF Encoding]
UniCNS-UCS2-H (Chinese
traditional)
勾取 PDF Embedded
【Common】 依序設定 top,left,height:19, 0, 1
Line
12
- 13. (E)CityGroupFooter
報表物件 頁籤 屬性設定
【common】 依序設定 top,left,height:19, 0, 1
Line
Static text Count
【Static Text】加入文字 ”計數:”
【Font】 [Font name]新細明體(中文字型即可)
[PDF font name] Msung-Light
[PDF Encoding]
UniCNS-UCS2-H (Chinese traditional)
勾取 PDF Embedded
Text field 【Text Field】[Textfield expression] 加入
$V{CityGroup_COUNT}
【Font】 [Font name]新細明體(中文字型即可)
[PDF font name] Msung-Light
[PDF Encoding]
UniCNS-UCS2-H (Chinese traditional)
勾取 PDF Embedded
(F)PageFooter
13
- 14. 報表物件 頁籤 屬性設定
【Common】 分別設定 Top,Left,Height:10, 0, 1
Line
TextField 【Text Field】1. [Evaluation Time] now
2. [Textfield expression]
"Page " +
String.valueOf($V{PAGE_NUMBER}) + "
of"
TextField 【TextField】 1.[Evaluation time] Report
2.[TextField expression]
" " + String.valueOf($V{PAGE_NUMBER})
TextField 【TextField】 1. [Evaluation time] Now
2. [Textfield expression] “關鍵名單”
註:上述三者 [Font name]新細明體(中文字型即可)
[PDF font name] Msung-Light
的【Font】
[PDF Encoding]
UniCNS-UCS2-H (Chinese traditional)
勾取 PDF Embedded
設計完後,大致對照如下圖:
14
- 15. (3)編譯 JRxml 檔
將設計好的 JRxml 檔作編譯,建立 > 編譯,編譯後的檔案(jasper),會
放置於同目錄內。此外,亦可於 ireport 直接執行報表(先決定要預覽的 format)
15
- 16. 參.在網頁上執行
簡介 JasperReport API
該架構圖主要呈現與報表輸出有關的 API,其由上而下的順序,使得以瞭解
報表中介過程中所會使用的程式介面為何,如此,將有助程式員之程式的開發。
下方會展示不同格式文件的輸出,將會用到架構圖上的所列 API。
各項類別的內容可參閱官方 JasperRepor API
http://jasperreports.sourceforge.net/api/index.html。
jasperReport 類別 功能說明
JasperCompilerManager 負責將*.jrxml 編譯成*.jasper or JasperReport 物
件。
JasperFillManger 負責將*.jasper 轉製成*.jrprint or JasperPrint 物
件。
JasperRunManager 負責將*.jasper 轉製成所需輸出格式的文件。
Jr***Export 負責將*.jrprint or JasperPrint 物件轉製成所需輸
包括有: 出格式的文件。
JexcelApiExporter
JRCvsExporter
JRHtmlExporter
JRPdfExporter
JRRtfExporter 等
JasperExportManager 負責將*.jrprint or JasperPrint 物件轉製成所需輸
出格式的文件。
JasperPrintManager 負責將*.jrprint or JasperPrint 物件列印出。
16
- 17. JasperReport 輸出相關 API 架構圖
*.Jrxml 檔
JasperCompilerManager
Class 之方法
JapserReport 物件 *.Jasper 檔
JasperFillManger
Class 之方法
*.Jrprint 檔 JasperPrint 物件
JasperRunManager Class
Jr***Export
之方法
Class 之方法
JasperExportManager
Class 之方法
不同文件格式輸出檔
(如 Html, Rtf, Pdf 等)
JasperPrintManager
Class 之方法
文
件
17
- 18. 程式撰寫
HTML 輸出
Out_demo/HtmlOutput.jsp
<%--
HTML 文件輸出(在同一目錄下)
--%>
<%@ page contentType="text/html; charset=Big5" %>
<%@ page import="datasource.*" %>
<%@ 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.j2ee.servlets.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%
//取得並讀取 jasper 檔,以取得 jasperReport 物件
File reportFile = new
File(application.getRealPath("/out_demo/reports/PrintReport.jasper"));//注意*.jasper 之路徑
if (!reportFile.exists())
throw new JRRuntimeException("File PrintReport.jasper not found. The report design
must be compiled first.");
JasperReport jasperReport =
(JasperReport)JRLoader.loadObject(reportFile.getPath());
//設定報表參數
Map parameters = new HashMap();
parameters.put("ReportTitle", "地址表列");
parameters.put("BaseDir", reportFile.getParentFile());
//取得 jasperPrint 物件,但並未實際產生列表檔
JasperPrint jasperPrint =
JasperFillManager.fillReport(
jasperReport,
18
- 19. parameters,
new WebappDataSource()
);
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);//指定要輸
入的列表檔
File destFile = new File(reportFile.getParent(), jasperPrint.getName() + ".Html");
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
destFile.toString());//指定輸出名稱
//*****可在輸出的 html 檔內加入一些文字,包括:檔頭、頁間、檔尾。****
// exporter.setParameter(JRHtmlExporterParameter.HTML_HEADER, "hello amos");
// exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML,
"mary is good");
// exporter.setParameter(JRHtmlExporterParameter.HTML_FOOTER, "life is dream");
exporter.exportReport();//執行
%>
<html>
<body>
已成功輸出一個 html 檔!
</body>
</html>
19
- 20. HTML 呈現
Out_demo/HtmlShow.jsp
<%--
Html 文件呈現(在同一目錄下)
--%>
<%@ page contentType="text/html; charset=Big5" %>
<%@ page import="datasource.*" %>
<%@ 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.j2ee.servlets.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%
//取得並讀取 jasper 檔,以取得 jasperReport 物件
File reportFile = new
File(application.getRealPath("/out_demo/reports/PrintReport.jasper"));
20
- 21. if (!reportFile.exists())
throw new JRRuntimeException("File PrintReport.jasper not found. The report design
must be compiled first.");
JasperReport jasperReport =
(JasperReport)JRLoader.loadObject(reportFile.getPath());
//設定報表參數
Map parameters = new HashMap();
parameters.put("ReportTitle", "地址表列");
parameters.put("BaseDir", reportFile.getParentFile());
//取得 jasperPrint 物件,但並未實際產生列表檔
JasperPrint jasperPrint =
JasperFillManager.fillReport(
jasperReport,
parameters,
new WebappDataSource()
);
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);//指定要輸
入的列表檔
File destFile = new File(reportFile.getParent(), jasperPrint.getName() + ".Html");
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
destFile.toString());//指定輸出名稱
//******非常重要的功能 分頁 指定 pageIndex 可使 scroll_bar auto_move*************
: ; ,
// exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex));
exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);//輸出文件於
response 網頁上
//指定文件圖檔部份,無設此者,僅呈現文字
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
"../servlets/image?image=");
exporter.exportReport();//執行
%>
<html>
<head>
21
- 22. <title>
已成功呈現一個 html 檔!
</title>
</head>
<body>
已成功輸出一個 html 檔!
</body>
</html>
HTML 預覽與列印
預覽
Out_demo/HtmlPrint.jsp
<%--
針對 HTML 的列印需求,包括"預覽列印"、"列印單頁報表"、"列印全部報表"
--%>
<%@ page contentType="text/html; charset=big5" %>
<%@ page import="datasource.*" %>
<%@ 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.j2ee.servlets.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%
JasperPrint jasperPrint=null;
jasperPrint=(JasperPrint)session.getAttribute("ReportDuc");
if (request.getParameter("reload") != null || jasperPrint == null)
{
File reportFile = new
File(application.getRealPath("/out_demo/reports/PrintReport.jasper"));
if (!reportFile.exists())
22
- 23. throw new JRRuntimeException("File PrintReport.jasper not found. The
report design must be compiled first.");
JasperReport jasperReport =
(JasperReport)JRLoader.loadObject(reportFile.getPath());
Map parameters = new HashMap();
parameters.put("ReportTitle", "列印名單");
parameters.put("BaseDir", reportFile.getParentFile());
jasperPrint =
JasperFillManager.fillReport(
jasperReport,
parameters,
new WebappDataSource()
);
session.setAttribute("ReportDuc", jasperPrint);
}
JRHtmlExporter exporter = new JRHtmlExporter();
//*********************換頁設計 start*********************************/
int pageIndex = 0;
int lastPageIndex = 0;
if (jasperPrint.getPages() != null)
{
lastPageIndex = jasperPrint.getPages().size() - 1;
}
String pageStr = request.getParameter("page");
try
{
pageIndex = Integer.parseInt(pageStr);
}
catch(Exception e)
{
e.printStackTrace();
}
if (pageIndex < 0)
{
23
- 24. pageIndex = 0;
}
if (pageIndex > lastPageIndex)
{
pageIndex = lastPageIndex;
}
//*********************換頁設計 end*********************************/
StringBuffer sbuffer = new StringBuffer();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, sbuffer);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
"../servlets/image?image=");
exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex));
exporter.exportReport();
%>
<html>
<head>
<style type="text/css">
a {text-decoration: none}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=big5"></head>
<body text="#000000" link="#000000" alink="#000000" vlink="#000000" >
<table width="100%" border="0" align="center">
<tr>
<td width="10%"> </td>
<td width="82%"><hr size="1" color="#000000">
<strong></strong></td>
<td width="8%"><font size="4">列印</font></td>
</tr>
<tr>
<td> </td>
<td>
<font size="2"><table width="100%" border="0">
<tr>
24
- 25. <td width="15%"><a href="print/printall.jsp" target="_blank">印報表<font
size="2">全</font></a><font color="#3366FF" size="4"><strong>|</strong></font>
</td>
<td width="1%"> </td>
<td width="15%"><div onClick="window.print()" style="cursor:hand"><font
color="#0033FF">印網頁</font><font color="#3366FF"
size="4"><strong>|</strong></font></div></td>
<script>
function isprint()
{
if(confirm("列印此頁?"))
window.open("print/printThis.jsp?index=<%=pageIndex%>","列印我");
}
</script>
<td width="15%"><div onClick="isprint()" style="cursor:hand">印本頁<font
color="#3366FF" size="4"><strong>|</strong></font></div></td>
<td width="10%"><a href="HtmlPrint.jsp?page=0">首頁</a><font color="#3366FF"
size="4"><strong>|</strong></font></td>
<td width="10%"><a href="HtmlPrint.jsp?page=<%=pageIndex - 1%>">上頁</a><font
color="#3366FF" size="4"><strong>|</strong></font></td>
<td width="10%"><a href="HtmlPrint.jsp?page=<%=pageIndex + 1%>">下頁</a><font
color="#3366FF" size="4"><strong>|</strong></font></td>
<td width="10%"><a href="HtmlPrint.jsp?page=<%=lastPageIndex%>">尾頁</a><font
color="#3366FF" size="4"><strong>|</strong></font></td>
<td width="15%"><a href="HtmlPrint.jsp?reload=true">重新下載</a><font
color="#3366FF" size="4"><strong>|</strong></font></td>
</tr>
</table></font>
</td>
<td>示範</td>
</tr>
</table>
25
- 26. <hr>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="30%" height="33"> </td>
<td align="center"> <%=sbuffer.toString()%> </td>
<td width="27%"> </td>
</tr>
</table>
</body>
</html>
列印
<%
//out_demoprintprintThis.jsp
String aa=request.getParameter("index");
JasperPrint jasperPrint =
(JasperPrint)session.getAttribute("ReportDuc");
JasperPrintManager.printPage(jasperPrint,Integer.parseInt(aa),false);
%>
//out_demoprintprintall.jsp
<%
JasperPrint jasperPrint =
(JasperPrint)session.getAttribute("ReportDuc");
JasperPrintManager.printReport(jasperPrint,true);
%>
其它輸出格式
包括有受歡迎的 pdf,以及 xls、csv、rtf 等。
PDF 輸出
程式碼:Out_demo/PdfShow.jsp
26
- 27. 在 Web.xml 設定,使用 jsp-file 做報表元件的話,於 web.xml 加上下述
<servlet>
<servlet-name>pdf</servlet-name>
<jsp-file>out_demo/PdfShow.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>pdf</servlet-name>
<url-pattern>servlets/PdfShow.pdf</url-pattern>
</servlet-mapping>
此外,如果是使用 servlet 做報表元件的話,於 web.xml 加上下述
<servlet>
<servlet-name>pdfreport</servlet-name>
<servlet-class>out_demo/PdfShow.jsp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> pdfreport </servlet-name>
<url-pattern>serlvers/PdfShow.pdf</url-pattern>
</servlet-mapping>
27
- 28. Excel 輸出
程式碼:Out_demo/ExcelShow.jsp
圖表 1
加這段文字於 web.xml
<servlet>
<servlet-name>csvreport</servlet-name>
<jsp-file>out_demo/CsvShow.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name> csvreport </servlet-name>
<url-pattern>servlets/CsvShow.csv</url-pattern>
</servlet-mapping>
Xls 輸出
程式碼:Out_demo/XlsShow.jsp
28
- 29. 加這段文字於 web.xml
<servlet>
<servlet-name>xslreport</servlet-name>
<jsp-file>out_demo/XslShow.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>xslreport</servlet-name>
<url-pattern> servlets/ XslShow.xls </url-pattern>
</servlet-mapping>
RTF 輸出
程式碼:Out_demo/RtfShow.jsp
29
- 30. 加這段文字於 web.xml
<servlet>
<servlet-name>rtfreport</servlet-name>
<jsp-file>out_demo/Rtfshow.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>rtfreport</servlet-name>
<url-pattern>servlets/Rtfshow.rtf</url-pattern>
</servlet-mapping>
參考文件
1. 製作 iReport 的動畫教學:Tutorials
http://jasperforge.org/sf/wiki/do/viewPage/projects.ireport/wiki/HomePage
2. http://www.cjsdn.net/post/view?bid=29&id=103643&sty=3:初階 user 可參考
仍有許多不完美的地方,請多指教!!謝謝 From Amos
30