Rilevamento del riferimento circolare

introduzione

Le cartelle di lavoro possono avere riferimenti circolari e talvolta è necessario rilevare se i riferimenti circolari sono presenti o meno.

Concetto alla base del rilevamento del riferimento circolare

riferimenti circolari possono essere rilevati solo quando la formula viene calcolata perché i riferimenti di una formula dipendono comunemente dal risultato calcolato di altre parti o altre formule. Quindi forniamo nuove API per questo requisito (per raccogliere celle con riferimenti circolari) nel processo di calcolo della formula:

CalcoloCell: Rappresenta il calcolo dei dati rilevanti su una cella calcolata

AbstractCalculationMonitor.OnCircular(IEnumerator circularCellsData): verrà richiamato dal motore di calcolo della formula quando incontra riferimenti circolari, l’elemento nell’enumeratore èCalcoloCell oggetti che rappresentano tutte le celle in un cerchio. Il valore restituito indica se il motore delle formule deve calcolare tali celle in forma circolare dopo questa chiamata.

L’utente può raccogliere tali riferimenti circolari nell’attuazione diAbstractCalculationMonitor.OnCircular() metodo.

Il file di esempio sorgente può essere scaricato dal seguente link:

Formule circolari.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);

Definizione diMonitor circolare classe da cui derivaAbstractCalculationMonitor classe è la seguente:

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