Uso de la función ICustomFunction
Este artículo proporciona una comprensión detallada de cómo usar la función ICustomFunction para implementar funciones personalizadas con las API Aspose.Cells.
La interfaz ICustomFunction permite agregar funciones de cálculo de fórmulas personalizadas para ampliar el motor de cálculo central Aspose.Cells para cumplir con ciertos requisitos. Esta característica es útil para definir funciones personalizadas (definidas por el usuario) en un archivo de plantilla o en un código donde la función personalizada se puede implementar y evaluar utilizando las API Aspose.Cells como cualquier otra función de Excel predeterminada Microsoft.
Crear y evaluar 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 por nombreMiFunc que aceptará 2 parámetros con los siguientes detalles.
- 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 agregará todos los valores del rango de celdas especificado como segundo parámetro y dividirá el resultado con el valor en el 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; | |
} | |
} |
Aquí se explica cómo usar 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"); |
Descripción general
Las API Aspose.Cells simplemente colocan el objeto ReferedArea en “paramsList” cuando el parámetro correspondiente es una referencia o su resultado calculado es una referencia. Si necesita la referencia en sí, puede usar ReferedArea directamente. Si necesita obtener el valor de una sola celda de la referencia correspondiente a la posición de la fórmula, puede usar el método ReferedArea.GetValue(rowOffset, int colOffset). Si necesita una matriz de valores de celda para toda el área, puede usar el método ReferedArea.GetValues.
Como las API Aspose.Cells brindan el área referida en “paramsList”, la colección ReferredAreaCollection en “contextObjects” ya no será necesaria (en versiones anteriores, no siempre podía proporcionar un mapa uno a uno a los parámetros de la función personalizada), por lo tanto, ha sido 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...
...
}