FineReport

最強大的動態報表與BI商業智慧工具!

填報自定義提交設置

自定義報表問題描述

用戶在做填報報表時,希望點擊提交按鈕並不是往資料庫中填報數據,而是要獲取到填報頁面的數據進行進一步處理,這個該如何解決呢?

自定義報表解決思路

在報表填報屬性中介紹了報表填報屬性有2種設置方式,一個是內置SQL直接綁定欄位,往資料庫中填報數據,另外一種是添加自定義事件,如果需要獲取數據對數據進行進一步處理,則可選擇添加自定義事件,下面詳細介紹。

自定義報表示例

獲取填報頁面的值,通過自定義事件獲取到數據並在後台列印出來。

 自定義事件類

自定義事件繼承自DefinedSubmitJob這個介面,通過JobValue介面獲取填報頁面單元格,JobValue與報表填報屬性處的屬性綁定,然後用getValue()方法獲取單元格的值,getValueState()獲取值的狀態,值狀態有四種:VALUE_STATE_CHANGED、VALUE_STATE_INSERT、VALUE_STATE_DELETED和VALUE_STATE_DEFAULT。

方法一

在類裡面定義幾個JobValue,每一個JobValue對應一個單元格,在報表填報屬性中通過屬性列表中將其與對應的單元格綁定起來,具體使用如DemoSubmitJob1:

package com.fr.data;

import com.fr.data.DefinedSubmitJob;

import com.fr.data.JobValue;

import com.fr.script.Calculator;

public class DemoSubmitJob1 extends DefinedSubmitJob {

/**

* 當模板自定義事件增加的屬性 名稱與下面變數有對應時,則會自動賦值於此對應變數

*/

private JobValue studentno; // JobValue對應單元格

private JobValue name;

private JobValue grade;

private boolean isPass; // 非單元格,則對應具體類型值

/**

* 每一條記錄執行一次此方法

* 同一提交事件在一個處理事務內,此對象是唯一的

*/

public void doJob(Calculator calculator) throws Exception {

// JobValue的getValueState()方法獲取此對應單元格的狀態

if (studentno.getValueState() == JobValue.VALUE_STATE_CHANGED) {

// 此單元格的值在報表初始化後被修改過

} else if (studentno.getValueState() == JobValue.VALUE_STATE_INSERT) {

// 此單元格是在報表初始化後新增的(例如執行了插入行操作)

} else if (studentno.getValueState() == JobValue.VALUE_STATE_DELETED) {

// 此單元格所在的記錄被執行了刪除操作

} else if (studentno.getValueState() == JobValue.VALUE_STATE_DEFAULT) {

// 此單元格在報表初始化後沒有變化

}

// 值獲取

System.out.print(” 學號: ” + studentno.getValue()); // 通過JobValue的getValue方法獲得單元格的值

System.out.print(” 姓名: ” + name.getValue());

System.out.print(” 總分: ” + grade.getValue());

System.out.print(” 是否達標: ” + isPass);

System.out.println();

}

}

註:可以講所有變數全部定義成JobValue對象,通過getValue()獲取對象的值。

方法二

通過doJob的方法參數Calculator中的 Property_Value屬性, Property_Value屬性對應一個map對象,Map中包含報表填報屬性中所有屬性名稱以及它們對應的值,使用map中的getValue()方法獲取屬性值,即單元格,接著使用JobValue的getValue()方法獲取單元格的值,詳細如DemoSubmitJob2:

package com.fr.data;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import java.util.Map.Entry;

import com.fr.data.DefinedSubmitJob;

import com.fr.data.JobValue;

import com.fr.script.Calculator;

public class DemoSubmitJob2 extends DefinedSubmitJob {

/**

* 每一條記錄執行一次此方法

* 同一提交事件在一個處理事務內,此對象是唯一的

*/

public void doJob(Calculator calculator) throws Exception {

// 同樣可以直接在傳入的calculator中獲取定義的屬性及其對應的值

Map map = (Map)calculator.getAttribute(PROPERTY_VALUE);

if (map == null) return;

Set set = map.entrySet();

Iterator it = set.iterator();

Entry entry;

// 遍歷Map獲取所有屬性及其值

while (it.hasNext()) {

entry = (Entry)it.next();

System.out.print(” ” + entry.getKey() + “: “);

// JobValue對應單元格

if (entry.getValue() instanceof JobValue) {

JobValue ce = (JobValue)entry.getValue();

// JobValue的getValueState()方法獲取此對應單元格的狀態

if (ce.getValueState() == JobValue.VALUE_STATE_CHANGED) {

// 此單元格的值在報表初始化後被修改過

} else if (ce.getValueState() == JobValue.VALUE_STATE_INSERT) {

// 此單元格是在報表初始化後新增的(例如執行了插入行操作)

} else if (ce.getValueState() == JobValue.VALUE_STATE_DELETED) {

// 此單元格所在的記錄被執行了刪除操作

} else if (ce.getValueState() == JobValue.VALUE_STATE_DEFAULT) {

// 此單元格在報表初始化後沒有變化

}

System.out.print(ce.getValue()); // 通過JobValue的getValue方法獲得單元格的值

} else {

// 非單元格,則對應具體類型值

System.out.print(entry.getValue());

}

}

System.out.println();

}

}

方法三

