public abstract class AbstractCalculationEngine
extends java.lang.Object
Remarks
User should not modify any part of the Workbook directly in this implementation(except the calculated result of the custom function, which can be set by CalculationData.CalculatedValue property). Otherwise unexpected result or Exception may be caused. If user needs to change other data than calculated result in the implementation for some custom functions, for example, change cell's formula, style, ...etc., user should gather those data in this implementation and change them out of the scope of formula calculation.Example
class MyEngine extends AbstractCalculationEngine
{
public /*override*/ void calculate(CalculationData data)
{
String funcName = data.getFunctionName().toUpperCase();
if ("MYFUNC".equals(funcName))
{
//do calculation for MYFUNC here
int count = data.getParamCount();
Object res = null;
for (int i = 0; i <count; i++)
{
Object pv = data.getParamValue(i);
if (pv instanceof ReferredArea)
{
ReferredArea ra = (ReferredArea)pv;
pv = ra.getValue(0, 0);
}
//process the parameter here
//res = ...;
}
data.setCalculatedValue(res);
}
}
}
Workbook wb = new Workbook("custom_calc.xlsx");
CalculationOptions opts = new CalculationOptions();
opts.setCustomEngine(new MyEngine());
wb.calculateFormula(opts);
| Constructor and Description |
|---|
AbstractCalculationEngine() |
| Modifier and Type | Method and Description |
|---|---|
abstract void |
calculate(CalculationData data)
Calculates one function with given data.
|
boolean |
forceRecalculate(java.lang.String functionName)
Whether force given function to be recalculated always when calculating shared formulas.
|
boolean |
getProcessBuiltInFunctions()
Whether built-in functions that have been supported by the built-in engine
should be checked and processed by this implementation.
|
boolean |
isParamArrayModeRequired()
Indicates whether this engine needs the parameter to be calculated in array mode.
|
boolean |
isParamLiteralRequired()
Indicates whether this engine needs the literal text of parameter while doing calculation.
|
protected void |
skipCalculation()
Skips the calculation for the entire formula that references to the function currently under evaluation.
|
public abstract void calculate(CalculationData data)
Remarks
User should set the calculated value for given data for all functions(including excel native functions) that he wants to calculate by himself in this implementation.data - the required data to calculate function such as function name, parameters, ...etc.public boolean isParamLiteralRequired()
Remarks
If this custom calculation engine needs the parameter's literal text, more stacks will be required to cache the literal text for parameters and Calculate() method may be called recursively to calculate the parameter's value. Generally the literal text is not needed for calculating formulas and this property should be kept as false for most implementations to get better performance.public boolean isParamArrayModeRequired()
CalculationData.getParamValueInArrayMode(int,int,int) is required when calculating custom
functions and user has not updated the definition for them
(by Workbook.updateCustomFunctionDefinition(CustomFunctionDefinition)),
this property needs to be set as true.
Remarks
If this custom calculation engine needs the parameter to be calculated in array mode, more stacks will be required to cache the tree for parameters and Calculate() method may be called recursively to calculate the parameter's value. For performance consideration, please keep this property as the default value(false) if there is no special requirement.public boolean getProcessBuiltInFunctions()
Remarks
If user needs to change the calculation logic of some built-in functions, this property should be set as true. Otherwise please leave this property as false for performance consideration.public boolean forceRecalculate(java.lang.String functionName)
Remarks
For shared formulas, multiple cells share the same function. If the function's parameters keep same for those cells too, then generally this function needs to be calculated only once. So for performance consideration we only calculate such kind of function once too(calculate(CalculationData)
is called only once, instead of being called repeatedly for every cell).
However, for user's custom implementation, maybe the function, especially the custom function,
needs to be calculated differently for different cells.
If so, user needs to override this method to make it return true for the function.
And for calculate(CalculationData), the given CalculationData.getCalculatedValue()
may have been initialized with the cached value of previous calculation.functionName - name of the function. Generally it is custom function's name.
If getProcessBuiltInFunctions() is true, then built-in functions will also be checked here.protected void skipCalculation()
Remarks
This method can be invoked in the implementation ofcalculate(CalculationData)
to skip the calculation for the entire formula and the original value of the formula will be kept without change.See Also:
Aspose.Cells Documentation - the home page for the Aspose.Cells Product Documentation.
Aspose.Cells Support Forum - our preferred method of support.
We guarantee a prompt response to any inquiry!
© Aspose Pty Ltd 2003-2025. All Rights Reserved.