版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、目錄ireport用戶手冊1ireport用戶手冊 - 介紹1ireport報表結(jié)構(gòu)1ireport報表元素2ireport字體和樣式(fonts and styles)2ireport字段,參數(shù),變量2ireport欄和組(band and group)2ireport子報表(subreport)2ireport數(shù)據(jù)源2常規(guī)問題解決方案2ireport jasperreports深入講解2ireport 報表結(jié)構(gòu)完全掌握2ireport 報表元素大全2ireport 中字體編碼說明2ireport 字段,參數(shù)和變量精解2ireport bands and groups2ireport用戶手冊
2、ireport用戶手冊 - 介紹 cubebi.com 立方開源商業(yè)智能 ireport是一個能夠創(chuàng)建復(fù)雜報表的開源項目。它100%使用java語言編寫。是目前全球最為流行的開源報表設(shè)計器。由于它豐富的圖形界面,你能夠很快的創(chuàng)建出任何一種你想要的報表。以下是ireport一些比較突出的功能: 拖拽式,所見即所得的報表編輯器。 多樣的向?qū)砗喕瘡?fù)雜的報表設(shè)計任務(wù)。 超過30個排版和格式化工具。 報表可轉(zhuǎn)換為pdf html excel flash csv rtf txt openoffice java2d jrviewer等格式。 支持所有有效的數(shù)據(jù)源。如:jdbc,cvs,hibernate,
3、javabean等 用戶自定義數(shù)據(jù)源。 無限次數(shù)的 撤消/重做。 集成腳本(scriptlet)支持。 內(nèi)置圖表支持:超過20種的圖表支持。并可擴(kuò)展。國際化:集成超過15種語言。 報表模板與報表庫樣式管理。 源文件的備份 文檔結(jié)構(gòu)瀏覽器ireport報表結(jié)構(gòu) cubebi.com 立方開源商業(yè)智能 在本章中我們將一起來分析一下報表的結(jié)構(gòu),看一下報表中每一部分的作用是什么,以及在生成報表的時候每一部分將產(chǎn)生什么樣的效果。4.1 欄(bands)報表被垂直分成若干個部分,每一個部分我們叫它為“band”。每一個band都有自己的特性,在報表生成的時候有些會打印一次,有些會打印多次。如下圖。圖4.1
4、接下來我們就對每一種類型的band分別進(jìn)行介紹。title band:title 段只在整個報表的第一頁的最上面部分顯示,除了第一頁以外,不管報表中共有多少個頁面也不會再出現(xiàn)title band 中的內(nèi)容。pageheader band:顧名思義,pageheader 段中的內(nèi)容將會在整個報表中的每一個頁面中都會出現(xiàn),顯示在位置在頁面的上部,如果是報表的第一頁,pageheader 中的內(nèi)容將顯示在title band 下面,除了第一頁以外的其他所有頁面中。pageheader 中的內(nèi)容將顯示在頁面的最上端。pagefooter band:顯示在所在頁面的最下端。detail band: 報表
5、內(nèi)容段,在這個band 中設(shè)計報表中需要重復(fù)出現(xiàn)的內(nèi)容,detail 段中的內(nèi)容每頁都會出現(xiàn)。columnheader band:針對detail band 的表頭段,一般情況下在這個段中畫報表的表頭。columnfooter band:針對detail band 的表尾段。summary band:表格的合計段,出現(xiàn)在整個報表的最后一頁中的detail band 的后面,一般用來統(tǒng)計報表中某一個或某幾個字段的合計值。為了實(shí)際演示各個band的生成效果,我們可以在報表中的各個band里添加不同的對象,以測試各個band的作用。從示例數(shù)據(jù)庫的employee表里取數(shù)據(jù),在query editor
6、里輸入下面的語句:select top 10 * from employee圖4.2在報表中的各個band分別放置如下內(nèi)容:圖4.3啟動報表,生成的效果如下:圖4.4 生成的報表第一頁圖4.5生成的報表第二頁,也是最后一頁ireport報表元素 cubebi.com 立方開源商業(yè)智能 在本章中我們將要解釋可以在報表中使用的對象及他們的相關(guān)屬性。我們所說的元素主要是一些圖形對象,比如text,rectangle等。在ireport中沒有段落,表格或分頁的概念,在報表中最基本的對象主要有七個: -line-rectangle-ellipse-static text-text field-image
7、-subreport-crosstab-chart通過以上這些組件的組合我們可以做出各種各樣復(fù)雜的報表樣式。ireport提供兩種特殊的圖形對象:chart和barcode。每一種類型的對象都有一些通用的屬性,如高度、寬度、位置、所在的band等。除此之外還有一些針對不同元素的特殊屬性。每一個元素都必須在一個band內(nèi)部,如果一個元素跨了一個以上的band,那么在編譯的時候?qū)伋鲈匚恢缅e誤的異常。要添加一個元素到報表中,我們可以從主工具欄中選擇相應(yīng)的工具,然后添加到報表區(qū)域中即可。圖5.1我們可以通過雙擊對象或右鍵菜單打開元素的屬性設(shè)置窗口。圖5.2屬性窗口由若干個標(biāo)簽頁構(gòu)成,“commo
8、n”標(biāo)簽里包含每一個組件都具有的通用屬性,其它的標(biāo)簽頁是針對不同元素的屬性設(shè)置。在下面的章節(jié)中,我們將對每一個對象的使用做詳細(xì)的介紹。ireport字體和樣式(fonts and styles) cubebi.com 立方開源商業(yè)智能 一個style是一個預(yù)定義的屬性的集合用來控制元素的外觀(比如背景色、邊框線、字體等)。我們可以為我們的報表定義一個默認(rèn)的style。要為一個元素應(yīng)用一個style,我們可以選擇該元素并從元素的屬性窗口common標(biāo)簽里的style列表選擇你需要的style。fonts是用來描述text的外觀特征。此外,你可以定義一個名為“report font”的全局字體。6
9、.1 字體(font)通常定義一個字體,我們需要做下面幾件事情:-font name(字體名稱)-font dimension(字體大小)-attribute(屬性,諸如bold-faced,italics,underlined,barred)如果我們需要導(dǎo)出pdf格式的報表,需要為字體添加下面的信息:pdf font name:pdf字體名稱(預(yù)先定義pdf字體或一個在classpath里的tif文件的名稱)。pdf embedded:當(dāng)使用一個外部的ttf類別的字體文件生成報表時是否把它包含在pdf文件里的一個標(biāo)志。pdf encoding:指定一個字體編碼名稱。如果我們需要將報表導(dǎo)出成p
10、df格式,將會使用指定的pdf字體,其它屬性將會被忽略掉。如果我們使用擴(kuò)展的ttf(true type font),那么擴(kuò)展的字體文件(以.ttf結(jié)尾的文件名)必須放置在classpath當(dāng)中。圖6.1在“font name”下拉框中,僅顯示的是java虛擬機(jī)管理的系統(tǒng)默認(rèn)字體,因此,如果要選擇一個擴(kuò)展的ttf字體在非pdf格式報表中,那么我們首先需要在使用之前在系統(tǒng)中把這些字體安裝好。圖6.2上面的字體列表中顯示是內(nèi)置的pdf字體集合,如果直接去編輯下拉框里的字體但這些字體在設(shè)計時候不可用,如果字體文件在啟動的時候找不到,那將會產(chǎn)生一些錯誤。如果我們選擇的字體是一個擴(kuò)展的ttf格式字體,要保
11、證在導(dǎo)出pdf格式時顯示正確,請勾選“pdf embedded”復(fù)選框。如果要導(dǎo)出pdf格式報表選擇正確的字體編碼至關(guān)重要。encoding指定字體如何被編譯。舉個例子,如果使用意大利語,要打印正確的重音符(比如:, , a, )我們必須使用cp1252編碼格式。ireport在下拉框里有一些預(yù)定義的編碼格式。當(dāng)報表導(dǎo)出pdf時包含一些非標(biāo)準(zhǔn)的字符時,要保證所有的fields都有相同的編碼格式并且檢查從數(shù)據(jù)庫里讀出的數(shù)據(jù)采用的字符集格式。6.2 樣式(styles)我們可以選擇主菜單的“format styles” 來定義一個style。如下圖所示:圖6.3點(diǎn)擊“new”按鈕添加一個新的sty
12、le。在彈出的窗口中我們可以定義一些屬性,如果我們需要某個屬性的值,我們可以點(diǎn)擊 按鈕來實(shí)現(xiàn)。圖6.4在每個元素屬性窗口的“common”標(biāo)簽里有一個style屬性下拉框,如果我們需要為一個元素設(shè)置一個style,我們可以在這個下拉框里選擇我們定義好的style,這樣就可以把一個style應(yīng)用到一個元素上面啦。圖6.5我們可以為一個style加一個動態(tài)的條件,當(dāng)條件滿足的時候采用某個style,否則就采用默認(rèn)的style。舉個例子,還是以doradosample里的hsql數(shù)據(jù)庫里的employee表為例,如果員工的薪水大于3500,我們讓薪水以紅色加粗的字體顯示。打開query窗口,輸入下面
13、的查詢sql:select * from employee圖6.6 新建一個style,在彈出窗口的style conditions里新建一個conditions,在表達(dá)式窗口里輸入下面的表達(dá)式:($fsalary.intvalue()3500?new boolean(true):new boolean(false)如下圖:圖6.7新建的style如下圖:圖6.8接下來把員工姓名和員工薪水拖到報表當(dāng)中,并將我們新建的style應(yīng)用到薪水這個field上,如下圖:圖6.9啟動查看運(yùn)行效果如下:圖6.10ireport字段,參數(shù),變量 cubebi.com 立方開源商業(yè)智能 在ireport中有三
14、種類型的對像可以用來保存數(shù)據(jù):fields/parameters/variables.這三種對象可以用在某些地方的expression中,通過一定的邏輯在報表生成的時候動態(tài)的更改某些值。fields/parameters/variables有類型的概念,它們的類型就是一個標(biāo)準(zhǔn)的java的object。要使用這三種類型的對象我們必須首先創(chuàng)建它,創(chuàng)建的方法是點(diǎn)擊“view”主菜單中,選擇其中的子菜單fields,variables,parameters我們可以創(chuàng)建不同的對象。通過這三個子菜單我們可以查看并管理fields,variables,parameters對象。圖1.1通過該窗口,我們可以創(chuàng)
15、建,修改,刪除這三種類型對象。7.1 字段(fields)field在ireport是專門用來組織記錄。field的創(chuàng)建有多種途徑可以實(shí)現(xiàn),我們可以根據(jù)在ireport中各種類型的數(shù)據(jù)源來創(chuàng)建我們所需要的field。在圖1.1中的fields標(biāo)簽頁中,我們可以點(diǎn)擊new 按鈕來創(chuàng)建一個新的field。圖1.2一個field有兩個必填的屬性: name、type和一個可選項的description。從ireport1.0.0開始,fields可以是任何java數(shù)據(jù)類型。這樣當(dāng)我們使用javabean作為數(shù)據(jù)源時我們可以很方便的從java.lang.object向報表中的field的轉(zhuǎn)換工作。在對
16、象的expression里你可以使用下面的語法來引用一個field:$field name例如如果你想處理com.bstek.test.domain.person bean里的username 字段,可以這樣去寫:(com.bstek.test.domain.person)$username)用一個sql query來創(chuàng)建field在ireport的設(shè)計中使用sql query的方式來創(chuàng)建或記錄字段的是使用最廣泛的也是最直接最簡單的一種方式。做此操作我們需要首先打開reportquerydialog窗口(點(diǎn)擊主工具欄的 按鈕), reportquerydialog窗口出現(xiàn)后,我們可以輸入合適的
17、sql檢索并創(chuàng)建fields。圖1.3在打開reportquerydialog窗口之前請先確認(rèn)我們已經(jīng)有一個數(shù)據(jù)源連接處于激活狀態(tài)(激活方式請查看相關(guān)章節(jié)),插入一條查詢語句,如:select * form employeeireport將啟動sql 查詢引擎,根據(jù)輸入的sql將分析結(jié)果用fields的形式展示出來。在下面的窗口中選擇你要的fields(可以多選)然后點(diǎn)擊ok按鈕, fields就被創(chuàng)建出來了。在這個例子當(dāng)中所有字段有多程類型,一般地說,fields的數(shù)據(jù)類型是構(gòu)建在原始sql 類型基礎(chǔ)之上的,如string,integer用javabean生成fieldsireport的高級
18、特性之一是它的數(shù)據(jù)源除了可以構(gòu)建在sql query基礎(chǔ)之上外,還可以使用含有g(shù)etter和setter方法的javabean(或者叫pojo)對象來創(chuàng)建。在這個例子中fields就是pojo類里的屬性(或者是屬性的屬性,即子對象的屬性)。選擇javabean datasource 標(biāo)簽,通過該窗口你可以指定pojo來創(chuàng)建fields。如下圖:圖1.4點(diǎn)擊“read attributes”按鈕,你可以瀏覽這個對象,可以看到這個對象的直接屬性嵌套的對象(子對象),雙擊里面的子對象你可以查看子對象的屬性。要把一個屬性添加到field列表,只需選中需要的屬性然后點(diǎn)擊“add field(s)”按鈕。
19、如果要把一個field作為一個文本打印,可以直接把一個field拖到report的band里或者在report的band里添加一個textfield然后設(shè)置它的expression(把一個field放在expression里)和textfield的類型,如果需要還可以為一個要打印的field定義一個pattern(模式)用來對field內(nèi)容進(jìn)行格式化。圖1.57.2 參數(shù)(parameters)parameters通常是用來在打印的時候從程序里傳值到報表里.也就是說parameters通常的是起參數(shù)傳遞的作用。他們可以被用在一些特定的場合(比如應(yīng)用中sql 查詢的條件),和report中任何一
20、個需要從外部傳入的變量等(如一個image對象所包括的char或報表title的字符串)。和使用fields一樣,parameters也需要在創(chuàng)建的時候定義它的數(shù)據(jù)類型.parameters的數(shù)據(jù)類型是標(biāo)準(zhǔn)的java的object。圖1.6在ireport中parameters的機(jī)制是允許用戶通過應(yīng)用程序傳遞參數(shù)致報表當(dāng)中。在jasperreort中的某個對象中的expression可以通過下面的語法來訪問一個當(dāng)前report中存在的parameter:$pparameter name 如果應(yīng)用程序沒有為報表中定義的parameter賦值,那么parameter將會取我們在定義它的時候設(shè)置的d
21、efault value的值。parameters是一個java object,所以如果它的類型是object類型,我們在其default value里寫下面的表達(dá)式就是錯誤的:0.123你必須要創(chuàng)建一個object,如:new double(0.123)這種寫法就是正確的。在查詢中使用parametersparameters可以用來做sql查詢的條件參數(shù)的傳遞.如果你想根據(jù)部門編號(dept_id)得到客戶的詳細(xì)信息 (設(shè)計的時候我們是不知道這個部門編號的具體值是多少的).此時我們可以這樣組織查詢語句:select * from employee where dept_id=$pdeptid
22、此時sql查詢引擎將會采用preparedstatement來處理傳入的deptid值以此作為查詢條件參數(shù)。如果你想直接通過parameter 值來作為sql語句的一部門,那么你可以使用下面的特殊語法:$p!parameter name。這種寫法允許你在查詢時用parameter的值來替換parameter name。例如,如果我們有一個參數(shù)名為mywhere其值為:where dept_id=d11 ,查詢寫法如下:select * from employee $p!mywhere查詢時實(shí)際提交的字符串是:select * from employee where dept_id=d11在程序
23、里使用parameters在應(yīng)用程序里如果想把某個值傳遞到我們的報表中parameters時,我們可以把相關(guān)的值放入一個擴(kuò)展java.util.map接頭類里,然后傳入到report里。如下面的代碼:.map hm = new hashmap();.jasperprint print = jasperfillmanager.fillreport(filename,hm,new jremptydatasource();fillreport是一個關(guān)鍵的方法,它允許你通過一個文件名,一個參數(shù)集來傳遞到我們要調(diào)用的報表當(dāng)中。例如通過下面的處理方法我們可以讓一個處部的傳入值作為我們報表的title。a)
24、.聲明一個parameter.這個parameter是java.lang.string 類型,名字為:name_report:圖1.6b.將這個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)行時效果如下:圖1.8一般情況下,我們不需要為報表中的每一個par
25、ameters傳遞一個值,除非某一個parameter一定要從處部程序傳入時我們才需為一個parameter設(shè)置一個值。如果一個parameter外部門程序沒有為其賦值那么ireport將使用default value expression來對一個parameter進(jìn)行初始化,如果連default value expression沒有設(shè)置那么它的值就是null。事實(shí)上,對于一個parameters我們不僅僅可以傳遞一個string,integer,boolean等java中小的對象,同時我們還可以利用parameters來傳遞一些足夠大足夠復(fù)雜的對象,比如一個圖像(java.awt.image
26、),或者通過一個parameters來為一個為子報表提供的datasource 連接等。在用map類型傳遞參數(shù)時我們要注意傳遞的參數(shù)要與report里的parameters類型保持一致,否則會拋出classcastexception。ireport內(nèi)嵌的parametersireport提供了一些內(nèi)建的parameters,這些parameters對于用戶來說是只讀的。內(nèi)嵌的parameters列表如下:參數(shù)名說明report_parameters_map它是一個java.util.map類型的對象,可以通過它來傳給填充報表去填充報表里所有的parameters,在這個參數(shù)里還包含用戶定義的p
27、arameters.report_connection一個jdbc的connection參數(shù),報表可以根據(jù)傳入的jdbc connection來獲到相應(yīng)的數(shù)據(jù)report_datasource為報表中的connection提供一個datasource。外部傳入的時候類型也要是datasource類型report_scriptlet報表生成時使用的scriptlet實(shí)例,如果沒有指定scriptlet,那么這個parameters將使用net.sf.jasperreports.engine.jrdefaultscriptlet.is_ignore_pagination通過這個參數(shù)你可以控制分頁功
28、能是打開還是關(guān)閉。默認(rèn)情況下,分頁是打開的。但是如果導(dǎo)出為html或excel時不進(jìn)行分頁處理。report_locale它被用來設(shè)置報表所處的地區(qū)。如果沒有提供地區(qū),那么將采用系統(tǒng)默認(rèn)的地區(qū)。report_time_zone設(shè)置報表的時區(qū),如果沒提供的話采用系統(tǒng)默認(rèn)的。report_resource_boundle為報表指定要加載的資源文件,在國際化一章中介紹了如何使用資源文件來構(gòu)建報表。7.3 變量(variables)variables是用來存儲對某些字段計算后的結(jié)果,比如sum等。圖1.9和fields,parameters一樣,variables也是有數(shù)據(jù)類型的。你必須為一個vari
29、able實(shí)例聲明一個java類型。圖1.9顯示了如何創(chuàng)建一個新的variable??匆幌旅總€字段的意思:variable name: variable的名稱,我們可以在表達(dá)式中通過下面的方法來引用一個variable:$vvariable namevariable class type : variable也可以是任意一個java類型,在下拉框里你可以看到大多數(shù)常用的類型,如java.lang.string等。calculation type : 一個計算類型可以用來計算結(jié)果。當(dāng)一個預(yù)先定義的值是“nothing”時,那它的意思是不做任何計算。ireport會根據(jù)指定的計算類型和從數(shù)據(jù)源中獲取
30、的每一條記錄計算出結(jié)果,然后去更改variables的值。做一個變量的計算意為著去執(zhí)行一個表達(dá)式,如果計算類型為nothing,那么ireport將會根據(jù)variable expression為variable賦值。計算類型列舉如下:類型說明nothing不做任何計算count對記錄集數(shù)量進(jìn)行循環(huán)累加(計算有多少條記錄),這和sum不一樣,sum的計算是針對數(shù)字的,會對數(shù)字進(jìn)行累加操作。distinct count也是對計算有多少條記錄的累加操作,只是在累加過程中會忽略已經(jīng)出現(xiàn)的記錄(比如某個字段的值已經(jīng)出現(xiàn)后就不會再記錄)sum添加每一次表達(dá)式(這里的表達(dá)式只能是數(shù)字類型)迭代的結(jié)果到變量中
31、average它用算術(shù)的方法來計算表達(dá)式累加結(jié)果的平均值lowest返回表達(dá)式最小值highest返回表達(dá)式最大值standarddeviation根據(jù)表達(dá)式所有值返回標(biāo)準(zhǔn)方差variance返回表達(dá)式接收到的值的變化system不做任何計算并且表達(dá)式也是沒有價值的,在這樣的用例中,報表引擎僅僅保存內(nèi)存中variable的最后的值。reset type : 重置類型。表示一個變量在什么時候做重置操作。reset 類型如下:類型名稱說明none任何時候都不做重置操作report在報表創(chuàng)建的時候variable才會對表達(dá)式進(jìn)行初始化pagevariable的初始化在每一頁都做一次reset操作co
32、lumnvariable的初始化在每一列都做一次reset操作(這里的column指的是report里的page的column,每個報表的column可以通過報表的editreport properties窗口進(jìn)行修改)groupvariable的初始化在每一個組都做一次reset操作reset group :如果group reset type被勾選,這里就要選擇group名稱(關(guān)于group可以參考后面的章節(jié))。increment : 它指定當(dāng)一個variable 值被評估或當(dāng)你想要這個組采用類似于subtotals 或averages來計算,increment 類型可以參考下面的表。in
33、crement group : 如果這個group 的increment type 被勾選它將指定這個組決定variable的increment。custom incrementer factory class : 指定一個實(shí)現(xiàn)了jrincrementerfactory接口的java類名稱,通常用來定義一些諸如sum之類的非數(shù)字類型的操作。variable expression : 它是一個java的expression,用來標(biāo)識variable每一次迭代的值。initial value expression : 它是一個為variable初始化時采用的expression.內(nèi)置的variab
34、les和parameters一樣,ireport提供了一些內(nèi)置的variables(這些由報表引擎直接管理),這些變量是只讀的,不能被用戶修改,如下表所示:variable 名稱說明page_number它包含當(dāng)前頁的頁。column_number它包含當(dāng)前的列數(shù)。report_count當(dāng)前的記錄數(shù)目page_count當(dāng)前的頁號column_count當(dāng)前的列號_count在里的記錄總數(shù)ireport欄和組(band and group) cubebi.com 立方開源商業(yè)智能 在本章中,我們將解釋如何用ireports去管理bands和groups,在第四章中我們介紹了報表的結(jié)構(gòu),在本章
35、中我們將要看到如何使用bands來劃分報表。同時我們還將看到如何使用groups,如何創(chuàng)建report中的breaks,如何管理subtotals等等。8.1 欄(bands)ireport把一個報表劃分成七個主要的bands和一個名為backgroup的band(一共是八個bands),每當(dāng)我們添加一個group時就會有兩個新的band添加到報表當(dāng)中:group footer bands和group header bands。點(diǎn)擊 按鈕在彈出的窗口中我們可以對當(dāng)前報表所具有的bands的進(jìn)行相關(guān)屬性的修改。圖8.1通過上圖中的窗口,我們可以修改左邊列表窗口中的任何一個band的屬性,比如它的
36、高(以像素為單位)。print when expression表示我們可以在這里輸入一個表達(dá)式,這樣我們可以根據(jù)表達(dá)式的值來控制當(dāng)前的這個band是否輸出。這里需要注意的是print when expression里必須返回一個java.lang.boolean類型的對象,如:new boolean(true)上面的表達(dá)式說明這個bands總會被打印(如果我們什么都不輸入這個就是默認(rèn)值),在表達(dá)式里可以使用fields,variables,parameters。根據(jù)這個特性我們可以通過相關(guān)的fields,variables,parameters來靈活的控制當(dāng)前的band是否可以輸出,比如下面的
37、代碼:($fsalary.intvalue()4000?new boolean(true):new boolean(false)上面的代碼說明當(dāng)salary的值如果大于4000就輸出當(dāng)前的band否則就不輸出當(dāng)前的band。把鼠標(biāo)移到bands的邊上我們可以鼠標(biāo)拖拉的方式改變band的大小以此來適配band里的內(nèi)容。圖8.28.2 組(groups) groups允許我們對報表里的數(shù)據(jù)進(jìn)行全新的切割分組組合。分組是通過一個表達(dá)式來定義的,ireport會通過這個表達(dá)式進(jìn)行計算分組情況,每一個新的組都是從我們在expression value里輸入的表達(dá)式發(fā)生變化的時候開始的。接下來我們將通過一
38、個例子的演示一步一步說明如何使用groups。 假設(shè)我們有一個員工的列表,我們想要創(chuàng)建一個根據(jù)員工所在的部門進(jìn)行分組的報表。a)首先我們打開一個新的報表文件,然后點(diǎn)擊connection/data sources,選擇jdbc connection,我們創(chuàng)建一個jdbc的connection,如下圖:圖8.3b)點(diǎn)擊和工具欄里的 按鈕,輸入查詢語句,如下圖圖8.4 c)把employee_name和dept_id兩個field拖到report 中的detail的band里,同時調(diào)整detail band的高度,如下圖:圖8.5d)保存報表文件,并按 瀏覽報表生成后的效果,如下圖:圖8.6到這里
39、,我們看到員工的數(shù)據(jù)已經(jīng)可以在報表里顯示,接下來我們就對員工信息按dept_id字段進(jìn)行分組顯示。e)點(diǎn)擊主工具欄里的 按鈕,打開groups定義窗口,并添加一個新的名為dept的group,如下圖:圖8.7一個group有下面幾個屬性需要我們?nèi)ザx:group name:為這個group指定一個名稱,group創(chuàng)建完成后會產(chǎn)生兩個新的band : header和footer band,這兩個band的名稱采用group的名稱來定義。start on a new column:如果此選項勾選,那么分組只會在報表中的新的column產(chǎn)生,也就是說在一頁中報表分組在一個column里只會做一次。s
40、tart on a new page:與上面的選項類似,如果該選項勾選,那么分組只會在每一頁做一次,也就是說每一頁最多只會有一個分組數(shù)據(jù)。reset page number:該選項允許在一個新組開始的時候重設(shè)頁號。print header on each page:如果該選項勾選,那么如果當(dāng)前頁沒能顯示完組里的所有數(shù)據(jù)時,到一頁顯示該數(shù)據(jù)時會把該組的header打印出來,否則將不會打印。min height to start new page:該選項用來設(shè)置當(dāng)前報表中頁面所余下的高度的最小值分組的最小值,默認(rèn)值是0,如果我們設(shè)置為100,表示如果當(dāng)前頁面余下的高度小于100就不再繼續(xù)顯示分組的
41、數(shù)據(jù),而是在下一頁顯示分組的數(shù)據(jù)。group expression : 分組時采用的表達(dá)式規(guī)則,如上圖中我們在定義dept這個group時我們在group expression里輸入了$fdept_id,表示將該組按員工的dept_id字段進(jìn)行分組顯示。group header band height:新產(chǎn)生的header band的高度。group footer band height:新產(chǎn)生的footer band的高度。f)接下來我們把在detail band里的dept_id的field移到report里新產(chǎn)生的deptheader的band里,圖8.8g)點(diǎn)擊 按鈕,報表的生成效果如
42、下:圖8.9 在jasperreport里group的數(shù)量是沒有限制的,一個group可以有一個父group同時也可以有若干個子group。通過group定義列表,我們可以通過”move up”和”move down”來設(shè)置group的順序。group 向?qū)г趇report中還有一種簡單的方法創(chuàng)建一個group,那就是向?qū)?,通過向?qū)覀兛梢钥焖俚膭?chuàng)建一個group,我們可以通過主菜單中的edit new report group wizard來啟動創(chuàng)建group的向?qū)АD8.10向?qū)г试S用戶創(chuàng)建最多有四個group的報表(group header,group footer和每一個group關(guān)聯(lián)
43、)。groups和records的排序我們可以在設(shè)置查詢的地方選擇設(shè)置選項來使ireport自動對依據(jù)字段進(jìn)行排序,我們也可以在創(chuàng)建一個group時要對分組的字段做好正確的排序工作。比如在sql中我們可以添加“order by ”來對要分組的字段進(jìn)行排序。ireport子報表(subreport) cubebi.com 立方開源商業(yè)智能 subreport是ireport提供的高級功能,通過subreport我們可以創(chuàng)建復(fù)雜的報表。通過subreport我們可以創(chuàng)建一個包含若干個子報表的報表。創(chuàng)建一個包含子報表的報表我們需要三個對象:一個jasper文件,一個包含參數(shù)map(當(dāng)然可以為空)和一
44、個datasource(數(shù)據(jù)源,或者是一個jdbc的connection)。在本章中我們將解釋如何通過這三個對象創(chuàng)建一個subreport并實(shí)現(xiàn)在子報表中數(shù)據(jù)過濾顯示的目的。9.1 創(chuàng)建一個子報表(create a subreport)一個subreport是一個真正的包含它自己xml文件并且是一個已經(jīng)編譯好的jasper文件。創(chuàng)建一個subreport就是創(chuàng)建一個普通的報表文件,創(chuàng)建過程中唯一需要注意的是設(shè)置subreport的寬度、高度及一些不需要顯示的band,一般情況下對于不顯示的band我們把它們的高度都設(shè)置為0。在設(shè)置子報表的寬度時我們應(yīng)該考慮到它在父報表中顯示時的效果,然后針對這
45、一特性有針對性的去設(shè)置。在父報表中我們要添加一個子報表可以通過ireport中的subreport工具 來實(shí)現(xiàn)。子報表的形狀和一個距形類似,我們可以調(diào)整subreport的尺寸和位置以控制子報表的顯示。將一個子報表鏈接到父報表中需要做三件事情:獲得subreport所對應(yīng)的jasper報表對象、如何為它提供數(shù)據(jù)及如何為子報表的parameters設(shè)置具體的值。所有這些信息的定義我們可以通過subreport properties窗口來實(shí)現(xiàn)。圖9.1圖9.29.2 傳遞參數(shù)(passage of the parameters)當(dāng)我們在應(yīng)用程序里通過fillreport方法來生成一個報表的時候,我
46、們會提供一個包含參數(shù)值的map一起傳遞到報表中,包含參數(shù)的map對象是由報表引擎直接管理的。在子報表屬性窗口的里的“subreport”標(biāo)簽里的“parameters map expression”屬性就是提供給我們的最簡單的方法來為子報表設(shè)置parameters的值,它允許我們定義一個最終可以返回java.util.map對象的表達(dá)式,使用這種方法我們可以把從外部應(yīng)用程序傳到父報表里的parameter對象,當(dāng)然這個parameter的實(shí)際值是一個java.util.map對象傳遞給子報表使用(比如$ptestmap),這里我們也可以使用內(nèi)建的報表parameters:$preport_pa
47、rametes_map把子報表中的java.util.map對象傳遞到父報表中供使用。如果該屬性我們空著不填那么一個不包含任何值的空的java.util.map將會被傳到子報表中。這種機(jī)制的局限性是parameters里所對應(yīng)的java.util.map值是死的、不會變的。為了克服這種局限性jasperreport允許我們定義parameter鍵值對的時候每個對象的值通過一個表達(dá)式來創(chuàng)建,如在圖9.2中的“subreport parameter”表中通過添加個參數(shù)java.util.map來填充子報表。圖9.3deptid是子報表中一個parameter的名稱,如果設(shè)置值時也要與子報表中dep
48、tid的數(shù)據(jù)類型保持一致。指定數(shù)據(jù)源為子報表指定數(shù)據(jù)源就是告訴jasperreport引擎如何獲到數(shù)據(jù)來填充subreport。我們可以指定兩種類型的數(shù)據(jù)源:jdbc connection和datasource。使用jdbc來填充報表是很簡單的,在connection expression里定義一個已經(jīng)連接到數(shù)據(jù)庫的java.sql.connection對象。要把一個已經(jīng)處于打開狀態(tài)下的連接傳到subreport中我們只需使用一個預(yù)定義的包含一個基于從應(yīng)用程序里調(diào)用fillreport方法時的傳入的連接report_connection參數(shù)如果使用一個datasource就稍微復(fù)雜一點(diǎn),事實(shí)上
49、它是一個簡單的記錄的集合,記錄集合的概念和jdbc connection不同,既然如此我們可以通過一個parameter來傳遞一個datasource來填充subreport,此時采用這種機(jī)制內(nèi)建的parameter report_connection就不再起作用了。一個datasource是一個普通的“消費(fèi)品”對象僅僅可用來填充一次報表。所以一個作parameter傳遞的datasource可以滿足一個subreport的需要。因此parameter的方式不能滿足當(dāng)父報表的每一行記錄都有一些子報表的數(shù)據(jù)與之對應(yīng)(除非主報表中只有一條記錄)。當(dāng)我們解釋datasource時我們可以看到這個問題
50、可以通過自定義datasource方式解決。指定subreport創(chuàng)建一個subreport我們需要指定一個擴(kuò)展名為.jasper文件,我們需要在subreport屬性窗口中設(shè)置subreport expression屬性。表達(dá)式返回的類型必須與我們在下拉框里選擇的類似保持一致,類型列表如下:類型名稱含義net.sf.jasperreports.engine.jasperreport在一個jasperreport對象里預(yù)加載一個jasper文件java.io.inputstream一個jasper文件的流j url一個用來定義jasper文件的urljava.io.file一個j
51、asper文件的file對象java.lang.stringjasper文件的文件名如果表達(dá)式是一個string類型,那么引擎將通過jrload來加載指定位置的jasper文件。9.3 子報表示例(subreport sample)在這個例子中我們將采用示例數(shù)據(jù)庫來創(chuàng)建一個簡單的包含子報表的報表。我們要從兩張表里取數(shù)據(jù):dept(部門表)、employee(員工表),要達(dá)到的效果是根據(jù)部門表的部門id取出該部門下的所有員工。類似的效果的報表我們在groups一章中使用group也實(shí)現(xiàn)了一次,這里我們將用subreport來實(shí)現(xiàn)相同的效果。新建一個空報表,新建一個名為deptid的paramet
52、er對象,如下圖:圖9.4在這里我們在default value expression里賦予了一個空的字符串,為什么要這樣做呢,因?yàn)榻酉聛砦覀円褂迷損arameter來作為sql的查詢條件的輸入值,所以我們要對這個參數(shù)賦予一個初始化的值。點(diǎn)擊 打開sql查詢引擎窗口,輸入下面的查詢語句:select * from employee where dept_id=$pdeptid在這里,我們在查詢員工信息的時候加了一個部門的條件,如下圖:圖9.5此時如果我們把相關(guān)的field拖到detail band里,然后點(diǎn)擊 我們發(fā)現(xiàn)沒有任何記錄,原因是因?yàn)槲覀儾]有為deptid賦值。保存報表文件,我們命
53、名為emp.jrxml,我們把這個報表文件作為下面將要引用的子報表文件。因?yàn)樗鼘⒆鳛樽訄蟊肀灰茫晕覀冃枰{(diào)整該報表的不用顯示的band的高度及detail band的高度,如下圖:圖9.10在detail band里我們放置了三個字段:employee_name(員工姓名)、sex(性別)、birthday(出生日期)。接下來我們需要建立一個父報表,關(guān)閉emp.jrxml文件,新建一個空的報表文件,命名為dept.jrxml。點(diǎn)擊主工具欄里 打開sql查詢窗口,輸入下面的語句:select * from dept如下圖:圖9.11把dept_name這個field拖動到報表的detail
54、 band里,同時在detail band里添加一個了報表,在彈出的子報表向?qū)е形覀冞x擇“cancel”按鈕,這里我們不采用向?qū)韯?chuàng)建subreport。如下圖圖9.12雙擊子報表圖標(biāo)打開子報表屬性設(shè)置窗口,在彈出的窗口中我們選擇“subreport”標(biāo)簽,在“connection/datasource expression”屬性里我們選擇“use connection expression”并且指定內(nèi)建的parameter:report_connection作為表達(dá)式用來存儲jdbc連接,如下圖:圖9.13切換到“subreport(other)”標(biāo)簽窗口,指定如何找到子報表文件“emp.j
55、asper”以及如何創(chuàng)建和修改在子報表與父報表之間的參數(shù)傳遞。使用絕對路徑在ireport里我們不用去考慮子報表文件是否可以被找到的問題,因?yàn)樽訄蟊泶娣诺哪夸浺呀?jīng)被自動的加到ireport的classpath里了。這里我們指定的值是“$psubreport_dir +java.io.file.separator+emp.jasper”圖9.14為了在子報表里可以顯示員工的信息我們需要為子報表的deptid這個parameter賦值,這里我們通過父報表傳過去,在“subreport parameters”窗口中,我們添加了一個用于為子報表的deptid賦值的parameter,該值到于父報表中的
56、$fdept_id這個field。編譯子報表和父報表。點(diǎn)擊主工具欄中的 按鈕,查看生成的后父報表效果。圖9.15在這里我們看到子報表里的有一些字段顯示的有問題(如sex性別這塊顯示的是true和false,還是日期不是我們要的日期格式),需要我們進(jìn)一步對顯示的字段信息進(jìn)行格式化操作。打開emp.jrxml文件,選中detail band里的sex field,右鍵選擇properties,在彈出的窗口作如下修改:圖9.16在text field expression里我們輸入($fsex.booleanvalue()?男:女)的意思是把原來顯示的true和false翻譯成男和女。這里$fsex是java.lang.boolean類型,所以需要先把它轉(zhuǎn)化成java.lang.boolean所對應(yīng)的簡單類型,然后如果值為true則為男,否則為女。對于birthday(出生日期)我們同樣需要對其做格式化操作,如下圖:圖9.17關(guān)閉emp.jrxml(關(guān)閉之前別忘記對其進(jìn)行編譯)。打開父報表dept.jrx
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東科貿(mào)職業(yè)學(xué)院《工作坊交流》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東警官學(xué)院《急診與急救》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東江門中醫(yī)藥職業(yè)學(xué)院《計算機(jī)網(wǎng)絡(luò)安全B》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東技術(shù)師范大學(xué)《藏漢古代文化對比研究專業(yè)選修》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東工商職業(yè)技術(shù)大學(xué)《短距離無線通信技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 燜渣罐事故培訓(xùn)課件
- 《海航籌資之路與資》課件
- 廣安職業(yè)技術(shù)學(xué)院《數(shù)字邏輯設(shè)計及應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 保健老師培訓(xùn)課件
- 贛西科技職業(yè)學(xué)院《英語中級聽力》2023-2024學(xué)年第一學(xué)期期末試卷
- 消防水池 (有限空間)作業(yè)安全告知牌及警示標(biāo)志
- 修復(fù)學(xué)全口義齒
- 機(jī)械設(shè)備租賃合同范本簡單版(9篇)
- 美甲顧客檔案表Excel模板
- 公安警察工作總結(jié)匯報PPT模板
- 城市生活垃圾分選系統(tǒng)設(shè)計
- 外國文學(xué)專題作業(yè)答案
- 綠色施工管理體系與管理制度管理辦法(新版)
- 機(jī)動車交通事故快速處理協(xié)議書(最新格式)
- 最新拉鏈廠安全操作規(guī)程
- 變壓器交接試驗(yàn)報告(1250)
評論
0/150
提交評論