FacebookTwitterLineHatena

通過TableData介面可以讀取任何形式的數據源,FineReport報表工具的數據來源可以是資料庫數據或是文本數據,並且還可以是其它任何類型的數據,因為這些所有的數據來源都實現了TableData介面,所以用戶只要實現了TableData介面,也就可以用自定義類型的數據源了。對於傳參,我們可以在程序數據集中寫入傳入的參數,此方案傳入的參數為 tableName 和 columnNames 兩項;即傳入資料庫表名以及所需要的列名取出所需要的值;這裡連的資料庫為動態報表與BI
商業智慧
工具的內置資料庫,適用時可輸入表名:stscore 列名 name;sex。具體步驟如下:

1. 定義程序數據源

1.1 TableData介面簡介
TableData介面所需實現的方法
只要實現了TableData介面,FineReport動態報表與BI商業智慧軟體報表引擎就能夠讀取數據源作為報表數據源使用。TableData介面主要有5個方法,如下:
1). public int getColumnCount(); //獲取TableData的總列數
2). public String getColumnName(int columnIndex); //獲取TableData中第columnIndex列的列名。
3). public boolean hasRow(int rowIndex); //判斷是否存在第rowIndex行,這主要是用於處理超巨量資料時,完全遍歷所有數據獲取總行數相當困難,用這個方法來判斷第rowIndex行是否存在,存在則可讀取。
4). public int getRowCount(); //獲取TableData的總行數。
5). public Object getValueAt(int rowIndex, int columnIndex); //獲取TableData中第columnIndex列,第rowIndex行的數據。

1.2 以PramTableDataDemo為例描述如何實現TableData介面
因為AbstractTableData已經實現了默認的hasRow(int rowIndex)方法,所以可以從AbstractTableData擴展,定義ParamTableDataDemo,代碼如下:
private String splitMark = “;”;
// 自定義間隔符暫定為『;』即輸入列名參數時需像如此 name;sex;age;
private String[] columnNames = null;
// 列欄位名數組 保存在數據集窗口下一開始顯示的數據列名稱
private int columnNum = 10;
// 自定義需要列出的列數量 即在數據集窗口列出的數據集下的欄位數量
String[] colNames = null;
// 保存取到的欄位 即輸入的參數欄位,假如是name;sex 參數欄位即為name 和 sex 兩項
private ArrayList valueList = null;
// 保存查詢得到的值列

1.3 構造函數
public ParamTableDataDemo() {
// 定義需要的參數 tablename columnNames
this.parameters = new Parameter[] { new Parameter(“tableName”),
new Parameter(“columnNames”) };
// 初始化下列名,暫定為columnName#0,columnName#1……顯示在數據集窗體中的
columnNames = new String[columnNum];
for (int i = 0; i < columnNum; i++) {
columnNames[i] = “columnNames#” + String.valueOf(i);
}
}

1.4 匹配取值
for (int i = 0; i < parameters.length; i++) {
if (parameters[i].getName().equals(“tableName”)) // 做匹配
tableName = parameters[i].getValue().toString();
else colNames = this.getParameters()[i].getValue().toString().split(
splitMark);}

1.5 構造SQL語句
String sql = “select “;// 傳入參數中輸入的欄位
for (int i = 0; i < colNames.length; i++) {
colNames[i].trim();
if (i == colNames.length – 1)
sql += colNames[i];
else {sql += colNames[i] + “,”;} }
sql += ” from ” + tableName + “;”;

1.6 獲得資料庫連接
public Connection getConnection() {
String driverName = “sun.jdbc.odbc.JdbcOdbcDriver”;// 載入驅動
String url = “jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:ProgramFilesfinereportFineReport6.5WebReportWEB-INFresourcesdataFRDemo.mdb”;
String username = “”;
String password = “”;
Connection con = null;
try {
Class.forName(driverName);
con = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return con;
}
具體實現代碼如附件所示
編譯ParamTableDataDemo.java,將生成的ParamTableDataDemo.class文件放到報表伺服器的%FineReport6.5WebReportWEB-INFclasses目錄;注意:如該例子所示,其包名為com.demo,所以其類所在路徑為comdemo

2. 配置程序數據集

• 步驟一:選擇「伺服器|伺服器數據集」,在彈出的窗口左上角點擊,選擇添加程序,可以把默認名字更改為恰當的名字,如下圖所示:
報表伺服器數據集
• 步驟二:點擊選擇您定義好的類文件,此處選擇上面定義好的ParamTableDataDemo.class,點擊下方的確定即添加完成。如下圖所示:選擇報表函數類
添加完成後的程序數據集並會在數據面板中出現,如下圖所示:添加後的報表程序數據集
在參數對話框中輸入需要傳遞的參數tableName,columnNames如圖所示:輸入參數
點擊確定之後出現如下圖面:傳參後的報表數據集
圖片中的columnName#是在程序數據集中自定義的。

3. 使用程序數據集

因為columnNames輸入的是兩個數據列名,所以columnNames#0,columnNames#1欄位中存入了相應的name,sex欄位數據。

3.1 將columnNames#0,columnNames#1拖到B2,C2單元格中,表樣設計如圖所示:將列名拖入報表單元格
點擊設計器預覽:再次出現參數窗口,輸入相應的參數:輸入參數
再次輸入相應的參數,點擊確定,預覽效果圖如下:報表預覽
注意:程序數據集中的代碼在配置時需要改動相應的url,如圖所示:更改URL
此驅動和URL分別對應伺服器|自定義數據連接中的driverName和URL。對應的驅動和URL

喜歡這篇文章嗎?歡迎分享按讚,給予我們支持和鼓勵!

熱門文章推薦

立即試用,可獲取更多 報表範本和案例

免費試用