Usar la función AbstractCalculationEngine

Introducción

Este artículo proporciona una comprensión de cómo utilizar la función AbstractCalculationEngine para implementar funciones personalizadas con las API de Aspose.Cells.

La interfaz AbstractCalculationEngine le permite agregar funciones de cálculo de fórmulas personalizadas para extender el motor de cálculo principal de Aspose.Cells a fin de cumplir con ciertos requisitos. Esta característica es útil para definir funciones personalizadas (definidas por el usuario) en un archivo de plantilla o en un código donde la función personalizada puede implementarse y evaluarse utilizando las API de Aspose.Cells como cualquier otra función predeterminada de Microsoft Excel.

Uso de la función AbstractCalculationEngine - 1

El siguiente código de muestra implementa la interfaz AbstractCalculationEngine que evalúa y devuelve los valores de las dos funciones personalizadas, es decir, MySampleFunc() y YourSampleFunc(). Estas funciones personalizadas están dentro de las celdas A1 y A2 respectivamente. Luego, llama al método Workbook.CalculateFormula(const CalculationOptions& options) para invocar la implementación de la función AbstractCalculationEngine.Calculate(CalculationData& data). Luego, imprime los valores de A1 y A2 en la consola. Consulte la Salida de la consola del código de muestra a continuación para obtener más ayuda.

Código de muestra

Aspose::Cells::Startup();
//Implement AbstractCalculationEngine interface
class CustomFunction1 : public AbstractCalculationEngine
{
public:
void Calculate(CalculationData& data)
{
Object funcName = data.GetParamValue(0);
U16String cellName = data.GetCell().GetName();
Object cellValue = data.GetParamValue(1);
if (data.GetFunctionName() == u"MySampleFunc")
{
std::cout << funcName.ToString().ToUtf8() << " called successfully." << std::endl;
data.GetCell().PutValue(cellValue);
}
if (data.GetFunctionName() == u"YourSampleFunc")
{
std::cout << funcName.ToString().ToUtf8() << " called successfully." << std::endl;
data.GetCell().PutValue(cellValue);
}
}
};
//Create workbook
Workbook wb;
//Access first worksheet in the workbook
Worksheet ws = wb.GetWorksheets().Get(0);
//Adding custom formulas to Cell A1 and A2
ws.GetCells().Get(u"A1").SetFormula(u"=MySampleFunc(\"MySampleFunc-Test\",1)");
ws.GetCells().Get(u"A2").SetFormula(u"=YourSampleFunc(\"YourSampleFunc-Test\",2)");
// Calcualting Formulas
CustomFunction1 custFunc;
CalculationOptions options;
options.SetCustomEngine(&custFunc);
wb.CalculateFormula(options);
//Print the value of cell A1 and A2 after the calculation of custom function implemented by us.
U16String valA1 = ws.GetCells().Get(u"A1").GetStringValue();
U16String valA2 = ws.GetCells().Get(u"A2").GetStringValue();
std::cout << "Value of A1 is : " << valA1.ToUtf8() << std::endl;
std::cout << "Value of A2 is : " << valA2.ToUtf8() << std::endl;
Aspose::Cells::Cleanup();

Salida de la consola

MySampleFunc-Test called successfully.
YourSampleFunc-Test called successfully.
Value of A1 is : 1
Value of A2 is : 2

Uso de la función AbstractCalculationEngine - 2

El siguiente código de ejemplo lee una función personalizada de un archivo de ejemplo y llama al método Workbook.CalculateFormula(const CalculationOptions& options) para llamar al método AbstractCalculationEngine .Calculate(CalculationData& data) para procesamiento adicional.

Archivo de ejemplo: sample-file.xlsx

Código de muestra

Aspose::Cells::Startup();
//Implement AbstractCalculationEngine interface
class CustomFunction2 : public AbstractCalculationEngine
{
public:
int stage = 0;
public:
void Calculate(CalculationData& data)
{
if (stage == 0)
{
data.SetCalculatedValue(0);
return;
}
U16String s = data.GetFunctionName();
if (u"crow" == s)
{
data.SetCalculatedValue(data.GetParamValue(0));
}
else if (u"crow2" == s)
{
data.SetCalculatedValue(data.GetCellRow() + 1);
}
}
};
//Create workbook
Workbook wb(u"sample-file.xlsx");
Cells cells = wb.GetWorksheets().Get(0).GetCells();
Cells cells2 = wb.GetWorksheets().Get(1).GetCells();
U16String expectedValue = u"2";
if (expectedValue != cells.Get(u"B2").GetStringValue())
{
std::cout << "Start test: The value of cell B2 is not 2." << std::endl;
}
cells.Get(u"A2").PutValue(2);
cells.Get(u"A3").PutValue(3);
// Calcualting Formulas
CustomFunction2* resolver1 = new CustomFunction2();
resolver1->stage = 0;
CalculationOptions opt1;
opt1.SetCustomEngine(resolver1);
wb.CalculateFormula(opt1);
cells2.InsertRows(1, 9, true);
Range range = cells2.CreateRange(1, 0, 9, cells2.GetMaxColumn() + 1);
Range source = cells2.CreateRange(0, 0, 1, cells2.GetMaxColumn() + 1);
PasteOptions options;
options.SetPasteType(PasteType::All);
range.Copy(source, options);
// Calcualting Formulas
CustomFunction2* resolver2 = new CustomFunction2();
resolver2->stage = 1;
CalculationOptions opt2;
opt2.SetCustomEngine(resolver2);
wb.CalculateFormula(opt2);
if (expectedValue == cells.Get(u"B2").GetStringValue())
{
std::cout << "End test: The value of cell B2 is 2." << std::endl;
}
delete resolver1;
delete resolver2;
Aspose::Cells::Cleanup();