自定義事件除了可繼承自DefinedSubmitJob這個介面之外,還可以繼承TotalSubmitJob介面,這兩個介面的區別在於DefinedSubmitJob多次執行,即一行一行的獲取模板中的數據,獲取一行數據則執行一次自定義事件,而TotalSubmitJob介面只執行一次,即先獲取到模板中所有的數據,然後在類裡面循環,具體使用如DemoTotalSubmitJob:

package com.fr.data;

import com.fr.data.JobValue;

import com.fr.data.TotalSubmitJob;

import com.fr.script.Calculator;

public class DemoTotalSubmitJob extends TotalSubmitJob {

/**

* 同一提交事件,在一個提交事務內只執行一次

* @param data 以二維表排列的所有提交數據

*

*/

protected void doTotalJob(Data data, Calculator calculator)

throws Exception {

data.getColumnCount(); // 獲取列的數量,每一列對應一個添加的屬性

for (int i = 0; i < data.getColumnCount(); i++) {

System.out.println(data.getColumnName(i)); // 獲取對應的屬性名稱

}

for (int i = 0; i < data.getRowCount(); i++) { // getRowCount 獲取一共多少行數據

System.out.print(“ROW ” + i + ” {“);

for (int j = 0; j < data.getColumnCount(); j++) {

if (j > 0) System.out.print(“, “);

Object value = data.getValueAt(i, j); // 獲取對應位置的值

if (value instanceof JobValue) {

JobValue ce = (JobValue)value;

// JobValue的getValueState()方法獲取此對應單元格的狀態

if (ce.getValueState() == JobValue.VALUE_STATE_CHANGED) {

// 此單元格的值在報表初始化後被修改過

} else if (ce.getValueState() == JobValue.VALUE_STATE_INSERT) {

// 此單元格是在報表初始化後新增的(例如執行了插入行操作)

} else if (ce.getValueState() == JobValue.VALUE_STATE_DELETED) {

// 此單元格所在的記錄被執行了刪除操作

} else if (ce.getValueState() == JobValue.VALUE_STATE_DEFAULT) {

// 此單元格在報表初始化後沒有變化

}

value = ce.getValue(); // 通過JobValue的getValue方法獲得單元格的值

}

System.out.print(data.getColumnName(j) + ” : ” + value);

}

System.out.print(“}”);

System.out.println();

}

}

}

 填報頁面主體設置

數據準備

新建資料庫查詢ds1:SELECT * FROM [STSCORE] where name <> ”。

主體界面

將studentno,name和grade求和拖曳至單元格中,並為之添加控制項,如下圖:

添加報表控制項
B4和D4單元格為數字控制項,C4單元格為文本控制項。

報表填報屬性設置

如上所述,實現自定義事件獲取填報頁面的值有三種方法,則下面根據上述的不同方法介紹填報屬性的不同設置。
方法一——DemoSubmitJob1
將類文件放置到%FR_HOME%WebReportWEB-INFclassescomfrdata文件夾下面。
點擊模板>報表填報屬性,添加自定義事件,選擇DemoSubmitJob1這個類,為類中定義的變數綁定單元格或公式,如下圖:

註:該方法中屬性名稱跟類文件中定義的JobValue是一一對應的,必須保證報表填報屬性處添加的屬性名稱與類文件中定義的名稱保持一致,並且如果在類文件中對應參數類型不是JobValue的話,則就必須與屬性的數據類型保持一致,一般來說,為了便於維護,可以講java類中的所有變數全部設為JobValue對象,不論報表填報屬性中的屬性類型是什麼,均可以通過GetValue獲取其值。
效果展示
後台列印效果如下:

方法二——DemoSubmitJob2
將類文件放置到%FR_HOME%WebReportWEB-INFclassescomfrdata文件夾下面。
點擊模板>報表填報屬性,添加自定義事件,選擇DemoSubmitJob2這個類,為類中定義的變數綁定單元格或公式,如下圖:

註:方法二中是通過Calculator參數屬性PROPERTY_VALUE來獲取報表填報屬性處的屬性與屬性值,再通過JobValue來得到單元格的值,在類文件中並不是一一對應的獲取屬性與屬性值,而是通過map遍歷來獲取屬性與屬性值,所以在報表填報屬性處增加屬性時,屬性名字可隨意定義,但是後面的值如果是單元格的話,必須選擇單元格類型。
效果展示
後台列印效果如下:
報表列印展示

方法三——DemoTotalSubmitJob
將類文件放置到%FR_HOME%WebReportWEB-INFclassescomfrdata文件夾下面。
點擊模板>報表填報屬性,添加自定義事件,選擇DemoTotalSubmitJob這個類,為類中定義的變數綁定單元格或公式,如下圖:
java自定義報表
註:方法三與方法二中的使用方式類似。

效果展示

後台列印效果如下:
自定義報表,java報表

其他應用

自定義事件不僅可用於報表填報屬性處,也可用於按鈕控制項中的提交事件,具體可查看上傳文件至指定路徑。

  • 聯繫我們

  • 電話:0933-790886
  • 邮箱:brian.wang@fanruan.com
  • 地址:300 新竹市學府路40號 (交大育成中心 R302)
  • 臉書粉絲團
Copyright©2017 Fanruan Software Co.,Ltd. All Rights Reserved. 帆軟軟體有限公司 | 蘇ICP備14031611號-8

返回頂部