ireport中文學(xué)習(xí)用戶手冊(cè)_第1頁(yè)
ireport中文學(xué)習(xí)用戶手冊(cè)_第2頁(yè)
ireport中文學(xué)習(xí)用戶手冊(cè)_第3頁(yè)
ireport中文學(xué)習(xí)用戶手冊(cè)_第4頁(yè)
ireport中文學(xué)習(xí)用戶手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩167頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、目錄ireport用戶手冊(cè)1ireport用戶手冊(cè) - 介紹1ireport報(bào)表結(jié)構(gòu)1ireport報(bào)表元素2ireport字體和樣式(fonts and styles)2ireport字段,參數(shù),變量2ireport欄和組(band and group)2ireport子報(bào)表(subreport)2ireport數(shù)據(jù)源2常規(guī)問題解決方案2ireport jasperreports深入講解2ireport 報(bào)表結(jié)構(gòu)完全掌握2ireport 報(bào)表元素大全2ireport 中字體編碼說(shuō)明2ireport 字段,參數(shù)和變量精解2ireport bands and groups2ireport用戶手冊(cè)

2、ireport用戶手冊(cè) - 介紹 cubebi.com 立方開源商業(yè)智能 ireport是一個(gè)能夠創(chuàng)建復(fù)雜報(bào)表的開源項(xiàng)目。它100%使用java語(yǔ)言編寫。是目前全球最為流行的開源報(bào)表設(shè)計(jì)器。由于它豐富的圖形界面,你能夠很快的創(chuàng)建出任何一種你想要的報(bào)表。以下是ireport一些比較突出的功能: 拖拽式,所見即所得的報(bào)表編輯器。 多樣的向?qū)?lái)簡(jiǎn)化復(fù)雜的報(bào)表設(shè)計(jì)任務(wù)。 超過30個(gè)排版和格式化工具。 報(bào)表可轉(zhuǎn)換為pdf html excel flash csv rtf txt openoffice java2d jrviewer等格式。 支持所有有效的數(shù)據(jù)源。如:jdbc,cvs,hibernate,

3、javabean等 用戶自定義數(shù)據(jù)源。 無(wú)限次數(shù)的 撤消/重做。 集成腳本(scriptlet)支持。 內(nèi)置圖表支持:超過20種的圖表支持。并可擴(kuò)展。國(guó)際化:集成超過15種語(yǔ)言。 報(bào)表模板與報(bào)表庫(kù)樣式管理。 源文件的備份 文檔結(jié)構(gòu)瀏覽器ireport報(bào)表結(jié)構(gòu) cubebi.com 立方開源商業(yè)智能 在本章中我們將一起來(lái)分析一下報(bào)表的結(jié)構(gòu),看一下報(bào)表中每一部分的作用是什么,以及在生成報(bào)表的時(shí)候每一部分將產(chǎn)生什么樣的效果。4.1 欄(bands)報(bào)表被垂直分成若干個(gè)部分,每一個(gè)部分我們叫它為“band”。每一個(gè)band都有自己的特性,在報(bào)表生成的時(shí)候有些會(huì)打印一次,有些會(huì)打印多次。如下圖。圖4.1

4、接下來(lái)我們就對(duì)每一種類型的band分別進(jìn)行介紹。title band:title 段只在整個(gè)報(bào)表的第一頁(yè)的最上面部分顯示,除了第一頁(yè)以外,不管報(bào)表中共有多少個(gè)頁(yè)面也不會(huì)再出現(xiàn)title band 中的內(nèi)容。pageheader band:顧名思義,pageheader 段中的內(nèi)容將會(huì)在整個(gè)報(bào)表中的每一個(gè)頁(yè)面中都會(huì)出現(xiàn),顯示在位置在頁(yè)面的上部,如果是報(bào)表的第一頁(yè),pageheader 中的內(nèi)容將顯示在title band 下面,除了第一頁(yè)以外的其他所有頁(yè)面中。pageheader 中的內(nèi)容將顯示在頁(yè)面的最上端。pagefooter band:顯示在所在頁(yè)面的最下端。detail band: 報(bào)表

5、內(nèi)容段,在這個(gè)band 中設(shè)計(jì)報(bào)表中需要重復(fù)出現(xiàn)的內(nèi)容,detail 段中的內(nèi)容每頁(yè)都會(huì)出現(xiàn)。columnheader band:針對(duì)detail band 的表頭段,一般情況下在這個(gè)段中畫報(bào)表的表頭。columnfooter band:針對(duì)detail band 的表尾段。summary band:表格的合計(jì)段,出現(xiàn)在整個(gè)報(bào)表的最后一頁(yè)中的detail band 的后面,一般用來(lái)統(tǒng)計(jì)報(bào)表中某一個(gè)或某幾個(gè)字段的合計(jì)值。為了實(shí)際演示各個(gè)band的生成效果,我們可以在報(bào)表中的各個(gè)band里添加不同的對(duì)象,以測(cè)試各個(gè)band的作用。從示例數(shù)據(jù)庫(kù)的employee表里取數(shù)據(jù),在query editor

6、里輸入下面的語(yǔ)句:select top 10 * from employee圖4.2在報(bào)表中的各個(gè)band分別放置如下內(nèi)容:圖4.3啟動(dòng)報(bào)表,生成的效果如下:圖4.4 生成的報(bào)表第一頁(yè)圖4.5生成的報(bào)表第二頁(yè),也是最后一頁(yè)ireport報(bào)表元素 cubebi.com 立方開源商業(yè)智能 在本章中我們將要解釋可以在報(bào)表中使用的對(duì)象及他們的相關(guān)屬性。我們所說(shuō)的元素主要是一些圖形對(duì)象,比如text,rectangle等。在ireport中沒有段落,表格或分頁(yè)的概念,在報(bào)表中最基本的對(duì)象主要有七個(gè): -line-rectangle-ellipse-static text-text field-image

7、-subreport-crosstab-chart通過以上這些組件的組合我們可以做出各種各樣復(fù)雜的報(bào)表樣式。ireport提供兩種特殊的圖形對(duì)象:chart和barcode。每一種類型的對(duì)象都有一些通用的屬性,如高度、寬度、位置、所在的band等。除此之外還有一些針對(duì)不同元素的特殊屬性。每一個(gè)元素都必須在一個(gè)band內(nèi)部,如果一個(gè)元素跨了一個(gè)以上的band,那么在編譯的時(shí)候?qū)?huì)拋出元素位置錯(cuò)誤的異常。要添加一個(gè)元素到報(bào)表中,我們可以從主工具欄中選擇相應(yīng)的工具,然后添加到報(bào)表區(qū)域中即可。圖5.1我們可以通過雙擊對(duì)象或右鍵菜單打開元素的屬性設(shè)置窗口。圖5.2屬性窗口由若干個(gè)標(biāo)簽頁(yè)構(gòu)成,“commo

8、n”標(biāo)簽里包含每一個(gè)組件都具有的通用屬性,其它的標(biāo)簽頁(yè)是針對(duì)不同元素的屬性設(shè)置。在下面的章節(jié)中,我們將對(duì)每一個(gè)對(duì)象的使用做詳細(xì)的介紹。ireport字體和樣式(fonts and styles) cubebi.com 立方開源商業(yè)智能 一個(gè)style是一個(gè)預(yù)定義的屬性的集合用來(lái)控制元素的外觀(比如背景色、邊框線、字體等)。我們可以為我們的報(bào)表定義一個(gè)默認(rèn)的style。要為一個(gè)元素應(yīng)用一個(gè)style,我們可以選擇該元素并從元素的屬性窗口common標(biāo)簽里的style列表選擇你需要的style。fonts是用來(lái)描述text的外觀特征。此外,你可以定義一個(gè)名為“report font”的全局字體。6

9、.1 字體(font)通常定義一個(gè)字體,我們需要做下面幾件事情:-font name(字體名稱)-font dimension(字體大小)-attribute(屬性,諸如bold-faced,italics,underlined,barred)如果我們需要導(dǎo)出pdf格式的報(bào)表,需要為字體添加下面的信息:pdf font name:pdf字體名稱(預(yù)先定義pdf字體或一個(gè)在classpath里的tif文件的名稱)。pdf embedded:當(dāng)使用一個(gè)外部的ttf類別的字體文件生成報(bào)表時(shí)是否把它包含在pdf文件里的一個(gè)標(biāo)志。pdf encoding:指定一個(gè)字體編碼名稱。如果我們需要將報(bào)表導(dǎo)出成p

10、df格式,將會(huì)使用指定的pdf字體,其它屬性將會(huì)被忽略掉。如果我們使用擴(kuò)展的ttf(true type font),那么擴(kuò)展的字體文件(以.ttf結(jié)尾的文件名)必須放置在classpath當(dāng)中。圖6.1在“font name”下拉框中,僅顯示的是java虛擬機(jī)管理的系統(tǒng)默認(rèn)字體,因此,如果要選擇一個(gè)擴(kuò)展的ttf字體在非pdf格式報(bào)表中,那么我們首先需要在使用之前在系統(tǒng)中把這些字體安裝好。圖6.2上面的字體列表中顯示是內(nèi)置的pdf字體集合,如果直接去編輯下拉框里的字體但這些字體在設(shè)計(jì)時(shí)候不可用,如果字體文件在啟動(dòng)的時(shí)候找不到,那將會(huì)產(chǎn)生一些錯(cuò)誤。如果我們選擇的字體是一個(gè)擴(kuò)展的ttf格式字體,要保

11、證在導(dǎo)出pdf格式時(shí)顯示正確,請(qǐng)勾選“pdf embedded”復(fù)選框。如果要導(dǎo)出pdf格式報(bào)表選擇正確的字體編碼至關(guān)重要。encoding指定字體如何被編譯。舉個(gè)例子,如果使用意大利語(yǔ),要打印正確的重音符(比如:, , a, )我們必須使用cp1252編碼格式。ireport在下拉框里有一些預(yù)定義的編碼格式。當(dāng)報(bào)表導(dǎo)出pdf時(shí)包含一些非標(biāo)準(zhǔn)的字符時(shí),要保證所有的fields都有相同的編碼格式并且檢查從數(shù)據(jù)庫(kù)里讀出的數(shù)據(jù)采用的字符集格式。6.2 樣式(styles)我們可以選擇主菜單的“format styles” 來(lái)定義一個(gè)style。如下圖所示:圖6.3點(diǎn)擊“new”按鈕添加一個(gè)新的sty

12、le。在彈出的窗口中我們可以定義一些屬性,如果我們需要某個(gè)屬性的值,我們可以點(diǎn)擊 按鈕來(lái)實(shí)現(xiàn)。圖6.4在每個(gè)元素屬性窗口的“common”標(biāo)簽里有一個(gè)style屬性下拉框,如果我們需要為一個(gè)元素設(shè)置一個(gè)style,我們可以在這個(gè)下拉框里選擇我們定義好的style,這樣就可以把一個(gè)style應(yīng)用到一個(gè)元素上面啦。圖6.5我們可以為一個(gè)style加一個(gè)動(dòng)態(tài)的條件,當(dāng)條件滿足的時(shí)候采用某個(gè)style,否則就采用默認(rèn)的style。舉個(gè)例子,還是以doradosample里的hsql數(shù)據(jù)庫(kù)里的employee表為例,如果員工的薪水大于3500,我們讓薪水以紅色加粗的字體顯示。打開query窗口,輸入下面

13、的查詢sql:select * from employee圖6.6 新建一個(gè)style,在彈出窗口的style conditions里新建一個(gè)conditions,在表達(dá)式窗口里輸入下面的表達(dá)式:($fsalary.intvalue()3500?new boolean(true):new boolean(false)如下圖:圖6.7新建的style如下圖:圖6.8接下來(lái)把員工姓名和員工薪水拖到報(bào)表當(dāng)中,并將我們新建的style應(yīng)用到薪水這個(gè)field上,如下圖:圖6.9啟動(dòng)查看運(yùn)行效果如下:圖6.10ireport字段,參數(shù),變量 cubebi.com 立方開源商業(yè)智能 在ireport中有三

14、種類型的對(duì)像可以用來(lái)保存數(shù)據(jù):fields/parameters/variables.這三種對(duì)象可以用在某些地方的expression中,通過一定的邏輯在報(bào)表生成的時(shí)候動(dòng)態(tài)的更改某些值。fields/parameters/variables有類型的概念,它們的類型就是一個(gè)標(biāo)準(zhǔn)的java的object。要使用這三種類型的對(duì)象我們必須首先創(chuàng)建它,創(chuàng)建的方法是點(diǎn)擊“view”主菜單中,選擇其中的子菜單fields,variables,parameters我們可以創(chuàng)建不同的對(duì)象。通過這三個(gè)子菜單我們可以查看并管理fields,variables,parameters對(duì)象。圖1.1通過該窗口,我們可以創(chuàng)

15、建,修改,刪除這三種類型對(duì)象。7.1 字段(fields)field在ireport是專門用來(lái)組織記錄。field的創(chuàng)建有多種途徑可以實(shí)現(xiàn),我們可以根據(jù)在ireport中各種類型的數(shù)據(jù)源來(lái)創(chuàng)建我們所需要的field。在圖1.1中的fields標(biāo)簽頁(yè)中,我們可以點(diǎn)擊new 按鈕來(lái)創(chuàng)建一個(gè)新的field。圖1.2一個(gè)field有兩個(gè)必填的屬性: name、type和一個(gè)可選項(xiàng)的description。從ireport1.0.0開始,fields可以是任何java數(shù)據(jù)類型。這樣當(dāng)我們使用javabean作為數(shù)據(jù)源時(shí)我們可以很方便的從java.lang.object向報(bào)表中的field的轉(zhuǎn)換工作。在對(duì)

16、象的expression里你可以使用下面的語(yǔ)法來(lái)引用一個(gè)field:$field name例如如果你想處理com.bstek.test.domain.person bean里的username 字段,可以這樣去寫:(com.bstek.test.domain.person)$username)用一個(gè)sql query來(lái)創(chuàng)建field在ireport的設(shè)計(jì)中使用sql query的方式來(lái)創(chuàng)建或記錄字段的是使用最廣泛的也是最直接最簡(jiǎn)單的一種方式。做此操作我們需要首先打開reportquerydialog窗口(點(diǎn)擊主工具欄的 按鈕), reportquerydialog窗口出現(xiàn)后,我們可以輸入合適的

17、sql檢索并創(chuàng)建fields。圖1.3在打開reportquerydialog窗口之前請(qǐng)先確認(rèn)我們已經(jīng)有一個(gè)數(shù)據(jù)源連接處于激活狀態(tài)(激活方式請(qǐng)查看相關(guān)章節(jié)),插入一條查詢語(yǔ)句,如:select * form employeeireport將啟動(dòng)sql 查詢引擎,根據(jù)輸入的sql將分析結(jié)果用fields的形式展示出來(lái)。在下面的窗口中選擇你要的fields(可以多選)然后點(diǎn)擊ok按鈕, fields就被創(chuàng)建出來(lái)了。在這個(gè)例子當(dāng)中所有字段有多程類型,一般地說(shuō),fields的數(shù)據(jù)類型是構(gòu)建在原始sql 類型基礎(chǔ)之上的,如string,integer用javabean生成fieldsireport的高級(jí)

18、特性之一是它的數(shù)據(jù)源除了可以構(gòu)建在sql query基礎(chǔ)之上外,還可以使用含有g(shù)etter和setter方法的javabean(或者叫pojo)對(duì)象來(lái)創(chuàng)建。在這個(gè)例子中fields就是pojo類里的屬性(或者是屬性的屬性,即子對(duì)象的屬性)。選擇javabean datasource 標(biāo)簽,通過該窗口你可以指定pojo來(lái)創(chuàng)建fields。如下圖:圖1.4點(diǎn)擊“read attributes”按鈕,你可以瀏覽這個(gè)對(duì)象,可以看到這個(gè)對(duì)象的直接屬性嵌套的對(duì)象(子對(duì)象),雙擊里面的子對(duì)象你可以查看子對(duì)象的屬性。要把一個(gè)屬性添加到field列表,只需選中需要的屬性然后點(diǎn)擊“add field(s)”按鈕。

19、如果要把一個(gè)field作為一個(gè)文本打印,可以直接把一個(gè)field拖到report的band里或者在report的band里添加一個(gè)textfield然后設(shè)置它的expression(把一個(gè)field放在expression里)和textfield的類型,如果需要還可以為一個(gè)要打印的field定義一個(gè)pattern(模式)用來(lái)對(duì)field內(nèi)容進(jìn)行格式化。圖1.57.2 參數(shù)(parameters)parameters通常是用來(lái)在打印的時(shí)候從程序里傳值到報(bào)表里.也就是說(shuō)parameters通常的是起參數(shù)傳遞的作用。他們可以被用在一些特定的場(chǎng)合(比如應(yīng)用中sql 查詢的條件),和report中任何一

20、個(gè)需要從外部傳入的變量等(如一個(gè)image對(duì)象所包括的char或報(bào)表title的字符串)。和使用fields一樣,parameters也需要在創(chuàng)建的時(shí)候定義它的數(shù)據(jù)類型.parameters的數(shù)據(jù)類型是標(biāo)準(zhǔn)的java的object。圖1.6在ireport中parameters的機(jī)制是允許用戶通過應(yīng)用程序傳遞參數(shù)致報(bào)表當(dāng)中。在jasperreort中的某個(gè)對(duì)象中的expression可以通過下面的語(yǔ)法來(lái)訪問一個(gè)當(dāng)前report中存在的parameter:$pparameter name 如果應(yīng)用程序沒有為報(bào)表中定義的parameter賦值,那么parameter將會(huì)取我們?cè)诙x它的時(shí)候設(shè)置的d

