自定義函數規範
- 函數簽名:
FunctionName(Para1, Para2, ...),函數名不區分大小寫。
- 每個函數對應一個 Java 類,必須實現
com.fr.script.Function 介面 (通常繼承 AbstractFunction)。
- 引擎通過函數名反射獲取類,調用
run(Object[] args) 方法,參數在 args 數組中。
內建 SUM 函數源碼解析
public class SUM extends AbstractFunction {
public Object run(Object[] args) {
double result = 0;
for (Object arg : args) {
if (arg == null) continue;
result += parseObject(arg);
}
return FunctionHelper.parsePrimitiveDouble(result);
}
private double parseObject(Object obj) {
if (obj instanceof Number) return ((Number) obj).doubleValue();
if (obj instanceof Boolean) return ((Boolean) obj) ? 1 : 0;
if (obj instanceof FArray) {
FArray arr = (FArray) obj;
double sum = 0;
for (int i = 0; i < arr.length(); i++) sum += parseObject(arr.elementAt(i));
return sum;
}
if (obj != null) {
try { return Double.parseDouble(obj.toString()); }
catch (NumberFormatException e) { return 0; }
}
return 0;
}
}
開發自定義函數:StringCat (字符串拼接)
package com.fr.function;
import com.fr.script.AbstractFunction;
public class StringCat extends AbstractFunction {
@Override
public Object run(Object[] args) {
StringBuilder sb = new StringBuilder();
for (Object arg : args) {
if (arg != null) sb.append(arg.toString());
}
return sb.toString();
}
}
編譯與部署
- 編譯生成
StringCat.class。
- 放入 FineReport 安裝目錄:
WEB-INF/classes/com/fr/function/StringCat.class (包路徑對應目錄)。
- 重啟 FineReport 應用 (或熱部署環境下刷新類加載器)。
設計器中註冊
- 打開「服務器」→「函數管理器」。
- 點擊「新增」,選擇剛部署的
com.fr.function.StringCat 類。
- 設定函數顯示名稱 (如
StringCat)、分類、描述 (如「將所有參數以字符串形式拼接」)。
- 確定保存。
報表中使用
- 新建報表,定義兩個參數:
para1 (字符串)、para2 (整數)。
- 在任意單元格輸入公式:
=StringCat($para1, $para2) (參數前加 $ 引用)。
- 分頁預覽,填入
para1=FineReport、para2=123,查詢結果顯示 FineReport123。
進階技巧
- 型別轉換:利用
FunctionHelper.parsePrimitiveDouble、FunctionHelper.toBigDecimal 統一返回型別。
- 陣列參數:參數若為
FArray,可遍歷 elementAt(i) 處理集合運算。
- 異常處理:捕獲運算異常,返回
null 或拋出 FunctionException 讓前端提示友好錯誤。
- 效能:避免在
run 中做重 IO/資料庫操作;若需緩存,用靜態變量配合軟引用。
常見問題