[]
AsyncCustomFunction从此抽象类派生可定义在 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();
CustomFunction(String name,
FunctionValueType result) CustomFunction(String name,
FunctionValueType result,
Parameter[] parameters) CustomFunction(String name,
String description,
FunctionValueType result,
Parameter[] parameters) abstract Objectevaluate(Object[] arguments,
ICalcContext context) booleanbooleanvoidsetAcceptErrors(boolean acceptErrors) voidsetIsVolatile(boolean aVolatile) name - 自定义函数的名称。result - 指定自定义函数的返回类型。此构造函数将 null 作为描述传递给 CustomFunction(String,String,FunctionValueType,Parameter[])。
name - 自定义函数的名称。不得为 null 或空。result - 指定自定义函数的返回类型。parameters - 指定自定义函数的参数。可以为 null。IllegalArgumentException - 如果 name 为 null 或空。name - 自定义函数的名称。description - 自定义函数的描述。result - 指定自定义函数的返回类型。parameters - 指定自定义函数的参数。如果此属性设置为 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();
acceptErrors - 如果错误值会作为参数传递给自定义函数,则为 true;如果错误参数会导致计算立即返回该错误,则为 false。如果此属性返回 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();
true;如果错误参数会导致计算立即返回该错误,则为 false。如果此属性返回 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();
true,否则为 false。默认情况下,使用相同参数重复求值时,自定义函数可以重用缓存的计算结果。将此属性设置为 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();
aVolatile - true 表示将自定义函数标记为易失性函数,使其每次求值时都重新计算;false 表示允许重用缓存结果。
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);
arguments - 参数的值集合context - 计算上下文。