ICustomFunction Özelliğini Kullanma
Bu makale, Aspose.Cells API’leri ile özel işlevleri uygulamak için ICustomFunction özelliğinin nasıl kullanılacağına ilişkin ayrıntılı bir anlayış sağlar.
ICustomFunction arabirimi, belirli gereksinimleri karşılamak amacıyla Aspose.Cells' çekirdek hesaplama motorunu genişletmek için özel formül hesaplama işlevleri eklemeye izin verir. Bu özellik, bir şablon dosyasında veya kodda özel (kullanıcı tanımlı) işlevleri tanımlamak için kullanışlıdır; burada özel işlev, diğer herhangi bir varsayılan Microsoft Excel işlevi gibi Aspose.Cells API’leri kullanılarak uygulanıp değerlendirilebilir.
Kullanıcı Tanımlı Bir İşlev Oluşturma ve Değerlendirme
Bu makale, sonuçları almak için özel bir işlev yazmak ve bunu elektronik tabloda kullanmak için ICustomFunction arabiriminin uygulanmasını gösterir. Ada göre özel bir işlev tanımlayacağızMyFunc aşağıdaki ayrıntılarla 2 parametreyi kabul edecek.
-
- parametre tek bir hücreyi ifade eder
-
- parametre, bir hücre aralığını ifade eder
Özel işlev, 2. parametre olarak belirtilen hücre aralığındaki tüm değerleri toplayacak ve sonucu 1. parametredeki değere bölecektir.
CalculateCustomFunction yöntemini şu şekilde uyguladık.
// 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; | |
} | |
} |
Yeni tanımlanmış işlevi bir elektronik tabloda nasıl kullanacağınız aşağıda açıklanmıştır
// 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"); |
genel bakış
Aspose.Cells API’leri, karşılık gelen parametre bir referans olduğunda veya hesaplanan sonucu referans olduğunda, ReferredArea nesnesini “paramsList” içine koyar. Referansın kendisine ihtiyacınız varsa, doğrudan ReferredArea’yı kullanabilirsiniz. Formülün konumuna karşılık gelen referanstan tek bir hücrenin değerini almanız gerekiyorsa, ReferredArea.GetValue(rowOffset, int colOffset) yöntemini kullanabilirsiniz. Tüm alan için hücre değerleri dizisine ihtiyacınız varsa o zaman ReferredArea.GetValues yöntemini kullanabilirsiniz.
Aspose.Cells API’leri “paramsList” içindeki ReferredArea’yı verdiğinden, “contextObjects” içindeki ReferredAreaCollection’a artık gerek kalmayacak (eski sürümlerde her zaman özel işlevin parametrelerine bire bir harita veremiyordu), bu nedenle “contextObjects"ten kaldırıldı.
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...
...
}