1. 概述
FineReport 報表的數據來源可以是數據庫數據或是文本數據,并且還可以是其它類型的數據。
FineReport 通過 AbstractTableData 抽象類來讀取數據源,上述所有的數據來源都繼承 AbstractTableData 類實現抽象方法,因此用戶只要實現了 AbstractTableData 抽象類,FineReport 報表引擎就能夠讀取用戶自定義的數據源。
FineReport 支持程序數據集,用戶自定義程序數據源後,可在數據集處添加「程序」數據集使用。如下圖所示:
2. 原理
AbstractTableData 抽象類主要有4個方法,如下:
//獲取 AbstractTableData 的總列數
public int getColumnCount();
//獲取 AbstractTableData 中第 columnIndex 列的列名
public String getColumnName(int columnIndex);
//獲取 AbstractTableData 的總行數
public int getRowCount();
//獲取 AbstractTableData 中第 columnIndex 列,第 rowIndex 行的數據,在某些應用場景中,需要在程序中對數據進行處理後再作爲報表的數據源使用。
public Object getValueAt(int rowIndex, int columnIndex);
3. 示例
下面實現自定義數據源,作爲程序數據集使用。數據如下表所示:
Name | Score |
---|---|
Alex | 15 |
Helly | 22 |
Bobby | 99 |
3.1 定義程序數據源
定義一個類,繼承 AbstractTableData,并實現裏面的方法,在代碼中準備了數據。詳細代碼參見:
注:遠程設計時情況下,自定義程序數據集中定義的數據字段必須是可序列化的,不然數據集預覽會報錯。
3.2 編譯 class 文件
将 ArrayTableDataDemo.java 編譯生成 ArrayTableDataDemo.class 類。
編譯 class 文件前先要引入 FineReport 的 jar 包文件,具體可參考 編譯Java程序 内容。
将 java 文件和生成的 class 文件拷貝到報表工程目錄下。由於該文件屬於 com.fr.data 包,因此需将 ArrayTableData.class 和 ArrayTableData.java 放在%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\data 目錄下,此時該程序數據源便定義好了。
注:遠程設計時,本地設計器和遠程服務器的工程下都需要放置程序數據集對應的 class 文件和 java 文件。
3.3 配置程序數據源
點擊模板數據集下面的加号,選擇「程序」數據集,在彈出的程序數據集對話框中,選擇對應的 class 文件,如下圖所示:
選定 class 文件後,在設計器中編譯保存後才可以正常使用,如下圖所示:
注:class 文件對應的 Java 文件也要放置在 class 文件所在的位置,否則無法編譯,顯示://Didn't find java source match the class
3.4 使用程序數據集
配置好程序數據源後便可以使用自定義的程序數據集,與其他類型的數據集使用方法相同,可以通過拖拽方法實現單元格數據列綁定。如下圖所示: