[]
扩展此类并重写 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();
nameprotected AsyncCustomFunction(String name,
FunctionValueType result) protected AsyncCustomFunction(String name,
FunctionValueType result,
Parameter[] parameters) protected AsyncCustomFunction(String name,
String description,
FunctionValueType result,
Parameter[] parameters) final Objectevaluate(Object[] arguments,
ICalcContext context) protected abstract CompletableFuture<Object>evaluateAsync(Object[] arguments,
ICalcContext context) getAcceptErrors, getIsVolatile, setAcceptErrors, setIsVolatilename - 自定义函数的名称。result - 指定自定义函数的返回类型。name - 自定义函数的名称。result - 指定自定义函数的返回类型。parameters - 指定自定义函数的参数。IllegalArgumentException - 如果任一参数是引用,则抛出该异常。name - 自定义函数的名称。不能为空,也不能为 null。description - 自定义函数的描述。可以为 null。result - 指定自定义函数的返回类型。parameters - 指定自定义函数的参数。可以为 null。IllegalArgumentException - 如果任一参数是引用,则抛出该异常。不要直接调用此方法。对于 AsyncCustomFunction,结果由 evaluateAsync(Object[],ICalcContext) 生成。
evaluate in class CustomFunctionarguments - 参数值的集合context - 计算上下文。null。
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();
arguments - 函数参数的值集合context - 计算的上下文