首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

FineReport 自定義函數開發指南:從規則、編碼到註冊與使用全流程

     編輯:Java 綜合教學

自定義函數規範

  • 函數簽名: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();
    }
}

編譯與部署

  1. 編譯生成 StringCat.class。
  2. 放入 FineReport 安裝目錄:WEB-INF/classes/com/fr/function/StringCat.class (包路徑對應目錄)。
  3. 重啟 FineReport 應用 (或熱部署環境下刷新類加載器)。

設計器中註冊

  1. 打開「服務器」→「函數管理器」。
  2. 點擊「新增」,選擇剛部署的 com.fr.function.StringCat 類。
  3. 設定函數顯示名稱 (如 StringCat)、分類、描述 (如「將所有參數以字符串形式拼接」)。
  4. 確定保存。

報表中使用

  1. 新建報表,定義兩個參數:para1 (字符串)、para2 (整數)。
  2. 在任意單元格輸入公式:=StringCat($para1, $para2) (參數前加 $ 引用)。
  3. 分頁預覽,填入 para1=FineReport、para2=123,查詢結果顯示 FineReport123。

進階技巧

  • 型別轉換:利用 FunctionHelper.parsePrimitiveDouble、FunctionHelper.toBigDecimal 統一返回型別。
  • 陣列參數:參數若為 FArray,可遍歷 elementAt(i) 處理集合運算。
  • 異常處理:捕獲運算異常,返回 null 或拋出 FunctionException 讓前端提示友好錯誤。
  • 效能:避免在 run 中做重 IO/資料庫操作;若需緩存,用靜態變量配合軟引用。

常見問題

總結

FineReport 自定義函數機制靈活強大,掌握「實現 Function → 編譯部署 → 設計器註冊 → 報表引用」四步驟,即可將業務專用邏輯封裝為可複用的報表函數,大幅提升報表開發效率與表達能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因解決
函數不顯示在列表類路徑錯誤、未重啟、包名不匹配檢查 WEB-INF/classes 目錄結構、重啟應用
報表提示「函數未定義」函數管理器未註冊或名稱不一致重新註冊、確認函數名拼寫
參數傳遞異常參數類型與預期不符 (如傳入 FArray 但代碼按標量處理)在 run 開頭打印 args 類型、加入 instanceof 判斷