21、efault value的值。parameters是一個(gè)java object,所以如果它的類型是object類型,我們?cè)谄鋎efault value里寫下面的表達(dá)式就是錯(cuò)誤的:0.123你必須要?jiǎng)?chuàng)建一個(gè)object,如:new double(0.123)這種寫法就是正確的。在查詢中使用parametersparameters可以用來(lái)做sql查詢的條件參數(shù)的傳遞.如果你想根據(jù)部門編號(hào)(dept_id)得到客戶的詳細(xì)信息 (設(shè)計(jì)的時(shí)候我們是不知道這個(gè)部門編號(hào)的具體值是多少的).此時(shí)我們可以這樣組織查詢語(yǔ)句:select * from employee where dept_id=$pdeptid

22、此時(shí)sql查詢引擎將會(huì)采用preparedstatement來(lái)處理傳入的deptid值以此作為查詢條件參數(shù)。如果你想直接通過parameter 值來(lái)作為sql語(yǔ)句的一部門,那么你可以使用下面的特殊語(yǔ)法:$p!parameter name。這種寫法允許你在查詢時(shí)用parameter的值來(lái)替換parameter name。例如,如果我們有一個(gè)參數(shù)名為mywhere其值為:where dept_id=d11 ,查詢寫法如下:select * from employee $p!mywhere查詢時(shí)實(shí)際提交的字符串是:select * from employee where dept_id=d11在程序

23、里使用parameters在應(yīng)用程序里如果想把某個(gè)值傳遞到我們的報(bào)表中parameters時(shí),我們可以把相關(guān)的值放入一個(gè)擴(kuò)展java.util.map接頭類里,然后傳入到report里。如下面的代碼:.map hm = new hashmap();.jasperprint print = jasperfillmanager.fillreport(filename,hm,new jremptydatasource();fillreport是一個(gè)關(guān)鍵的方法,它允許你通過一個(gè)文件名,一個(gè)參數(shù)集來(lái)傳遞到我們要調(diào)用的報(bào)表當(dāng)中。例如通過下面的處理方法我們可以讓一個(gè)處部的傳入值作為我們報(bào)表的title。a)

