Utilisation de la fonctionnalité ICustomFunction

Création et évaluation d’une fonction définie par l’utilisateur

Cet article montre l’implémentation de l’interface ICustomFunction pour écrire une fonction personnalisée et l’utiliser dans la feuille de calcul pour obtenir les résultats. Nous définirons une fonction personnalisée par son nomMaFonction qui acceptera 2 paramètres avec les détails suivants.

  • Le 1er paramètre fait référence à une seule cellule
  • Le 2ème paramètre fait référence à une plage de cellules

La fonction personnalisée ajoutera toutes les valeurs de la plage de cellules spécifiée comme 2ème paramètre et divisera le résultat avec la valeur du 1er paramètre.

Voici comment nous avons implémenté la méthode CalculateCustomFunction.

Voici comment utiliser la fonction nouvellement définie dans une feuille de calcul

Aperçu

Les API Aspose.Cells placent simplement l’objet ReferredArea dans la “paramsList” lorsque le paramètre correspondant est une référence ou que son résultat calculé est une référence. Si vous avez besoin de la référence elle-même, vous pouvez utiliser directement ReferredArea. Si vous avez besoin d’obtenir la valeur d’une seule cellule à partir de la référence correspondant à la position de la formule, vous pouvez utiliser la méthode ReferredArea.GetValue(rowOffset, int colOffset). Si vous avez besoin d’un tableau de valeurs de cellules pour toute la zone, vous pouvez utiliser la méthode ReferredArea.GetValues.

Comme les API Aspose.Cells donnent la ReferredArea dans “paramsList”, la ReferredAreaCollection dans “contextObjects” ne sera plus nécessaire (dans les anciennes versions, il n’était pas toujours possible de donner une carte un à un aux paramètres de la fonction personnalisée), donc il a été supprimé des “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...

    ...

}