Использование функции AbstractCalculationEngine

Введение

Эта статья предоставляет понимание того, как использовать функцию AbstractCalculationEngine для реализации пользовательских функций с помощью API Aspose.Cells.

Интерфейс AbstractCalculationEngine позволяет добавлять пользовательские функции вычисления формул для расширения базового вычислительного движка Aspose.Cells, чтобы удовлетворить определенные требования. Эта функция полезна для определения пользовательских функций в файле шаблона или в коде, где пользовательская функция может быть реализована и оценена с использованием API Aspose.Cells, как любая другая функция для Microsoft Excel по умолчанию.

Использование функции AbstractCalculationEngine - 1

Следующий образец кода реализует интерфейс AbstractCalculationEngine, который вычисляет и возвращает значения двух пользовательских функций: MySampleFunc() и YourSampleFunc(). Эти пользовательские функции находятся в ячейках A1 и A2 соответственно. Затем он вызывает метод Workbook.CalculateFormula(const CalculationOptions& options) для вызова реализации функции AbstractCalculationEngine.Calculate(CalculationData& data). Затем он выводит значения A1 и A2 в консоль. Пожалуйста, обратитесь к выводу консоли образца кода ниже для получения более подробной справки.

Образец кода

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

Вывод в консоль

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

Использование функции AbstractCalculationEngine - 2

Следующий пример кода читает пользовательскую функцию из примерного файла и вызывает метод Workbook.CalculateFormula(const CalculationOptions& options), чтобы обратиться к AbstractCalculationEngine .Calculate(CalculationData& data) для дальнейшей обработки.

Пример файла: sample-file.xlsx

Образец кода

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