[]
        
首页
开发者学堂
文档
论坛
市场
生态机会
活动
立即试用
(Showing Draft Content)

CustomFunction

Class CustomFunction

java.lang.Object
com.grapecity.documents.excel.CustomFunction
Direct Known Subclasses:
AsyncCustomFunction

public abstract class CustomFunction extends Object
表示自定义函数的基类型。

从此抽象类派生可定义在 GcExcel 中行为类似内置公式函数的电子表格函数。自定义函数通过其中一个 CustomFunction 构造函数提供其函数名称、返回类型和可选参数元数据,并且必须实现 evaluate(Object[],ICalcContext) 以计算结果。

创建派生函数后,请先使用 Workbook.AddCustomFunction(CustomFunction) 或 Workbook.AddCustomFunction(CustomFunction,boolean) 注册它,然后再在公式中使用。

可以配置自定义函数以参与计算缓存和错误传播。使用 setIsVolatile(boolean) 控制使用相同参数重复调用时是否可重用缓存结果,并使用 setAcceptErrors(boolean) 控制是否将 #N/A 或 #VALUE! 等错误值传递给函数处理。默认情况下,自定义函数不是易失性的,也不接受错误参数。

此类型是同步自定义函数基类。对于异步求值场景,请使用 AsyncCustomFunction。


 CustomFunction function = new CustomFunction(
     "ADD2",
     FunctionValueType.Number,
     new Parameter[] {
         new Parameter(FunctionValueType.Number),
         new Parameter(FunctionValueType.Number)
     }) {
     public Object evaluate(Object[] arguments, ICalcContext context) {
         double left = ((Number) arguments[0]).doubleValue();
         double right = ((Number) arguments[1]).doubleValue();
         return left + right;
     }
 };
 Workbook.AddCustomFunction(function);
 worksheet.getRange("A1").setFormula("=ADD2(10,20)");
 Object sum = worksheet.getRange("A1").getValue();
 
  • Field Details

  • Constructor Details

    • CustomFunction

      public CustomFunction(String name, FunctionValueType result)
      初始化自定义函数的实例。
      Parameters:
      name - 自定义函数的名称。
      result - 指定自定义函数的返回类型。
    • CustomFunction

      public CustomFunction(String name, FunctionValueType result, Parameter[] parameters)
      初始化自定义函数的实例。

      此构造函数将 null 作为描述传递给 CustomFunction(String,String,FunctionValueType,Parameter[])。

      Parameters:
      name - 自定义函数的名称。不得为 null 或空。
      result - 指定自定义函数的返回类型。
      parameters - 指定自定义函数的参数。可以为 null。
      Throws:
      IllegalArgumentException - 如果 name 为 null 或空。
    • CustomFunction

      public CustomFunction(String name, String description, FunctionValueType result, Parameter[] parameters)
      初始化自定义函数的实例。
      Parameters:
      name - 自定义函数的名称。
      description - 自定义函数的描述。
      result - 指定自定义函数的返回类型。
      parameters - 指定自定义函数的参数。
  • Method Details

    • setAcceptErrors

      public void setAcceptErrors(boolean acceptErrors)
      设置函数是否接受错误值作为参数。

      如果此属性设置为 true,则 #N/A 和 #VALUE! 等错误值可以传递给 evaluate(Object[],ICalcContext) 进行自定义处理。如果设置为 false,则计算引擎会立即返回错误,而不是将错误参数传递给自定义函数。

      
       CustomFunction function = new CustomFunction(
           "HANDLEERROR",
           FunctionValueType.Text,
           new Parameter[] { new Parameter(FunctionValueType.Object) }) {
           {
               setAcceptErrors(true);
           }
       
           public Object evaluate(Object[] arguments, ICalcContext context) {
               return arguments[0] instanceof CalcError ? "Handled error" : arguments[0];
           }
       };
       Workbook.AddCustomFunction(function, true);
       worksheet.getRange("A1").setFormula("=HANDLEERROR(1/0)");
       Object result = worksheet.getRange("A1").getValue();
       
      Parameters:
      acceptErrors - 如果错误值会作为参数传递给自定义函数,则为 true;如果错误参数会导致计算立即返回该错误,则为 false。
    • getAcceptErrors

      public boolean getAcceptErrors()
      获取函数是否接受错误值作为参数。

      如果此属性返回 true,则 #N/A 和 #VALUE! 等错误值可以传递给 evaluate(Object[],ICalcContext) 进行自定义处理。如果返回 false,则计算引擎会立即返回错误,而不是将错误参数传递给自定义函数。

      
       CustomFunction function = new CustomFunction(
           "HANDLEERROR",
           FunctionValueType.Text,
           new Parameter[] { new Parameter(FunctionValueType.Object) }) {
           {
               setAcceptErrors(true);
           }
       
           public Object evaluate(Object[] arguments, ICalcContext context) {
               return arguments[0] instanceof CalcError ? "Handled error" : arguments[0];
           }
       };
       boolean acceptErrors = function.getAcceptErrors();
       Workbook.AddCustomFunction(function, true);
       worksheet.getRange("A1").setFormula("=HANDLEERROR(1/0)");
       Object result = worksheet.getRange("A1").getValue();
       
      Returns:
      如果错误值会作为参数传递给自定义函数,则为 true;如果错误参数会导致计算立即返回该错误,则为 false。
    • getIsVolatile

      public boolean getIsVolatile()
      获取此自定义函数是否为易失性函数。

      如果此属性返回 true,则每次触发计算时都会重新计算调用此自定义函数的公式,即使参数未更改也是如此。如果返回 false,则对于使用相同参数的重复调用,计算可以重用缓存结果。

      
       CustomFunction function = new CustomFunction("NEXTVALUE", FunctionValueType.Number) {
           private int calculationCount;
           {
               setIsVolatile(true);
           }
       
           public Object evaluate(Object[] arguments, ICalcContext context) {
               return (double) ++calculationCount;
           }
       };
       boolean isVolatile = function.getIsVolatile();
       Workbook.AddCustomFunction(function, true);
       worksheet.getRange("A1").setFormula("=NEXTVALUE()");
       Object firstValue = worksheet.getRange("A1").getValue();
       worksheet.getRange("A2").setValue("trigger recalculation");
       workbook.calculate();
       Object recalculatedValue = worksheet.getRange("A1").getValue();
       
      Returns:
      如果此自定义函数为易失性函数,则为 true,否则为 false。
    • setIsVolatile

      public void setIsVolatile(boolean aVolatile)
      设置此自定义函数是否为易失性函数。

      默认情况下,使用相同参数重复求值时,自定义函数可以重用缓存的计算结果。将此属性设置为 true 可强制函数在每次公式求值时重新计算,而不是重用缓存结果。将其设置为 false 可允许重用缓存结果。

      使用 getIsVolatile() 获取当前设置。

      
       CustomFunction function = new CustomFunction("NEXTVALUE", FunctionValueType.Number) {
           private int calculationCount;
           {
               setIsVolatile(true);
           }
       
           public Object evaluate(Object[] arguments, ICalcContext context) {
               return (double) ++calculationCount;
           }
       };
       Workbook.AddCustomFunction(function, true);
       worksheet.getRange("A1").setFormula("=NEXTVALUE()");
       Object firstValue = worksheet.getRange("A1").getValue();
       worksheet.getRange("A2").setValue("trigger recalculation");
       workbook.calculate();
       Object recalculatedValue = worksheet.getRange("A1").getValue();
       
      Parameters:
      aVolatile - true 表示将自定义函数标记为易失性函数,使其每次求值时都重新计算;false 表示允许重用缓存结果。
    • evaluate

      public abstract Object evaluate(Object[] arguments, ICalcContext context)
      计算函数。
      
       CustomFunction function = new CustomFunction("DOUBLE", FunctionValueType.Number) {
           public Object evaluate(Object[] arguments, ICalcContext context) {
               return ((Number) arguments[0]).doubleValue() * 2;
           }
       };
       ICalcContext calcContext = new ICalcContext() {
           public IWorksheet getWorksheet() { return worksheet; }
           public int getRow() { return 0; }
           public int getColumn() { return 0; }
       };
       Object result = function.evaluate(new Object[] { 21d }, calcContext);
       
      Parameters:
      arguments - 参数的值集合
      context - 计算上下文。
      Returns:
      函数的结果。