報表資料來源



資料來源是結構化的資料容器。在生成報表時,JasperReports 引擎從資料來源獲取資料。資料可以從資料庫、XML 檔案、物件陣列和物件集合中獲取。我們在章節 填充報表 中看到,fillReportXXX() 方法期望接收報表的要填充的資料來源,其形式為 net.sf.jasperreports.engine.JRDataSource 物件或 java.sql.Connection(當報表資料在關係資料庫中找到時)。

JRDataSource 介面只有兩個方法需要實現:

  • public boolean next() throws JRException;

    • 在報表填充時,當報表引擎遍歷資料時,會在資料來源物件上呼叫此方法。

  • public Object getFieldValue(JRField jrField) throws JRException;

    • 此方法提供當前資料來源記錄中每個報表欄位的值。

檢索資料來源中資料的唯一方法是使用報表欄位。根據獲取資料來源中記錄的方式,JRDataSource 介面有幾個預設實現。

資料來源實現

下表總結了資料來源及其實現類:

資料來源 實現類
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
基於 Map 的 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
net.sf.jasperreports.engine.JREmptyDataSource

JDBC 資料來源

JRResultSetDataSource 建立一個 java.sql.ResultSet 物件。當報表資料從關係資料庫中提取時,這是最常用的資料來源實現。如果傳遞 java.sql.Connection 給引擎,它會先執行相關的查詢並將返回的 java.sql.ResultSet 物件儲存在 JRResultSetDataSource 例項中。

JavaBean 資料來源

JRBeanArrayDataSourceJRBeanCollectionDataSource 代表可以包裝 JavaBean 物件的陣列和集合的實現。陣列或集合中的每個物件都將在此型別的資料來源中視為一條記錄。特定 JavaBean 屬性與相應報表欄位之間的對映是透過命名約定進行的。報表欄位的名稱必須與 JavaBeans 規範中指定的 JavaBean 屬性的名稱相同。

在本教程的所有示例中,我們都使用了 JRBeanCollectionDataSource。

基於 Map 的資料來源

如果父應用程式已經將報表資料儲存在記憶體中作為 java.util.Map 物件,則實現類 JRMapArrayDataSourceJRMapCollectionDataSource 很有用。包裝的陣列或集合中的每個 Map 物件都被視為資料來源中的虛擬記錄,每個報表欄位的值都是使用報表欄位作為鍵從 map 中提取的。

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 模擬一個具有給定數量的虛擬空記錄的資料來源。它由 UI 工具用於提供基本的報表預覽功能,或在特殊的報表模板中,或用於測試和除錯目的。

可回滾資料來源

net.sf.jasperreports.engine.JRRewindableDataSource 擴充套件了基本 JRDataSource 介面。它僅向介面添加了一個名為 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;
廣告