كشف الإشارة المرجعية الدائرية

مقدمة

يمكن أن تحتوي الدفاتر على إشارات مرجعية دائرية وأحيانًا هناك حاجة للكشف عما إذا كانت هناك إشارات مرجعية دائرية أم لا.

المفهوم الكامن وراء كشف الإشارة المرجعية الدائرية

يمكن فقط كشف الإشارات المرجعية الدائرية عند حساب الصيغة لأن الإشارات في صيغة واحدة تعتمد عادة على النتيجة المحسوبة لأجزاء أخرى أو صيغ أخرى. لذا نحن نوفر واجهات برمجة تطبيقات جديدة لهذا الاحتياج (لجمع الخلايا ذات الإشارات المرجعية الدائرية) في عملية حساب الصيغة:

CalculationCell: يمثل حساب البيانات ذات الصلة حول خلية تتم حسابها

AbstractCalculationMonitor.OnCircular(IEnumerator circularCellsData): سيتم استدعاؤها بواسطة محرك حساب الصيغ عند مواجهة الإشارات المرجعية، العنصر في عنصر التعداد هو CalculationCell كائنات تمثل جميع الخلايا في دائرة واحدة. القيمة المُرجَعة تُحدد ما إذا كان محرك الصيغ يحتاج إلى حساب تلك الخلايا في الدائرة بعد هذا الاستدعاء.

يمكن للمستخدم جمع تلك الإشارات المرجعية في تنفيذ الطريقة AbstractCalculationMonitor.OnCircular().

يمكن تحميل ملف العينة المصدر من الرابط التالي:

Circular Formulas.xls

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
LoadOptions LoadOptions = new LoadOptions();
Workbook objWB = new Workbook(sourceDir + "Circular Formulas.xls", LoadOptions);
objWB.Settings.FormulaSettings.EnableIterativeCalculation = true;
CalculationOptions copts = new CalculationOptions();
CircularMonitor cm = new CircularMonitor();
copts.CalculationMonitor = cm;
objWB.CalculateFormula(copts);
int lngCircularRef = cm.circulars.Count;
Console.WriteLine("Circular References found - " + lngCircularRef);

تعريف فئة CircularMonitor المشتقة من AbstractCalculationMonitor على النحو التالي:

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
public class CircularMonitor : AbstractCalculationMonitor
{
public ArrayList circulars = new ArrayList();
public ArrayList Circulars { get { return circulars; } }
public override bool OnCircular(IEnumerator circularCellsData)
{
CalculationCell cc = null;
ArrayList cur = new ArrayList();
while (circularCellsData.MoveNext())
{
cc = (CalculationCell)circularCellsData.Current;
cur.Add(cc.Worksheet.Name + "!" + CellsHelper.CellIndexToName(cc.CellRow, cc.CellColumn));
}
circulars.Add(cur);
return true;
}
}