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