24、.聲明一個(gè)parameter.這個(gè)parameter是java.lang.string 類型,名字為:name_report:圖1.6b.將這個(gè)parameter拖到page中的title band.修改上面的程序代碼如下:hashmap hm = new hashmap();hm.put(“name_report”,”report title”);.jasperprint print = jasperfillmanager.fillreport(filename,hm,new jremptydatasource();圖1.7運(yùn)行時(shí)效果如下:圖1.8一般情況下,我們不需要為報(bào)表中的每一個(gè)par

25、ameters傳遞一個(gè)值,除非某一個(gè)parameter一定要從處部程序傳入時(shí)我們才需為一個(gè)parameter設(shè)置一個(gè)值。如果一個(gè)parameter外部門程序沒有為其賦值那么ireport將使用default value expression來(lái)對(duì)一個(gè)parameter進(jìn)行初始化,如果連default value expression沒有設(shè)置那么它的值就是null。事實(shí)上,對(duì)于一個(gè)parameters我們不僅僅可以傳遞一個(gè)string,integer,boolean等java中小的對(duì)象,同時(shí)我們還可以利用parameters來(lái)傳遞一些足夠大足夠復(fù)雜的對(duì)象,比如一個(gè)圖像(java.awt.image

26、),或者通過一個(gè)parameters來(lái)為一個(gè)為子報(bào)表提供的datasource 連接等。在用map類型傳遞參數(shù)時(shí)我們要注意傳遞的參數(shù)要與report里的parameters類型保持一致,否則會(huì)拋出classcastexception。ireport內(nèi)嵌的parametersireport提供了一些內(nèi)建的parameters,這些parameters對(duì)于用戶來(lái)說(shuō)是只讀的。內(nèi)嵌的parameters列表如下:參數(shù)名說(shuō)明report_parameters_map它是一個(gè)java.util.map類型的對(duì)象,可以通過它來(lái)傳給填充報(bào)表去填充報(bào)表里所有的parameters,在這個(gè)參數(shù)里還包含用戶定義的p

27、arameters.report_connection一個(gè)jdbc的connection參數(shù),報(bào)表可以根據(jù)傳入的jdbc connection來(lái)獲到相應(yīng)的數(shù)據(jù)report_datasource為報(bào)表中的connection提供一個(gè)datasource。外部傳入的時(shí)候類型也要是datasource類型report_scriptlet報(bào)表生成時(shí)使用的scriptlet實(shí)例,如果沒有指定scriptlet,那么這個(gè)parameters將使用net.sf.jasperreports.engine.jrdefaultscriptlet.is_ignore_pagination通過這個(gè)參數(shù)你可以控制分頁(yè)功

28、能是打開還是關(guān)閉。默認(rèn)情況下,分頁(yè)是打開的。但是如果導(dǎo)出為html或excel時(shí)不進(jìn)行分頁(yè)處理。report_locale它被用來(lái)設(shè)置報(bào)表所處的地區(qū)。如果沒有提供地區(qū),那么將采用系統(tǒng)默認(rèn)的地區(qū)。report_time_zone設(shè)置報(bào)表的時(shí)區(qū),如果沒提供的話采用系統(tǒng)默認(rèn)的。report_resource_boundle為報(bào)表指定要加載的資源文件,在國(guó)際化一章中介紹了如何使用資源文件來(lái)構(gòu)建報(bào)表。7.3 變量(variables)variables是用來(lái)存儲(chǔ)對(duì)某些字段計(jì)算后的結(jié)果,比如sum等。圖1.9和fields,parameters一樣,variables也是有數(shù)據(jù)類型的。你必須為一個(gè)vari

29、able實(shí)例聲明一個(gè)java類型。圖1.9顯示了如何創(chuàng)建一個(gè)新的variable??匆幌旅總€(gè)字段的意思:variable name: variable的名稱,我們可以在表達(dá)式中通過下面的方法來(lái)引用一個(gè)variable:$vvariable namevariable class type : variable也可以是任意一個(gè)java類型,在下拉框里你可以看到大多數(shù)常用的類型,如java.lang.string等。calculation type : 一個(gè)計(jì)算類型可以用來(lái)計(jì)算結(jié)果。當(dāng)一個(gè)預(yù)先定義的值是“nothing”時(shí),那它的意思是不做任何計(jì)算。ireport會(huì)根據(jù)指定的計(jì)算類型和從數(shù)據(jù)源中獲取

30、的每一條記錄計(jì)算出結(jié)果,然后去更改variables的值。做一個(gè)變量的計(jì)算意為著去執(zhí)行一個(gè)表達(dá)式,如果計(jì)算類型為nothing,那么ireport將會(huì)根據(jù)variable expression為variable賦值。計(jì)算類型列舉如下:類型說(shuō)明nothing不做任何計(jì)算count對(duì)記錄集數(shù)量進(jìn)行循環(huán)累加(計(jì)算有多少條記錄),這和sum不一樣,sum的計(jì)算是針對(duì)數(shù)字的,會(huì)對(duì)數(shù)字進(jìn)行累加操作。distinct count也是對(duì)計(jì)算有多少條記錄的累加操作,只是在累加過程中會(huì)忽略已經(jīng)出現(xiàn)的記錄(比如某個(gè)字段的值已經(jīng)出現(xiàn)后就不會(huì)再記錄)sum添加每一次表達(dá)式(這里的表達(dá)式只能是數(shù)字類型)迭代的結(jié)果到變量中

31、average它用算術(shù)的方法來(lái)計(jì)算表達(dá)式累加結(jié)果的平均值lowest返回表達(dá)式最小值highest返回表達(dá)式最大值standarddeviation根據(jù)表達(dá)式所有值返回標(biāo)準(zhǔn)方差variance返回表達(dá)式接收到的值的變化system不做任何計(jì)算并且表達(dá)式也是沒有價(jià)值的,在這樣的用例中,報(bào)表引擎僅僅保存內(nèi)存中variable的最后的值。reset type : 重置類型。表示一個(gè)變量在什么時(shí)候做重置操作。reset 類型如下:類型名稱說(shuō)明none任何時(shí)候都不做重置操作report在報(bào)表創(chuàng)建的時(shí)候variable才會(huì)對(duì)表達(dá)式進(jìn)行初始化pagevariable的初始化在每一頁(yè)都做一次reset操作co

32、lumnvariable的初始化在每一列都做一次reset操作(這里的column指的是report里的page的column,每個(gè)報(bào)表的column可以通過報(bào)表的editreport properties窗口進(jìn)行修改)groupvariable的初始化在每一個(gè)組都做一次reset操作reset group :如果group reset type被勾選,這里就要選擇group名稱(關(guān)于group可以參考后面的章節(jié))。increment : 它指定當(dāng)一個(gè)variable 值被評(píng)估或當(dāng)你想要這個(gè)組采用類似于subtotals 或averages來(lái)計(jì)算,increment 類型可以參考下面的表。in

33、crement group : 如果這個(gè)group 的increment type 被勾選它將指定這個(gè)組決定variable的increment。custom incrementer factory class : 指定一個(gè)實(shí)現(xiàn)了jrincrementerfactory接口的java類名稱,通常用來(lái)定義一些諸如sum之類的非數(shù)字類型的操作。variable expression : 它是一個(gè)java的expression,用來(lái)標(biāo)識(shí)variable每一次迭代的值。initial value expression : 它是一個(gè)為variable初始化時(shí)采用的expression.內(nèi)置的variab

34、les和parameters一樣,ireport提供了一些內(nèi)置的variables(這些由報(bào)表引擎直接管理),這些變量是只讀的,不能被用戶修改,如下表所示:variable 名稱說(shuō)明page_number它包含當(dāng)前頁(yè)的頁(yè)。column_number它包含當(dāng)前的列數(shù)。report_count當(dāng)前的記錄數(shù)目page_count當(dāng)前的頁(yè)號(hào)column_count當(dāng)前的列號(hào)_count在里的記錄總數(shù)ireport欄和組(band and group) cubebi.com 立方開源商業(yè)智能 在本章中,我們將解釋如何用ireports去管理bands和groups,在第四章中我們介紹了報(bào)表的結(jié)構(gòu),在本章

35、中我們將要看到如何使用bands來(lái)劃分報(bào)表。同時(shí)我們還將看到如何使用groups,如何創(chuàng)建report中的breaks,如何管理subtotals等等。8.1 欄(bands)ireport把一個(gè)報(bào)表劃分成七個(gè)主要的bands和一個(gè)名為backgroup的band(一共是八個(gè)bands),每當(dāng)我們添加一個(gè)group時(shí)就會(huì)有兩個(gè)新的band添加到報(bào)表當(dāng)中:group footer bands和group header bands。點(diǎn)擊 按鈕在彈出的窗口中我們可以對(duì)當(dāng)前報(bào)表所具有的bands的進(jìn)行相關(guān)屬性的修改。圖8.1通過上圖中的窗口,我們可以修改左邊列表窗口中的任何一個(gè)band的屬性,比如它的

36、高(以像素為單位)。print when expression表示我們可以在這里輸入一個(gè)表達(dá)式,這樣我們可以根據(jù)表達(dá)式的值來(lái)控制當(dāng)前的這個(gè)band是否輸出。這里需要注意的是print when expression里必須返回一個(gè)java.lang.boolean類型的對(duì)象,如:new boolean(true)上面的表達(dá)式說(shuō)明這個(gè)bands總會(huì)被打印(如果我們什么都不輸入這個(gè)就是默認(rèn)值),在表達(dá)式里可以使用fields,variables,parameters。根據(jù)這個(gè)特性我們可以通過相關(guān)的fields,variables,parameters來(lái)靈活的控制當(dāng)前的band是否可以輸出,比如下面的

37、代碼:($fsalary.intvalue()4000?new boolean(true):new boolean(false)上面的代碼說(shuō)明當(dāng)salary的值如果大于4000就輸出當(dāng)前的band否則就不輸出當(dāng)前的band。把鼠標(biāo)移到bands的邊上我們可以鼠標(biāo)拖拉的方式改變band的大小以此來(lái)適配band里的內(nèi)容。圖8.28.2 組(groups) groups允許我們對(duì)報(bào)表里的數(shù)據(jù)進(jìn)行全新的切割分組組合。分組是通過一個(gè)表達(dá)式來(lái)定義的,ireport會(huì)通過這個(gè)表達(dá)式進(jìn)行計(jì)算分組情況,每一個(gè)新的組都是從我們?cè)趀xpression value里輸入的表達(dá)式發(fā)生變化的時(shí)候開始的。接下來(lái)我們將通過一

38、個(gè)例子的演示一步一步說(shuō)明如何使用groups。 假設(shè)我們有一個(gè)員工的列表,我們想要?jiǎng)?chuàng)建一個(gè)根據(jù)員工所在的部門進(jìn)行分組的報(bào)表。a)首先我們打開一個(gè)新的報(bào)表文件,然后點(diǎn)擊connection/data sources,選擇jdbc connection,我們創(chuàng)建一個(gè)jdbc的connection,如下圖:圖8.3b)點(diǎn)擊和工具欄里的 按鈕,輸入查詢語(yǔ)句,如下圖圖8.4 c)把employee_name和dept_id兩個(gè)field拖到report 中的detail的band里,同時(shí)調(diào)整detail band的高度,如下圖:圖8.5d)保存報(bào)表文件,并按 瀏覽報(bào)表生成后的效果,如下圖:圖8.6到這里

