Usando la función ICustomFunction

Creación y evaluación de una función definida por el usuario

Este artículo demuestra la implementación de la interfaz ICustomFunction para escribir una función personalizada y usarla en la hoja de cálculo para obtener los resultados. Definiremos una función personalizada llamada MyFunc que aceptará 2 parámetros con los detalles siguientes.

  • El primer parámetro se refiere a una sola celda
  • El segundo parámetro se refiere a un rango de celdas

La función personalizada sumará todos los valores del rango de celdas especificado como segundo parámetro y dividirá el resultado por el valor del primer parámetro.

Así es como hemos implementado el método CalculateCustomFunction.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
public class CustomFunction : ICustomFunction
{
public object CalculateCustomFunction(string functionName, System.Collections.ArrayList paramsList, System.Collections.ArrayList contextObjects)
{
decimal total = 0M;
try
{
// Get value of first parameter
decimal firstParamB1 = System.Convert.ToDecimal(paramsList[0]);
// Get value of second parameter
Array secondParamC1C5 = (Array)(paramsList[1]);
// get every item value of second parameter
foreach (object[] value in secondParamC1C5)
{
total += System.Convert.ToDecimal(value[0]);
}
total = total / firstParamB1;
}
catch
{
}
// Return result of the function
return total;
}
}

Así es como se utiliza la función recién definida en una hoja de cálculo

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
// Open the workbook
Workbook workbook = new Workbook();
// Obtaining the reference of the first worksheet
Worksheet worksheet = workbook.Worksheets[0];
// Adding sample values to cells
worksheet.Cells["B1"].PutValue(5);
worksheet.Cells["C1"].PutValue(100);
worksheet.Cells["C2"].PutValue(150);
worksheet.Cells["C3"].PutValue(60);
worksheet.Cells["C4"].PutValue(32);
worksheet.Cells["C5"].PutValue(62);
// Adding custom formula to Cell A1
workbook.Worksheets[0].Cells["A1"].Formula = "=MyFunc(B1,C1:C5)";
// Calcualting Formulas
workbook.CalculateFormula(false, new CustomFunction());
// Assign resultant value to Cell A1
workbook.Worksheets[0].Cells["A1"].PutValue(workbook.Worksheets[0].Cells["A1"].Value);
// Save the file
workbook.Save(dataDir + "UsingICustomFunction_out.xls");

Visión general

Las API de Aspose.Cells simplemente colocan el objeto ReferredArea en la “paramsList” cuando el parámetro correspondiente es una referencia o su resultado calculado es una referencia. Si necesita la referencia en sí, puede usar directamente ReferredArea. Si necesita obtener el valor de una sola celda de la referencia correspondiente con la posición de la fórmula, puede usar el método ReferredArea.GetValue(filaOffset, int colOffset). Si necesita un array de valores de celda para toda el área, entonces puede usar ReferredArea.GetValues método.

Como las API de Aspose.Cells dan ReferredArea en “paramsList”, la ReferredAreaCollection en “contextObjects” ya no será necesaria (en las versiones antiguas no siempre podía dar un mapeo uno a uno a los parámetros de la función personalizada) por lo tanto se ha eliminado de los “contextObjects”.

 public object CalculateCustomFunction(string functionName, ArrayList paramsList, ArrayList contextObjects)

{

    ...

    object o = paramsList[i];

    if(o is ReferredArea) //fetch data from reference

    {

        ReferredArea ra = (ReferredArea)o;

        if(ra.IsArea)

        {

            o = ra.GetValues();

        }

        else

        {

            o = ra.GetValue(0, 0);

        }

    }

    if (o is Array)

    {

        ...

    }

    else if...

    ...

}