簡介(Introduction)html
Jasperreports是一個強大的開源報表工具,它可以傳送豐富的內容到屏幕上、打印機或者轉換爲PDF、HTML、XLS、RTF、ODT、CSV、TXT和XML文件等多種格式的文件。Jasperreports徹底由Java編寫,它能夠被用於各類各樣的Java程序來動態的生成內容。它主要的目的就是幫助以一種簡單且靈活的方式生成基於頁面的、可打印的文檔。java
Jasperreports會整理從JRXML文件(報表設計文件,又稱爲報表模版文件,後綴爲*.jrxml)中定義的數據源中取出的數據。爲了給一個報表填充數據,報表設計文件必須首先通過編譯。sql
經過JasperCompileManager類暴露的compileReport()方法來編譯報表設計文件。經過編譯,報表設計文件(*.jrxml)將被加載到一個報表設計(jasper-design)對象中,而後這個對象將被序列化到磁盤上(由JasperReport類完成,生成的文件爲*.jasper)。這個序列化的對象將在程序須要向其填充數據的時候被使用到。事實上,編譯一個*.jrxml文件意味着將要編譯定義在*.jrxml文件中定義的全部Java表達式,在編譯時將執行一系列的驗證過程,用於檢查*.jrxml文件的一致性。編譯的結果是生成一個將會根據一系列數據來生成文檔的「待填充(ready-to-fill)」文件(*.jasper)。shell
咱們可使用JasperFillManager類暴露的fillReportXXX()方法來填充一份「待填充」文件。這些方法接收一個jasper-design對象或者一個表明該對象的文件做爲參數,同時接收一個鏈接數據庫的用於獲取填充數據的JDBC鏈接。方法的執行結果是生成一個可打印(ready-to-print,打印工做由JasperPrint類完成)文檔(*.jrprint),它將被序列化到磁盤上待之後使用。這份文檔將被傳送到屏幕或者打印機,或者能夠被導出爲PDF、HTML、XLS、RTF、ODT、CSV、TXT或者XML文檔。數據庫
如上所述,使用JasperReports時用到的主要的類有:express
net.sf.jasperreports.engine.JasperCompileManagerapache
net.sf.jasperreports.engine.JasperFillManagerapi
net.sf.jasperreports.engine.JasperPrintManager數組
net.sf.jasperreports.engine.JasperExportManageride
這些類表明了JasperReports引擎的門面類,它們包含了一系列簡化了訪問API的靜態方法,它們可用於編譯一份報表設計文件、爲報表填充數據、打印報表或者將結果導出到其餘文檔格式。
除了這些門面類之外,你還能夠直接使用具體的導出類來工做。好比你須要導出你的報表爲XLS、RTF、ODT、TXT或者其餘文檔格式,對於這些格式,在JasperExportManager類中沒有相應的輔助方法,又好比在當你須要配置導出過程以使知足你特殊的需求時,也可使用這些導出類。這些導出實現類能夠在JasperReports庫的net.sf.jasperreports.engine.export包中找到。
若是你想在Swing應用中顯示報表,你可使用和JasperReports庫一塊兒推出的JRViewer組件。它由一個可嵌入的並且可配置的java.swing.JPanel組件組成。JasperViewer是一個獨立的Swing應用,它使用JRViewer組件以特有的格式(序列化的JasperPrint對象)或者XML格式展現報表。爲了輔助報表設計工做,JasperReports還在JasperDesignerViewer類中提供了一個報表設計的預覽器。
正如上面提到的,報表設計表明了一個將會被JasperReports引擎使用來生成動態內容到打印機、屏幕或者Web的模版文件。存儲在數據庫中的數據會被整理起來用於得到可打印的、基於頁面的文檔。報表設計以一種特殊的結構定義在JRXML文件中,這個結構已在JasperReports引擎提供的DTD文件中聲明。而後JRXML文件被編譯,由於接下來將在報表填充操做中使用到它們。
爲了建立一個簡單的報表設計,咱們須要以如下結構來編輯一份XML文件:
<!--?xml version="1.0"?--> <jasperreport ...="" name="name_of_the_report" xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"> ... </jasperreport>
爲了更好的理解JRXML文件的結構,或者一份報表設計的流程,咱們推薦你看看快速引用(原連接已失效)。
一份報表設計文件是以一個具備jasperreport.dtd文件定義的結構的JRXML文件或者是一個存在於內存中的JasperDesign對象的方式呈現。爲了根據這樣的報表設計文件生成報表,這個對象或文件須要被編譯。這個編譯過程能夠經過使用JasperCompileManager類的compileReportXXX()方法完成,其結果是生成一個*.jasper文件或者一個JasperReport對象。
編譯一個報表設計文件時,引擎首先會執行一步驗證來確保設計文件的一致性,而後
轉換全部報表中的表達式爲一個待賦值的形式,而且將它們存儲在編譯後的JasperReport文件或者*.jasper文件中。
這個轉換要麼是跟報表模版相關的Java類的快速編譯過程,要麼是生成將要在報表填充階段計算表達式值時使用的Groovy或者BeanShell腳本,這取決於報表中指定的表達式的語言(詳見報表模版文件的language屬性)。
在更深刻了解報表編譯以前,你應該經過閱讀如下常見問題來了解何時你須要編譯模版文件,以及怎樣才能以最好的方式編譯它們:
什麼狀況下我應該編譯個人模版文件?怎樣編譯?(原連接已失效)
爲了讓模版文件編譯過程儘量的靈活,咱們將用到一個特殊的叫作JRCompiler的接口。正如上面看到的,在這個庫中有多個不一樣類型的類實現了這個接口:
1. Java報表編譯器。這個編譯器生成並編譯一個包含計算表達式值的方法的Java類。
2. Groovy報表編譯器。它生成一個腳本用於在運行時計算表達式的值。
3. BeanShell報表編譯器。它也生成一個腳本用於運行時計算表達式的值。
關於更多報表編譯的信息,請查看The Definitive Guide to JasperReports。
用Ant任務來編譯報表模版文件
既然模版文件的編譯過程更像是一個設計時的工做而不是運行時的工做,庫中提供一個Ant任務來簡化開發。這個Ant任務由JRAntCompileTask類實現,它和Ant內置任務<javac>很是類似,只是符號和行爲須要咱們關心。
模版文件的編譯任務能夠經過在工程的build.xml文件中像下面這樣聲明:
<taskdef classname="net.sf.jasperreports.ant.JRAntCompileTask" name="jrc"> <classpath> <fileset dir="./lib"> <include name="**/*.jar" /> </fileset> </classpath> </taskdef>
在上面的例子中,lib文件夾應包含jasperreports-<version>.jar文件和它所依賴的庫文件(包含jdt-compiler-<version>.jar,萬一你使用Java做爲報表表達式的語言,這是推薦的報表編譯器)。
接下來這個用戶自定義的Ant任務能夠用於在一個單個操做中編譯多個JRXML報表模版文件。能夠經過指定包含這些JRXML文件的根目錄或者經過使用文件的模式匹配選擇JRXML文件來指定它們。下面是模版文件編譯任務的一些屬性:
屬性 | 描述 |
srcdir | 用於編譯的JRXML文件的位置。 除非相關的元素會呈現,不然是不可省(Required)的。 |
destdir | 用於存放編譯後文件的位置(默認與srcdir相同) |
compiler | (可選)實現了JRCompiler接口的類的名字 |
xmlvalidation | 用於標記報表模版的源文件的XML驗證是否將被執行的標記(默認值爲true) |
tempdir | 用於存儲臨時生成文件的位置(默認值爲當前工做目錄) |
keepjava | 用於代表臨時生成的Java文件是否須要保留的標記(默認值爲false) |
像Ant內置任務<javac>同樣,報表模版文件編譯任務支持內嵌的<src>和<classpath>元素。爲了看到這一點起做用,能夠查看JasperReports項目源碼中提供的demo/samples/antcompile例子
查看一個報表設計文件
報表設計文件能夠經過使用JasperDesignViewer程序來查看。在它的main()方法中,它接收一個用於查看的包含報表設計的文件名,它多是JRXML文件自身,也能夠是編譯後的設計文件(.jasper文件)
咱們能夠經過調用JasperFillManager類的fillReportXXX()方法讓一個編譯好的報表文件生成報表。在這個門面接口類中有兩種類型的填充方法。一類接收一個java.sql.Connection對象做爲第三個參數,另外一類接收一個JRDataSource對象。
這是由於大多數時候,咱們使用一個JDBC鏈接獲取關係型數據庫中的數據來填充報表,咱們能夠很方便的在報表模版文件中使用SQL查詢。JasperReports引擎可使用傳遞給它的Connection執行SQL查詢,由今生成一個報表數據源用於填充報表。
若是數據以其餘的形式提供,此時將用到接收一個數據源做爲參數的方法。
生成的報表能夠經過使用JasperViewer程序來查看。它的main()方法接收一個用於查看的報表文件的文件名。生成的報表也能夠經過調用JasperPrintManager類的printReport()、printPage()或者printPages()等靜態方法來打印。
在填充了一個report後,咱們能夠經過調用JasperExportManager的exportReportXXX()方法將其導出爲PDF,HTML或者XML格式。
參數是在報表填充操做中傳入的對象的引用。它在傳遞不能從數據源中找到的數據給報表引擎時很是有用。例如:若是咱們須要在報表中顯示啓動報表填充操做的用戶的名字,咱們能夠傳遞一個用戶名給引擎;或者咱們能夠經過參數來動態的改變報表的標題。
還有一個很重要的方面是:爲了能在更進一步的自定義從數據庫中取到的數據,能夠在報表的查詢字符串中使用參數,這些參數能夠像爲報表提供數據的查詢中的動態過濾器同樣工做。
在報表模版中聲明一個參數很簡單,咱們只須要指定其類型和參數名,例如:
<parameter class="java.lang.String" name="ReportTitle" /> <parameter class="java.lang.Integer" name="MaxOrderID" /> <parameter class="java.awt.Image" name="SummaryImage" />
在查詢中有兩種可能使用這些參數的方式:
1. 參數用於普通的java.sql.PreparedStatement的參數,使用如下格式:
SELECT * FROM Orders WHERE CustomerID = $P{OrderCustomer}
2. 有時,使用參數來動態修改SQL查詢的一部分或者傳遞整個SQL查詢做爲參數來填充報表是頗有用的,在這些狀況下,格式有些不一樣,例以下面的例子:
SELECT * FROM Orders ORDER BY $P!{OrderByClause}
下面還有些系統中內置的參數,在表達式中能夠直接使用:
參數名 |
描述 |
REPORT_PARAMETERS_MAP |
這個參數包含了全部用戶定義和內置的參數的Map |
REPORT_CONNECTION |
一個用戶提供的,用於JDBC鏈接數據源的java.sql.Connection |
REPORT_DATA_SOURCE |
一個表明系統內置的數據源類型或者用戶提供的數據源的JRDataSource |
REPORT_MAX_COUNT |
一個用於容許用戶限制數據源大小的整數 |
REPORT_SCRIPTLET |
一個由用戶提供的,包含一個報表Scriptlet實例的JRAbstractScriptlet對象 |
REPORT_LOCALE |
一個包含資源組指望的locale實例的java.util.Locale對象 |
REPORT_RESOURCE_BUNDLE |
包含了本地化消息的java.util.ResourceBundle對象 |
REPORT_TIME_ZONE |
一個用於爲用戶格式化日期的java.util.TimeZone實例 |
REPORT_VIRTUALIZER |
虛擬化頁面時用到的JRVirtualizer對象 |
REPORT_CLASS_LOADER |
一個在報表填充階段用到的用於加載像images、fonts、或者subreport模版的java.lang.ClassLoader 實例 |
IS_IGNORE_PAGINATION |
若是被設置成java.lang.Boolean.TRUE,報表將會生成一個很長的頁面,不會插入分頁符 |
JasperReports使用一個叫作JRDataSource的接口來支持多種類型的數據源,這個接口有這個接口有一個默認的叫作JRResultSetDataSource的實現類,它封裝了一個java.sql.ResultSet對象,它容許經過JDBC使用任何類型的關係型數據庫。
使用一個JDBC數據源時,你須要傳遞一個java.sql.Connection對象給報表填充操做,並指定報表定義中的query(能夠查看XML文件中的元素);或者經過直接提供一個java.sql.ResultSet對象來建立一個新的JRResultSetDataSource實例。
對於其餘類型的數據源而言,也沒有多大區別。你須要作的就是實現JRDataSource接口,或者使用JasperReports庫中的某一個實現類來封裝一個內存中的集合、JavaBeans數組、CSV或XML文件等。
報表的字段是惟一映射數據源中的數據到報表生成子程序的方式。當報表的數據源是一個java.sql.ResultSet時,java.sql.ResultSet對象中的全部的字段必須映射給相應的列,這些列必須擁有和ResultSet字段一樣的名字和相兼容的數據類型。
好比:若是咱們想用Employees表中取出的數據生成一個報表,該表爲如下結構:
字段名 | 數據類型 | 長度 |
EmployeeID | int | 4 |
LastName | varchar | 20 |
FirstName | varchar | 10 |
HireDate | datetime | 8 |
咱們能夠在報表模版文件中定義如下字段:
<field class="java.lang.Integer" name="EmployeeID" /> <field class="java.lang.String" name="LastName" /> <field class="java.lang.String" name="FirstName" /> <field class="java.util.Date" name="HireDate" />
若是咱們聲明一個字段,該字段在java.sql.ResultSet中沒有相應的列對應,那麼將會在運行時拋出一個異常。一個在java.sql.ResultSet中的列的對象若是在報表中沒有對應的字段,那麼在報表填充操做時將不受影響,可是它一樣不可訪問。
表達式是JasperReports的一個強大的功能。它們可用於聲明報表中對數據分組時將會執行一系列計算的變量,來指定報表文本域內容甚至自定義報表中對象的樣式。
基本上全部的報表表達式是Java表達式,它們能夠引用報表中的字段(Fields)和變量(Variables)。
在一個XML報表模版文件中,定義的表達式有如下幾種:
<variableexpression>
<initialvalueexpression>
<groupexpression>
<printwhenexpression>
<imageexpression>
<textfieldexpression>
在一個表達式中使用一個報表字段(Field),字段名必須放在」$F{「和」}」之間,好比:若是咱們想在報表中的一個textfield中顯示兩個字段鏈接後的值,咱們能夠像下面這樣定義一個表達式:
<textfieldexpression> $F{FirstName} + " " + $F{LastName} </textfieldexpression>
表達式甚至能夠更復雜一些:
<textfieldexpression> $F{FirstName} + " " + $F{LastName} + " was hired on " + (new SimpleDateFormat("MM/dd/yyyy")).format($F{HireDate}) + "." </textfieldexpression>
在表達式中引用一個變量(Variable),變量名必須放在」$V{」和」}」之間,像下面的例子同樣:
<textfieldexpression> "Total quantity : " + $V{QuantitySum} + " kg." </textfieldexpression>
在表達式中,能夠對參數(Parameter)使用相同的符號。參數名應該放在」${」和」}」之間,像下面的例子同樣:
<textfieldexpression> "Max Order ID is : " + $P{MaxOrderID} </textfieldexpression>
報表的變量是一個在表達式基礎上特殊的對象。變量能夠經過僅僅被聲明一次並在報表中用於屢次,或者在相應的表達式中進行一系列的計算來簡化報表設計。在它的表達式中,一個變量能夠引用其餘變量,但前提是這些被引用的變量以前報表中已經有聲明。所以,報表中變量聲明的順序很重要。
正如提到的,變量能夠在他們相應的表達式中執行內置類型的計算,例如count,sum,average,lowest,highest等。
一個用於計算數量總和的變量應該像如下這樣聲明:
<variable calculation="Sum" class="java.lang.Double" name="QuantitySum"> <variableexpression> $F{Quantity} </variableexpression> </variable>
對於執行計算的變量,咱們能夠指定它們從新初始化的級別。默認級別是Report,那意味着這個變量在整個報表開始時只初始化一次,而後它將執行指定的計算直到報表結束。可是咱們能夠指定一個重置變量的較低級別,例如頁面級別(page),列級別(column)或者組級別(group)。
好比:若是咱們想計算每一頁的總量,咱們應該這樣聲明一個變量:
<variable calculation="Sum" class="java.lang.Double" name="QuantitySum" resettype="Page" > <variableexpression> $F{Quantity} </variableexpression> <initialvalueexpression> new Double(0) </initialvalueexpression> </variable>
這個變量將在每一頁開始時初始化爲0值。
這裏還有如下能夠在表達式中直接使用的內置變量:
PAGE_NUMBER
COLUMN_NUMBER
REPORT_COUNT
PAGE_COUNT
COLUMN_COUNT
GroupName_COUNT
當構建一個報表時,咱們須要定義區域的佈局和內容。整個報表文件結構是基於如下區域的:
<pageheader>
<groupheadr>
<groupfooter>
<pagefooter>
<summary>
<columnheader>
<detail>
<columnfooter>
<lastpagefooter>
<nodata>
Sections是報表中的一部分,它有一個指定的高度和寬度,而且能夠包含例如線條(lines)、矩形(rectangles)、圖像(images)或者文本域(textfields)等報表元素。當在XML報表模版文件中聲明報表區域的佈局和內容時,咱們使用通常的元素。
下面這個頁眉中,只包含了一個線條對象和一個靜態文本:
<pageheader> <band height="30"> <rectangle> <reportelement height="25" width="555" x="0" y="0"></reportelement> <graphicelement></graphicelement> </rectangle> <statictext> <reportelement height="25" width="555" x="0" y="0"></reportelement> <textelement textalignment="Center"></textelement> <text>Northwind Order List</text> </statictext> </band> </pageheader>
有時候一組元素須要共享一個公共的背景色或者一個公共的邊框。這是經過在它們後面放一個矩形來實現的,可是這樣作對網格導出器(grid exporters)是不起做用的,由於它不支持重疊的元素。
新的Frame元素將被網格導出器識別,能夠被用於將元素嵌入Frame中來對元素進行分組。Frames能夠被嵌入無限層。
分組表明了一種在報表中組織數據的靈活的方式。當填充一個報表的時候,JasperReports引擎將檢測全部定義的分組表達式來判斷是否發生了分組結束,若是是,引擎將在報表中使用相應的<groupfooter>(這個分組的groupfooter)和<groupheader>(下個分組的groupheader,若是有的話。譯者注。)區域。
只要咱們須要,在報表中咱們能夠有不少個group。報表中聲明的分組順序很重要,由於分組互相包含,一個組包含接下來的一個組,等等。當一個大的分組結束時,全部子分組會被從新初始化。
聲明一個報表分組時,會同時給出相應的數據分組表達式,咱們會聲明兩種區域:就是分組的header和分組的footer。
請查閱Jasper樣例報表來查看如何定義分組。
如今你能夠以任何語言建立報表了!
介紹的元素中的新屬性容許在Java字體和PDF字體間創建映射關係。PDF使用特殊的字體設置,在JasperReports之前的版本中沒有一種方式可使用它們。經過介紹這些新的屬性,用戶能夠指定PDF將使用哪一種字體來顯示不一樣的字符集(pdfFontName屬性),將使用何種編碼方式(pdfEncoding屬性)以及是否該字體會被嵌入到PDF文檔中(isPdfEmbedded屬性)。
爲了簡化字體設置,一個新的元素出現了:
報表字體是報表級別的字體定義,它能夠在整個報表的其餘字體定義中被用於默認或者基準字體設置。由於對國際化字符的支持在某種程度上跟iText庫相關聯。你能夠查看iText文檔以得到關於怎樣以不一樣語言不一樣字符集來建立一個PDF文檔的更多信息。
爲了將一組被用於報表元素的視覺特性進行分組,引入了報表樣式。這個新概念是一個之前的報表字體(如今已過期)的擴展。引用了報表樣式的報表元素可以覆蓋任何在樣式中定義的視覺特性。
報表樣式一樣能夠引用其餘的報表樣式,而且擁有一樣的用於樣式的繼承和覆蓋機制。樣式在整個組的元素須要共享一樣的視覺特性的時候很是有用,由於對樣式的任何改變都會被用於該組中全部的元素。這能夠經過改變它們共同引用的報表樣式來實現。
在報表樣式中顯示的全部數據均來自報表參數(Parameters)和報表的字段(Fields)。這些數據可使用報表變量(Variable)和它們組成的表達式來處理。
處理變量有特定的時刻。一些變量在報表開始時根據它們的resettype來初始化,一些在趕上分頁(page break)或者分列(column break)時,亦或者在分組改變(group change)時。另外,變量在每次從數據源中取出新數據時被賦值(每行都會賦值一次)。
可是隻有簡單的變量表達式有時不能實現複雜的功能,這時就要用到小腳本了。
小腳本是Java代碼片斷,它們能夠在每次報表事件發生時被執行。經過使用小腳本,用戶能夠修改報表變量中存放的值。
由於小腳本主要和報表變量一塊兒工做,在準確的時刻徹底控制腳本的執行是極爲重要的。JasperReports容許用戶自定義的Java代碼在根據變量的重置類型(Report、Page、Column和Group)初始化報表變量的「以前」或者「以後」被執行。
爲了利用好這個功能,用戶只須要經過繼承JRAbstractScriptlet類或者JRDefaultScriptlet類來建立一個腳本類便可。這個自定義腳本類的名字必須在<jsaperreport>元素中的scriptletClass屬性中指定。
當建立一個JasperReports腳本類時,開發者須要實現或者覆蓋幾個方法,好比:beforeReportInit, afterReportInit(), beforePageInit(), afterPageInit(), beforeGroupInit(), afterGroupInit()等,這些方法將會在填充報表的合適時候被報表引擎調用。
有一個默認的報表參數叫REPORT_SCRIPTLET,它表明了一個對報表引擎在填充報表時初始化的腳本對象的引用,它能夠被用於整個報表的表達式中來調用腳本對象中的自定義方法,這使得整個機制更加靈活。
以上就是小腳本的全部了!詳見ScriptletReport例子。
子報表是一個報表生成工具重要的功能。子報表容許建立更加複雜的報表來簡化設計工做。
子報表在建立概覽--明細類型的報表或者單個報表不足以描述複雜的輸出文檔時很是有用。
子報表其實就是一個包含在另外一個報表中的普通報表。一個報表能夠和子報表重疊,還能夠建立包含本身的一個子報表,這種嵌套能夠深至無限的深度。任何的報表模版在被嵌入到其餘報表時不須要修改裏面的任何地方就能夠被做爲一個子報表。
像其餘報表元素同樣,子報表元素有一個將在運行時爲了得到JasperReports對象的資源而被計算的表達式。
一共有兩種方式能夠爲子報表提供參數值。一種是,你可使用用於生成指定參數映射Map的元素,或者你可使用<subreportparameter>元素爲每個相關的參數賦值。若是同時使用兩種方式爲子報表參數賦值,那麼使用<subreportparameter>指定的參數值將覆蓋使用<parametersmapexpression>元素指定的值。
就像普通報表同樣,子報表也以一樣的方式,須要一個數據源來生成相應的內容,而且子報表在填充時但願接收到相同的輸入類型。
從子報表中計算出的值能夠被返回到父報表,在一個子報表填充值以後,子報表的變量值能夠被賦值或者累計(使用一個增加器)到父報表的變量中。
詳情請查閱Subreport樣例。
JasperReports容許經過使用新的resourceBundle屬性在運行時或者在運行時爲內置參數REPORT_RESOURCE_BUNDLE賦一個值來關聯一個java.util.ResourceBundle對象。
若是須要以不一樣於當前本地環境(Locale)的環境生成,那麼在填充報表時這個內置參數REPORT_LOCALE應該被用於指定運行時的本地環境。
爲了更容易的國際化報表,在報表表達式中有一個特殊符號容許引用放在報表關聯的java.util.ResourceBundle對象中的字符串資源。$R{...}表達式用於封裝資源束(Resource Bundle)的key來獲取對應的值。
爲了格式化基於報表本地環境的不一樣語言中的消息,在報表關聯的JRCalculator中有一個內置方法提供和java.text.MessageFormat類類似的功能。這個方法就是msg(),它容許在消息中最多使用3個參數。一樣的,還提供了內置的str()方法,它的做用和表達式中$R{...}符號相同,都是基於報表的本地環境訪問資源束。
在生成的輸出中,JasperReports庫會保存文本運行方向,以便以不一樣語言生成的擁有從右到左的書寫(好比阿拉伯語和希伯來語)的文檔可以被正確的渲染。
詳情請查閱I18nReport和UnicodeReport樣例。
圖表和交叉表有時候須要使用在報表填充時沒有被迭代的數據。這就是數據源的某些字段自身做爲子報表的數據源這種狀況。
爲了不使用子報表來渲染圖表或者交叉表,咱們引入了一個叫作數據集(Dataset)的新概念。一個數據集是一個數據源和子報表之間的概念,由於它包含了參數(Parameters)、字段(Fields)、變量(Variables)和分組(Groups),可是沒有佈局(Layout)信息。
詳情請查閱/demos/samples/charts和Crosstabs樣例。
JasperReports如今內置支持使用圖表。儘管咱們已經有圖像、文本域子報表和其餘元素可用,還有一種新的、當即可用的圖表組件。這極大的簡化了把圖表嵌入到報表中的方式,由於這以前,用戶必須徹底依賴於小腳本(scriptlets)來收集圖表數據並在報表模版中使用一個image元素來渲染圖表。
如今經過使用新的chart組件,用戶只須要設置指望的樣式而且在迭代報表數據源時以一種增加的方式定義可以幫助引擎構建圖表數據集的表達式便可。
在嵌入和配置圖表組件時,有三個相關的實體:
全局的chart組件
chart數據集(將chart數據分組的相關設置)
chart樣式(chart條目在渲染時相關的樣式設置)
JasperReports目前支持如下幾種圖表:
餅圖、3D餅圖、條形圖、3D條形圖、堆積圖、3D堆積圖、折線圖、區域圖、散點圖、氣泡圖、時序圖和高低開合圖。
這些圖表使用幾種數據集(每一種圖表和幾種指定的數據集工做):餅圖數據集、種類數據集、XY數據集、時序數據集、時間段值、XYZ數據集和高低數據集。
對於全部的圖表,咱們能夠配置如下屬性:
四周的邊框
背景色
標題
標題位置(頂部、左邊、底部、右邊)
標題字體
標題顏色
子標題
子標題字體
子標題顏色
顯示/隱藏圖例
繪圖區域背景色
繪圖區域背景色透明度(alpha值)
繪圖區域前景色透明度(alpha值)
繪圖區域方向(垂直、水平)
座標文本
對於全部的數據集,咱們能夠配置如下屬性:
增加類型(詳細、列、頁、分組、報表)
增加分組
重置類型(無、按列、按頁、按組、按報表)
重置分組
圖表類型的詳細設置:
3D餅圖
深度因子
條形圖、XY條形圖、堆積條形圖
隱藏/顯示文本
隱藏/顯示提示標記
隱藏/顯示提示文本
3D條形圖,3D堆積條形
圖隱藏/顯示文本
x偏移量(3D效果)
y偏移量(3D效果)
折線圖、XY折線圖、散點圖、時序圖
隱藏/顯示線條
隱藏/顯示圖形氣泡圖
氣泡圖
縮放類型
高低開合圖
隱藏/顯示關閉提示
隱藏/顯示打開提示
JasperReports使用JFreeChart庫來渲染圖表。關於怎麼使用這個功能,能夠在提供的JFreeChart樣例中找到。
交叉表是一個特殊類型的表組件,它的行和列都是動態的。它們用於顯示在列(columns)和組(groups)上使用多級分組的聚合數據。
詳情請查閱提供的Crosstabs樣例。
原文地址:http://community.jaspersoft.com/wiki/jasperreports-library-tutorial