39、,我們看到員工的數(shù)據(jù)已經(jīng)可以在報(bào)表里顯示,接下來(lái)我們就對(duì)員工信息按dept_id字段進(jìn)行分組顯示。e)點(diǎn)擊主工具欄里的 按鈕,打開groups定義窗口,并添加一個(gè)新的名為dept的group,如下圖:圖8.7一個(gè)group有下面幾個(gè)屬性需要我們?nèi)ザx:group name:為這個(gè)group指定一個(gè)名稱,group創(chuàng)建完成后會(huì)產(chǎn)生兩個(gè)新的band : header和footer band,這兩個(gè)band的名稱采用group的名稱來(lái)定義。start on a new column:如果此選項(xiàng)勾選,那么分組只會(huì)在報(bào)表中的新的column產(chǎn)生,也就是說(shuō)在一頁(yè)中報(bào)表分組在一個(gè)column里只會(huì)做一次。s

40、tart on a new page:與上面的選項(xiàng)類似,如果該選項(xiàng)勾選,那么分組只會(huì)在每一頁(yè)做一次,也就是說(shuō)每一頁(yè)最多只會(huì)有一個(gè)分組數(shù)據(jù)。reset page number:該選項(xiàng)允許在一個(gè)新組開始的時(shí)候重設(shè)頁(yè)號(hào)。print header on each page:如果該選項(xiàng)勾選,那么如果當(dāng)前頁(yè)沒能顯示完組里的所有數(shù)據(jù)時(shí),到一頁(yè)顯示該數(shù)據(jù)時(shí)會(huì)把該組的header打印出來(lái),否則將不會(huì)打印。min height to start new page:該選項(xiàng)用來(lái)設(shè)置當(dāng)前報(bào)表中頁(yè)面所余下的高度的最小值分組的最小值,默認(rèn)值是0,如果我們?cè)O(shè)置為100,表示如果當(dāng)前頁(yè)面余下的高度小于100就不再繼續(xù)顯示分組的

41、數(shù)據(jù),而是在下一頁(yè)顯示分組的數(shù)據(jù)。group expression : 分組時(shí)采用的表達(dá)式規(guī)則,如上圖中我們?cè)诙xdept這個(gè)group時(shí)我們?cè)趃roup expression里輸入了$fdept_id,表示將該組按員工的dept_id字段進(jìn)行分組顯示。group header band height:新產(chǎn)生的header band的高度。group footer band height:新產(chǎn)生的footer band的高度。f)接下來(lái)我們把在detail band里的dept_id的field移到report里新產(chǎn)生的deptheader的band里,圖8.8g)點(diǎn)擊 按鈕,報(bào)表的生成效果如

42、下:圖8.9 在jasperreport里group的數(shù)量是沒有限制的,一個(gè)group可以有一個(gè)父group同時(shí)也可以有若干個(gè)子group。通過group定義列表,我們可以通過”move up”和”move down”來(lái)設(shè)置group的順序。group 向?qū)г趇report中還有一種簡(jiǎn)單的方法創(chuàng)建一個(gè)group,那就是向?qū)?,通過向?qū)覀兛梢钥焖俚膭?chuàng)建一個(gè)group,我們可以通過主菜單中的edit new report group wizard來(lái)啟動(dòng)創(chuàng)建group的向?qū)АD8.10向?qū)г试S用戶創(chuàng)建最多有四個(gè)group的報(bào)表(group header,group footer和每一個(gè)group關(guān)聯(lián)

43、)。groups和records的排序我們可以在設(shè)置查詢的地方選擇設(shè)置選項(xiàng)來(lái)使ireport自動(dòng)對(duì)依據(jù)字段進(jìn)行排序,我們也可以在創(chuàng)建一個(gè)group時(shí)要對(duì)分組的字段做好正確的排序工作。比如在sql中我們可以添加“order by ”來(lái)對(duì)要分組的字段進(jìn)行排序。ireport子報(bào)表(subreport) cubebi.com 立方開源商業(yè)智能 subreport是ireport提供的高級(jí)功能,通過subreport我們可以創(chuàng)建復(fù)雜的報(bào)表。通過subreport我們可以創(chuàng)建一個(gè)包含若干個(gè)子報(bào)表的報(bào)表。創(chuàng)建一個(gè)包含子報(bào)表的報(bào)表我們需要三個(gè)對(duì)象:一個(gè)jasper文件,一個(gè)包含參數(shù)map(當(dāng)然可以為空)和一

