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

AsyncCustomFunction

Class AsyncCustomFunction

java.lang.Object
com.grapecity.documents.excel.CustomFunction
com.grapecity.documents.excel.AsyncCustomFunction

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

扩展此类并重写 evaluateAsync(Object[],ICalcContext) 方法,以实现计算逻辑。函数注册后,公式即可调用该函数并返回结果。

参数不能接受单元格或区域引用。请使用计算后的值作为参数,并且不要在异步逻辑中访问工作簿模型对象,因为它可能会在其他线程上运行。


 class AsyncAddFunction extends AsyncCustomFunction {
     public AsyncAddFunction() {
         super("ASYNCADD", "Adds two numbers asynchronously.", FunctionValueType.Number,
             new Parameter[] {
                 new Parameter(FunctionValueType.Number),
                 new Parameter(FunctionValueType.Number)
             });
     }
 
     protected CompletableFuture<Object> evaluateAsync(Object[] arguments, ICalcContext context) {
         double left = ((Number) arguments[0]).doubleValue();
         double right = ((Number) arguments[1]).doubleValue();
         return CompletableFuture.completedFuture(left + right);
     }
 }
 
 AsyncCustomFunction function = new AsyncAddFunction();
 Workbook.AddCustomFunction(function);
 worksheet.getRange("A1").setFormula("=ASYNCADD(10,20)");
 Object sum = worksheet.getRange("A1").getValue();
 
  • Constructor Details

    • AsyncCustomFunction

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

      protected AsyncCustomFunction(String name, FunctionValueType result, Parameter[] parameters)
      初始化异步自定义函数的实例。
      Parameters:
      name - 自定义函数的名称。
      result - 指定自定义函数的返回类型。
      parameters - 指定自定义函数的参数。
      Throws:
      IllegalArgumentException - 如果任一参数是引用,则抛出该异常。
    • AsyncCustomFunction

      protected AsyncCustomFunction(String name, String description, FunctionValueType result, Parameter[] parameters)
      初始化异步自定义函数的实例。
      Parameters:
      name - 自定义函数的名称。不能为空,也不能为 null。
      description - 自定义函数的描述。可以为 null。
      result - 指定自定义函数的返回类型。
      parameters - 指定自定义函数的参数。可以为 null。
      Throws:
      IllegalArgumentException - 如果任一参数是引用,则抛出该异常。
  • Method Details

    • evaluate

      public final Object evaluate(Object[] arguments, ICalcContext context)
      计算该函数。

      不要直接调用此方法。对于 AsyncCustomFunction,结果由 evaluateAsync(Object[],ICalcContext) 生成。

      Specified by:
      evaluate in class CustomFunction
      Parameters:
      arguments - 参数值的集合
      context - 计算上下文。
      Returns:
      始终返回 null。
    • evaluateAsync

      protected abstract CompletableFuture<Object> evaluateAsync(Object[] arguments, ICalcContext context)
      计算函数异步执行。
      
       Workbook workbook = new Workbook();
       IWorksheet worksheet = workbook.getActiveSheet();
       AsyncCustomFunction function = new AsyncCustomFunction(
           "ASYNCADD_ASYNC",
           "Adds two numbers asynchronously.",
           FunctionValueType.Number,
           new Parameter[] {
               new Parameter(FunctionValueType.Number),
               new Parameter(FunctionValueType.Number)
           }) {
               protected CompletableFuture<Object> evaluateAsync(Object[] arguments, ICalcContext context) {
                   return CompletableFuture.supplyAsync(() -> {
                       try {
                           Thread.sleep(50);
                       } catch (InterruptedException exception) {
                           throw new RuntimeException(exception);
                       }
                       double left = ((Number) arguments[0]).doubleValue();
                       double right = ((Number) arguments[1]).doubleValue();
                       return left + right;
                   });
               }
       };
       Workbook.AddCustomFunction(function);
       worksheet.getRange("A1").setFormula("=ASYNCADD_ASYNC(10,20)");
       Object initialValue = worksheet.getRange("A1").getValue();
       workbook.calculate();
       workbook.waitForCalculationToFinish();
       Object finalValue = worksheet.getRange("A1").getValue();
       
      Parameters:
      arguments - 函数参数的值集合
      context - 计算的上下文
      Returns:
      函数的结果。