استخدام ميزة ICustomFunction
يوفر هذا المقال فهمًا مفصلًا لكيفية استخدام ميزة ICustomFunction لتنفيذ الوظائف المخصصة باستخدام واجهات برمجة التطبيقات (APIs) لـ Aspose.Cells.
تسمح واجهة ICustomFunction بإضافة وظائف حساب المعادلة المخصصة لتوسيع محرك الحساب الأساسي لـ Aspose.Cells من أجل تلبية متطلبات معينة. تُستخدم هذه الميزة لتعريف الوظائف المخصصة (تعريف المستخدم) في ملف نموذج أو في الكود حيث يمكن تنفيذ الوظيفة المخصصة وتقييمها باستخدام واجهات برمجة التطبيقات (APIs) لـ Aspose.Cells مثل أي وظيفة افتراضية أخرى في Microsoft Excel.
يرجى ملاحظة أن هذه الواجهة قد تم استبدالها بـ AbstractCalculationEngine وستُزال في المستقبل. بعض المقالات الفنية/الأمثلة حول الواجهة البرمجية الجديدة: هنا وهنا
إنشاء وتقييم وظيفة معرفة المستخدم
يُظهر هذا المقال تنفيذ واجهة ICustomFunction لكتابة وظيفة مخصصة واستخدامها في جدول البيانات للحصول على النتائج. سنقوم بتحديد وظيفة مخصصة بالاسم MyFunc التي ستقبل 2 معلمة بالتفاصيل التالية.
- يشير المعلم الأول إلى خلية واحدة
- يشير المعلم الثاني إلى مجموعة من الخلايا
سيقوم الدالة المخصصة بإضافة جميع القيم من نطاق الخلية المحدد كمعلم ثاني وتقسيم النتيجة على القيمة في المعلم الأول.
هنا كيف قمنا بتنفيذ طريقة 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; | |
} | |
} |
هنا كيفية استخدام الدالة المحددة حديثا في جدول بيانات
// 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"); |
نظرة عامة
تضع واجهات برمجة التطبيقات للخلايا Aspose.Cells كائن ReferredArea في “paramsList” عندما يكون المعلم المقابل مرجعًا أو نتاجه المحسوب هو مرجع. إذا كنت بحاجة إلى المرجع نفسه ثم يمكنك استخدام ReferredArea مباشرة. إذا كنت تحتاج إلى الحصول على قيمة خلية واحدة من المرجع المقابل مع وضع الصيغة، يمكنك استخدام طريقة ReferredArea.GetValue(rowOffset، int colOffset). إذا كنت بحاجة إلى مجموعة قيم الخلية للمنطقة بأكملها ثم يمكنك استخدام طريقة ReferredArea.GetValues.
نظرًا لأن واجهات برمجة التطبيقات Aspose.Cells تقدم ReferredArea في “paramsList”، فستكون مجموعة ReferredArea في “contextObjects” غير مطلوبة بعد الآن (في الإصدارات القديمة لم تكن دائمًا قادرة على تقديم خريطة واحد إلى واحد لمعلمات الدالة المخصصة) ولذلك تمت إزالتها من “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...
...
}