44、個(gè)datasource(數(shù)據(jù)源,或者是一個(gè)jdbc的connection)。在本章中我們將解釋如何通過這三個(gè)對(duì)象創(chuàng)建一個(gè)subreport并實(shí)現(xiàn)在子報(bào)表中數(shù)據(jù)過濾顯示的目的。9.1 創(chuàng)建一個(gè)子報(bào)表(create a subreport)一個(gè)subreport是一個(gè)真正的包含它自己xml文件并且是一個(gè)已經(jīng)編譯好的jasper文件。創(chuàng)建一個(gè)subreport就是創(chuàng)建一個(gè)普通的報(bào)表文件,創(chuàng)建過程中唯一需要注意的是設(shè)置subreport的寬度、高度及一些不需要顯示的band,一般情況下對(duì)于不顯示的band我們把它們的高度都設(shè)置為0。在設(shè)置子報(bào)表的寬度時(shí)我們應(yīng)該考慮到它在父報(bào)表中顯示時(shí)的效果,然后針對(duì)這

45、一特性有針對(duì)性的去設(shè)置。在父報(bào)表中我們要添加一個(gè)子報(bào)表可以通過ireport中的subreport工具 來(lái)實(shí)現(xiàn)。子報(bào)表的形狀和一個(gè)距形類似,我們可以調(diào)整subreport的尺寸和位置以控制子報(bào)表的顯示。將一個(gè)子報(bào)表鏈接到父報(bào)表中需要做三件事情:獲得subreport所對(duì)應(yīng)的jasper報(bào)表對(duì)象、如何為它提供數(shù)據(jù)及如何為子報(bào)表的parameters設(shè)置具體的值。所有這些信息的定義我們可以通過subreport properties窗口來(lái)實(shí)現(xiàn)。圖9.1圖9.29.2 傳遞參數(shù)(passage of the parameters)當(dāng)我們?cè)趹?yīng)用程序里通過fillreport方法來(lái)生成一個(gè)報(bào)表的時(shí)候,我

46、們會(huì)提供一個(gè)包含參數(shù)值的map一起傳遞到報(bào)表中,包含參數(shù)的map對(duì)象是由報(bào)表引擎直接管理的。在子報(bào)表屬性窗口的里的“subreport”標(biāo)簽里的“parameters map expression”屬性就是提供給我們的最簡(jiǎn)單的方法來(lái)為子報(bào)表設(shè)置parameters的值,它允許我們定義一個(gè)最終可以返回java.util.map對(duì)象的表達(dá)式,使用這種方法我們可以把從外部應(yīng)用程序傳到父報(bào)表里的parameter對(duì)象,當(dāng)然這個(gè)parameter的實(shí)際值是一個(gè)java.util.map對(duì)象傳遞給子報(bào)表使用(比如$ptestmap),這里我們也可以使用內(nèi)建的報(bào)表parameters:$preport_pa

47、rametes_map把子報(bào)表中的java.util.map對(duì)象傳遞到父報(bào)表中供使用。如果該屬性我們空著不填那么一個(gè)不包含任何值的空的java.util.map將會(huì)被傳到子報(bào)表中。這種機(jī)制的局限性是parameters里所對(duì)應(yīng)的java.util.map值是死的、不會(huì)變的。為了克服這種局限性jasperreport允許我們定義parameter鍵值對(duì)的時(shí)候每個(gè)對(duì)象的值通過一個(gè)表達(dá)式來(lái)創(chuàng)建,如在圖9.2中的“subreport parameter”表中通過添加個(gè)參數(shù)java.util.map來(lái)填充子報(bào)表。圖9.3deptid是子報(bào)表中一個(gè)parameter的名稱,如果設(shè)置值時(shí)也要與子報(bào)表中dep

48、tid的數(shù)據(jù)類型保持一致。指定數(shù)據(jù)源為子報(bào)表指定數(shù)據(jù)源就是告訴jasperreport引擎如何獲到數(shù)據(jù)來(lái)填充subreport。我們可以指定兩種類型的數(shù)據(jù)源:jdbc connection和datasource。使用jdbc來(lái)填充報(bào)表是很簡(jiǎn)單的,在connection expression里定義一個(gè)已經(jīng)連接到數(shù)據(jù)庫(kù)的java.sql.connection對(duì)象。要把一個(gè)已經(jīng)處于打開狀態(tài)下的連接傳到subreport中我們只需使用一個(gè)預(yù)定義的包含一個(gè)基于從應(yīng)用程序里調(diào)用fillreport方法時(shí)的傳入的連接report_connection參數(shù)如果使用一個(gè)datasource就稍微復(fù)雜一點(diǎn),事實(shí)上

49、它是一個(gè)簡(jiǎn)單的記錄的集合,記錄集合的概念和jdbc connection不同,既然如此我們可以通過一個(gè)parameter來(lái)傳遞一個(gè)datasource來(lái)填充subreport,此時(shí)采用這種機(jī)制內(nèi)建的parameter report_connection就不再起作用了。一個(gè)datasource是一個(gè)普通的“消費(fèi)品”對(duì)象僅僅可用來(lái)填充一次報(bào)表。所以一個(gè)作parameter傳遞的datasource可以滿足一個(gè)subreport的需要。因此parameter的方式不能滿足當(dāng)父報(bào)表的每一行記錄都有一些子報(bào)表的數(shù)據(jù)與之對(duì)應(yīng)(除非主報(bào)表中只有一條記錄)。當(dāng)我們解釋datasource時(shí)我們可以看到這個(gè)問題

