Utilizzo della funzione ICustomFunction

Creazione e valutazione di una funzione definita dall’utente

Questo articolo illustra l’implementazione dell’interfaccia ICustomFunction per scrivere una funzione personalizzata e utilizzarla nel foglio di calcolo per ottenere i risultati. Definiremo una funzione personalizzata con il nome MyFunc che accetterà 2 parametri con i seguenti dettagli.

  • Il primo parametro si riferisce a una singola cella
  • Il secondo parametro si riferisce a un intervallo di celle

La funzione personalizzata sommerà tutti i valori dell’intervallo di celle specificato come secondo parametro e dividerà il risultato per il valore nel primo parametro.

Ecco come abbiamo implementato il metodo CalculateCustomFunction.

Ecco come utilizzare la funzione appena definita in un foglio di calcolo

Panoramica

Le API di Aspose.Cells inseriscono semplicemente l’oggetto ReferredArea nel “paramsList” quando il parametro corrispondente è un riferimento o il suo risultato calcolato è un riferimento. Se è necessario il riferimento stesso, è possibile utilizzare direttamente ReferredArea. Se è necessario ottenere il valore di una singola cella dal riferimento corrispondente alla posizione della formula, è possibile utilizzare il metodo ReferredArea.GetValue(rowOffset, colOffset). Se è necessario un array di valori delle celle per l’intera area, è possibile utilizzare il metodo ReferredArea.GetValues.

Poiché le API di Aspose.Cells restituiscono ReferredArea in “paramsList”, la ReferredAreaCollection in “contextObjects” non sarà più necessaria (nelle vecchie versioni non era sempre in grado di dare una mappatura uno a uno ai parametri della funzione personalizzata) pertanto è stata rimossa da “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...

    ...

}