Verwendung der ICustomFunction Funktion

Erstellen und Auswerten einer benutzerdefinierten Funktion

Dieser Artikel demonstriert die Implementierung der ICustomFunction-Schnittstelle, um eine benutzerdefinierte Funktion zu schreiben und sie in der Tabellenkalkulation zu verwenden, um die Ergebnisse zu erhalten. Wir definieren eine benutzerdefinierte Funktion namens MyFunc, die 2 Parameter mit folgenden Details akzeptiert.

  • Der erste Parameter bezieht sich auf eine einzelne Zelle
  • Der zweite Parameter bezieht sich auf einen Zellenbereich

Die benutzerdefinierte Funktion wird alle Werte aus dem als 2. Parameter angegebenen Zellbereich addieren und das Ergebnis durch den Wert im 1. Parameter dividieren.

Hier ist, wie wir die Methode CalculateCustomFunction implementiert haben.

// 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;
}
}

So verwenden Sie die neu definierte Funktion in einer Tabellenkalkulation

// 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");

Übersicht

Die Aspose.Cells-APIs legen den ReferredArea-Objekt in die “paramsList”, wenn der entsprechende Parameter eine Referenz ist oder sein berechnetes Ergebnis eine Referenz ist. Wenn Sie die Referenz selbst benötigen, können Sie direkt die ReferredArea verwenden. Wenn Sie den Wert einer einzelnen Zelle aus der Referenz benötigen, die der Position der Formel entspricht, können Sie die Methode ReferredArea.GetValue(rowOffset, int colOffset) verwenden. Wenn Sie die Zellwerte für den gesamten Bereich benötigen, können Sie die Methode ReferredArea.GetValues verwenden.

Da die Aspose.Cells-APIs die ReferredArea in “paramsList” erhalten, wird die ReferredAreaCollection in “contextObjects” nicht mehr benötigt (in älteren Versionen konnte sie nicht immer eine eins-zu-eins-Mapping zu den Parametern der benutzerdefinierten Funktion erstellen), daher wurde sie aus den “contextObjects” entfernt.

 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...

    ...

}