Använda funktionen AbstractCalculationEngine

Introduktion

Den här artikeln ger en förståelse för hur man använder funktionen AbstractCalculationEngine för att implementera anpassade funktioner med Aspose.Cells API:er.

Gränssnittet AbstractCalculationEngine gör det möjligt att lägga till anpassade formelberäkningsfunktioner för att utöka Aspose.Cells kärnberäkningsmotor för att uppfylla vissa krav. Denna funktion är användbar för att definiera anpassade (användardefinierade) funktioner i en mallfil eller i en kod där den anpassade funktionen kan implementeras och utvärderas med hjälp av Aspose.Cells API:er som vilken annan standard Microsoft Excel funktion som helst.

Användning av AbstractCalculationEngine-funktion - 1

Följande exempelkod implementerar gränssnittet AbstractCalculationEngine som utvärderar och returnerar värdena av de två anpassade funktionerna dvs. MySampleFunc() och YourSampleFunc(). Dessa anpassade funktioner finns inuti cellerna A1 och A2 respektive. Sedan kallar det Workbook.CalculateFormula(const CalculationOptions& options) metoden för att aktivera implementeringen av AbstractCalculationEngine .Calculate(CalculationData& data) metoden. Därefter skrivs värdena A1 och A2 ut på konsolen. Se Konsoloutputen från exempelkoden nedan för mer hjälp.

Exempelkod

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();

Konsoloutput

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

Användning av AbstractCalculationEngine-funktion - 2

Följande kalkylkod läser en anpassad funktion från en exempel fil och anropar Workbook.CalculateFormula(const CalculationOptions& options)-metoden för att anropa AbstractCalculationEngine .Calculate(CalculationData& data)-metoden för vidare bearbetning.

Exempelfil:sample-file.xlsx

Exempelkod

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();