Verwendung der AbstractCalculationEngine Funktion

Einführung

Dieser Artikel bietet ein Verständnis dafür, wie Sie die AbstractCalculationEngine Funktion verwenden können, um benutzerdefinierte Funktionen mit den Aspose.Cells APIs zu implementieren.

Die AbstractCalculationEngine-Schnittstelle ermöglicht es Ihnen, benutzerdefinierte Formelberechnungsfunktionen hinzuzufügen, um den Aspose.Cells-Kernberechnungsmotor zu erweitern, um bestimmte Anforderungen zu erfüllen. Diese Funktion ist nützlich, um benutzerdefinierte Funktionen in einer Vorlagendatei oder in einem Code zu definieren, in dem die benutzerdefinierte Funktion mit Aspose.Cells APIs implementiert und bewertet werden kann, wie eine andere Standard-Microsoft Excel-Funktion.

Verwendung der AbstractCalculationEngine-Funktion - 1

Der folgende Beispielcode implementiert die AbstractCalculationEngine-Schnittstelle, die die Werte der beiden benutzerdefinierten Funktionen MySampleFunc() und YourSampleFunc() bewertet und zurückgibt. Diese benutzerdefinierten Funktionen sind in den Zellen A1 und A2 enthalten. Dann ruft es die Workbook.CalculateFormula(const CalculationOptions& options) Methode auf, um die Implementierung der AbstractCalculationEngine .Calculate(CalculationData& data) Methode aufzurufen. Dann druckt es die Werte von A1 und A2 auf der Konsole aus. Bitte beachten Sie die Konsolenausgabe des Beispielcodes unten für mehr Hilfe.

Beispielcode

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

Konsolenausgabe

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

Verwendung der AbstractCalculationEngine-Funktion - 2

Der folgende Beispielcode liest eine benutzerdefinierte Funktion aus einer Beispiel-Datei und ruft die Methode Workbook.CalculateFormula(const CalculationOptions& options) auf, um die Methode AbstractCalculationEngine .Calculate(CalculationData& data) für die weitere Verarbeitung aufzurufen.

Beispiel-Datei: sample-file.xlsx

Beispielcode

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