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

Вступление

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

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

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

В следующем примере кода реализован интерфейс ICustomFunction, который оценивает и возвращает значения двух пользовательских функций, т. е. MySampleFunc() и YourSampleFunc(). Эти пользовательские функции находятся внутри ячеек A1 и A2 соответственно. Затем он вызывает метод IWorkbook.CalculateFormula(false, ICustomFunction), чтобы вызвать реализацию метода ICustomFunction.CalculateCustomFunction(). Затем он выводит на консоль значения A1 и A2, которые на самом деле являются значениями, возвращаемыми функцией ICustomFunction.CalculateCustomFunction(). Дополнительные сведения см. в выводе примера кода на консоль ниже.

Образец кода

//For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-C
//Implement ICustomFunction interface
class CustomFunction : public ICustomFunction
{
public:
//Evalaute and return the values of your custom functions
intrusive_ptr<Aspose::Cells::System::Object>
CalculateCustomFunction(
intrusive_ptr<Aspose::Cells::System::String> functionName,
intrusive_ptr<Aspose::Cells::System::Collections::ArrayList> paramsList,
intrusive_ptr<Aspose::Cells::System::Collections::ArrayList> contextObjects)
{
if (functionName->Equals(new String("MySampleFunc")))
{
return new String("MY sample function was called successfully.");
}
if (functionName->Equals(new String("YourSampleFunc")))
{
return new String("YOUR sample function was called successfully.");
}
return NULL;
}
};
//Using ICustomFunction Feature
void UsingICustomFunctionFeature()
{
//Create workbook
intrusive_ptr<IWorkbook> wb = Factory::CreateIWorkbook();
//Access first worksheet in the workbook
intrusive_ptr<IWorksheet> ws = wb->GetIWorksheets()->GetObjectByIndex(0);
//Adding custom formulas to Cell A1 and A2
ws->GetICells()->GetObjectByIndex(new String("A1"))->SetFormula(new String("=MySampleFunc()"));
ws->GetICells()->GetObjectByIndex(new String("A2"))->SetFormula(new String("=YourSampleFunc()"));
// Calcualting Formulas
intrusive_ptr<CustomFunction> custFunc = new CustomFunction();
wb->CalculateFormula(false, custFunc);
//Print the value of cell A1 and A2 after the calculation of custom function implemented by us.
intrusive_ptr<String> valA1 = ws->GetICells()->GetObjectByIndex(new String("A1"))->GetStringValue();
intrusive_ptr<String> valA2 = ws->GetICells()->GetObjectByIndex(new String("A2"))->GetStringValue();
//Print the values on console
StringPtr str1 = new String("Value of A1: ");
Console::WriteLine(str1->StringAppend(valA1));
StringPtr str2 = new String("Value of A2: ");
Console::WriteLine(str2->StringAppend(valA2));
}

Консольный вывод

 Value of A1: MY sample function was called successfully.

Value of A2: YOUR sample function was called successfully.