Использование функции 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(); |