FineReport報表的資料來源可以是資料庫資料或是文字資料,並且還可以是其它任何型別的資料,因為FineReport是通過AbstractTableData抽象類來讀取資料來源的,而上述所有的資料來源都繼承實現其抽象方法,因此使用者只要實現了AbstractTableData抽象類,也就可以用自定義型別的資料來源了(程式資料集),FineReport報表引擎就能夠讀取定義的資料來源作為報表資料來源使用。
下面就通過報表系統FineReport來進行介紹。
工具/原料
報表系統FineReport 8.0
方法/步驟
實現原理
AbstractTableData抽象類主要有5個方法,如下:
//獲取AbstractTableData的總列數
public int getColumnCount();
//獲取AbstractTableData中第columnIndex列的列名
public String getColumnName(int columnIndex);
//判斷是否存在第rowIndex行,這主要是用於處理超大資料時,完全遍歷所有資料獲取總行數相當困難,用這個方法來判斷第rowIndex行是否存在,存在則可讀取
public boolean hasRow(int rowIndex);
//獲取AbstractTableData的總行數
public int getRowCount();
//獲取AbstractTableData中第columnIndex列,第rowIndex行的資料
public Object getValueAt(int rowIndex, int columnIndex);
在某些應用場景中,需要在程式中對資料進行處理後再作為報表的資料來源使用。
示例
下面我們定義資料集為如下樣式:列為Name,Score,值分別為Alex,15;Helly,22;Bobby,99作為程式資料集。
定義程式資料來源
定義一個類,繼承AbstractTableData,並實現裡面的方法,具體的程式碼如下:
package com.fr.data;import com.fr.data.AbstractTableData;public class ArrayTableDataDemo extends AbstractTableData { // 定義程式資料集的列名與資料儲存位置 private String[] columnNames; private Object[][] rowData; // 實現構建函式,在構建函式中準備資料 public ArrayTableDataDemo() { String[] columnNames = { "Name", "Score" }; Object[][] datas = { { "Alex", new Integer(15) }, { "Helly", new Integer(22) }, { "Bobby", new Integer(99) } }; this.columnNames = columnNames; this.rowData = datas; } // 實現ArrayTableData的其他四個方法,因為AbstractTableData已經實現了hasRow方法 public int getColumnCount() { return columnNames.length; } public String getColumnName(int columnIndex) { return columnNames[columnIndex]; } public int getRowCount() { return rowData.length; } public Object getValueAt(int rowIndex, int columnIndex) { return rowData[rowIndex][columnIndex]; }}
將ArrayTableDataDemo.java編譯生成ArrayTableDataDemo.class類。
將生成的類檔案拷貝到報表工程/WEB-INF/classes目錄下。由於該類是在com. fr.data包中的,因此最終應該將該ArrayTableData.class放在/WEB-INF/classes/com/fr/data下面。此時該程式資料來源便定義好了
配置程式資料來源
點選模板資料集下面的加號,選擇程式資料集,然後在彈出的程式資料集對話方塊中,選擇對應的class檔案,如下圖:
使用程式資料集
配置好程式資料來源後便可以使用定義的程式資料集了,與其他型別的資料集使用方法是相同的,可以通過拖拽方法實現單元格資料列繫結。如下圖: