JasperReports報表數據源
數據源的結構數據容器。同時生成報告,Jasper報表引擎獲得來自數據源的數據。數據可以從數據庫,XML文件,對象數組和集合中的對象來獲得。我們將在本章填充報告所看到的fillReportXXX()方法,預計將收到該報告的數據源其以填充,在net.sf.jasperreports.engine.JRDataSource對象或一個java.sql.Connection中的形式(當報表數據在關係數據庫中找到)。
JRDataSource接口隻有兩個方法,這應該被實現:
- public boolean next() throws JRException; 在報表填充時間,這種方法是通過遍曆數據時調用的數據源對象上的報告引擎。
- public Object getFieldValue(JRField jrField) throws JRException; 此方法在當前數據源記錄為每個報表字段的值。
從數據源中檢索數據的唯一方法是通過使用報表字段。有一個JRDataSource接口的幾個默認的實現,根據不同的數據源中的記錄被獲得的方式。
數據源的實現
下表總結了數據源和它們的實現類。
Datasource | Implementation Class |
---|---|
JDBC | net.sf.jasperreports.engine.JRResultSetDataSource |
JavaBean | net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource |
Map-based | net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource |
TableModel | net.sf.jasperreports.engine.data.JRTableModelDataSource |
XML | net.sf.jasperreports.engine.data.JRXmlDataSource |
CSV | net.sf.jasperreports.engine.data.JRCsvDataSource |
XLS | net.sf.jasperreports.engine.data.JRXlsDataSource |
Empty | net.sf.jasperreports.engine.JREmptyDataSource |
JDBC數據源
JRResultSetDataSource類關聯入一個java.sql.ResultSet對象。這是當報表數據從關係數據庫中提取最常用的數據源實現。如果ajava.sql.Connection傳遞給引擎來代替,它首先執行相關的查詢,並將該返回java.sql.ResultSet中的對象在一個JRResultSetDataSource實例。
JAVABEAN數據來源
JRBeanArrayDataSource類和JRBeanCollectionDataSource表示實現,可以分彆包裝的JavaBean對象的數組或集合。數組或集合中的每個對象都將被視為對這種類型的數據源中的一個記錄。一個特定的JavaBean屬性和相應的報表字段之間的映射是通過命名約定進行。報表字段的名稱必須是相同的所指定的JavaBeans的規範JavaBean屬性的名稱。
在本教學中的所有例子中,我們使用JRBeanCollectionDataSource。
基於MAP的數據來源
如果父級應用程序已經存儲在內存中的java.util.Map對象提供的申報數據的實現類JRMapArrayDataSource和JRMapCollectionDataSource非常有用。被包裝的數組或集合中的每個映射對象被認為是數據源中的一個虛擬的記錄,每個報表字段的值從映射中使用報表字段名作為鍵提取。
TableModel的數據來源
在許多客戶端應用程序,數據以表格形式顯示。在許多應用中常見的需求是允許用戶打印該表格形式的報告。實現類JRTableModelDataSource使生成的表格格式的Swing應用程序報告的任務。這個類封裝了一個javax.swing.table.TableModel對象。列在包裝的TableModel對象可以通過他們的名字或他們的基於0索引來訪問。
XML數據源
類JRXmlDataSource是基於DOM,它使用XPath表達式來選擇XML文檔數據的數據源的實現。 XML數據源中的記錄是通過XPath表達式選擇的節點元素表示。字段值是由每個記錄使用由字段描述(JRXML<fieldDescription>元素)所提供的XPath表達式檢索。
XPath是用於導航XML文檔的屬性和元素的語言。有關XPath更多信息可以在這裡找到http://www.w3.org/TR/xpath.
CSV數據來源
JRCsvDataSource 代表了從結構化文本文件中檢索其數據的數據源的實現,通常為CSV。字段值是正在使用他們的列索引檢索。
xls數據來源
JRXlsDataSource 代表其檢索的Excel文件的數據的數據源的實現。報表字段映射為這個數據源的實現也是基於字段列索引。
空數據來源
類JREmptyDataSource,模擬與內部虛擬空的記錄給定數量的數據源。它是由用戶界麵的工具來提供基本的報表預覽功能,或在特殊報告模板,或用於測試和調試目的。
重繞數據源
net.sf.jasperreports.engine.JRRewindableDataSource擴展的基本JRDataSourceinterface。它增加了隻有一個方法為MoveFirst()到接口。這種方法的目的是將光標移動到數據源中的第一個元素。
與放置在帶內子報表不允許拆分由於isSplitAllowed=“false”的設定,並且冇有足夠的空間,在當前頁上對要呈現的子報表工作時,重繞的數據源是有用的。
以上所有數據源的實現是可回退除JRResultSetDataSource,因為它不支持移動記錄指針回來。這對隻有當該數據源是用它傳遞給子報表之前手動換一個java.sql.ResultSet中的一個問題。這是冇有問題,如果SQL查詢駐留在子報表模板,該引擎將在下一個頁麵上重新啟動子報表時,再次執行它。
數據源提供者
JasperReports庫有一個接口net.sf.jasperreports.engine.JRDataSourceProvider。這有助於創建和處理數據源對象。當創建使用GUI工具報表模板,則需要自定義報表的數據源的特殊工具。JRDataSourceProvider是為了堵塞自定義數據源到設計工具的標準方法。自定義實現該接口應實現以下方法,使創建和配置數據源對象和方法,上麵列出數據源如果可能的話,裡麵可用的報表字段:
public boolean supportsGetFieldsOperation(); public JRField[] getFields(JasperReport report) throws JRException, UnsupportedOperationException; public JRDataSource create(JasperReport report) throws JRException; public void dispose(JRDataSource dataSource) throws JRException;