50、可以通過自定義datasource方式解決。指定subreport創(chuàng)建一個(gè)subreport我們需要指定一個(gè)擴(kuò)展名為.jasper文件,我們需要在subreport屬性窗口中設(shè)置subreport expression屬性。表達(dá)式返回的類型必須與我們?cè)谙吕蚶镞x擇的類似保持一致,類型列表如下:類型名稱含義net.sf.jasperreports.engine.jasperreport在一個(gè)jasperreport對(duì)象里預(yù)加載一個(gè)jasper文件java.io.inputstream一個(gè)jasper文件的流j url一個(gè)用來(lái)定義jasper文件的urljava.io.file一個(gè)j

51、asper文件的file對(duì)象java.lang.stringjasper文件的文件名如果表達(dá)式是一個(gè)string類型,那么引擎將通過jrload來(lái)加載指定位置的jasper文件。9.3 子報(bào)表示例(subreport sample)在這個(gè)例子中我們將采用示例數(shù)據(jù)庫(kù)來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的包含子報(bào)表的報(bào)表。我們要從兩張表里取數(shù)據(jù):dept(部門表)、employee(員工表),要達(dá)到的效果是根據(jù)部門表的部門id取出該部門下的所有員工。類似的效果的報(bào)表我們?cè)趃roups一章中使用group也實(shí)現(xiàn)了一次,這里我們將用subreport來(lái)實(shí)現(xiàn)相同的效果。新建一個(gè)空?qǐng)?bào)表,新建一個(gè)名為deptid的paramet

52、er對(duì)象,如下圖:圖9.4在這里我們?cè)赿efault value expression里賦予了一個(gè)空的字符串,為什么要這樣做呢,因?yàn)榻酉聛?lái)我們要使用該parameter來(lái)作為sql的查詢條件的輸入值,所以我們要對(duì)這個(gè)參數(shù)賦予一個(gè)初始化的值。點(diǎn)擊 打開sql查詢引擎窗口,輸入下面的查詢語(yǔ)句:select * from employee where dept_id=$pdeptid在這里,我們?cè)诓樵儐T工信息的時(shí)候加了一個(gè)部門的條件,如下圖:圖9.5此時(shí)如果我們把相關(guān)的field拖到detail band里,然后點(diǎn)擊 我們發(fā)現(xiàn)沒有任何記錄,原因是因?yàn)槲覀儾]有為deptid賦值。保存報(bào)表文件,我們命

53、名為emp.jrxml,我們把這個(gè)報(bào)表文件作為下面將要引用的子報(bào)表文件。因?yàn)樗鼘⒆鳛樽訄?bào)表被引用,所以我們需要調(diào)整該報(bào)表的不用顯示的band的高度及detail band的高度,如下圖:圖9.10在detail band里我們放置了三個(gè)字段:employee_name(員工姓名)、sex(性別)、birthday(出生日期)。接下來(lái)我們需要建立一個(gè)父報(bào)表,關(guān)閉emp.jrxml文件,新建一個(gè)空的報(bào)表文件,命名為dept.jrxml。點(diǎn)擊主工具欄里 打開sql查詢窗口,輸入下面的語(yǔ)句:select * from dept如下圖:圖9.11把dept_name這個(gè)field拖動(dòng)到報(bào)表的detail

54、 band里,同時(shí)在detail band里添加一個(gè)了報(bào)表,在彈出的子報(bào)表向?qū)е形覀冞x擇“cancel”按鈕,這里我們不采用向?qū)?lái)創(chuàng)建subreport。如下圖圖9.12雙擊子報(bào)表圖標(biāo)打開子報(bào)表屬性設(shè)置窗口,在彈出的窗口中我們選擇“subreport”標(biāo)簽,在“connection/datasource expression”屬性里我們選擇“use connection expression”并且指定內(nèi)建的parameter:report_connection作為表達(dá)式用來(lái)存儲(chǔ)jdbc連接,如下圖:圖9.13切換到“subreport(other)”標(biāo)簽窗口,指定如何找到子報(bào)表文件“emp.j

55、asper”以及如何創(chuàng)建和修改在子報(bào)表與父報(bào)表之間的參數(shù)傳遞。使用絕對(duì)路徑在ireport里我們不用去考慮子報(bào)表文件是否可以被找到的問題,因?yàn)樽訄?bào)表存放的目錄已經(jīng)被自動(dòng)的加到ireport的classpath里了。這里我們指定的值是“$psubreport_dir +java.io.file.separator+emp.jasper”圖9.14為了在子報(bào)表里可以顯示員工的信息我們需要為子報(bào)表的deptid這個(gè)parameter賦值,這里我們通過父報(bào)表傳過去,在“subreport parameters”窗口中,我們添加了一個(gè)用于為子報(bào)表的deptid賦值的parameter,該值到于父報(bào)表中的

56、$fdept_id這個(gè)field。編譯子報(bào)表和父報(bào)表。點(diǎn)擊主工具欄中的 按鈕,查看生成的后父報(bào)表效果。圖9.15在這里我們看到子報(bào)表里的有一些字段顯示的有問題(如sex性別這塊顯示的是true和false,還是日期不是我們要的日期格式),需要我們進(jìn)一步對(duì)顯示的字段信息進(jìn)行格式化操作。打開emp.jrxml文件,選中detail band里的sex field,右鍵選擇properties,在彈出的窗口作如下修改:圖9.16在text field expression里我們輸入($fsex.booleanvalue()?男:女)的意思是把原來(lái)顯示的true和false翻譯成男和女。這里$fsex是java.lang.boolean類型,所以需要先把它轉(zhuǎn)化成java.lang.boolean所對(duì)應(yīng)的簡(jiǎn)單類型,然后如果值為true則為男,否則為女。對(duì)于birthday(出生日期)我們同樣需要對(duì)其做格式化操作,如下圖:圖9.17關(guān)閉emp.jrxml(關(guān)閉之前別忘記對(duì)其進(jìn)行編譯)。打開父報(bào)表dept.jrx

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論