Döngüsel Referansın Algılanması
Giriş
Çalışma kitaplarında döngüsel referanslar olabilir ve bazen döngüsel referansların olup olmadığını tespit etmeniz gerekebilir.
Döngüsel referansın tespiti arkasındaki kavram
Döngüsel referanslar yalnızca formül hesaplandığında algılanabilir çünkü bir formülün referansları genellikle diğer kısımların veya diğer formüllerin hesaplanmış sonucuna bağlıdır. Bu nedenle bu gereksinim için yeni API’lar sağlarız (döngüsel referanslara sahip hücreleri toplamak için):
CalculationCell: Hesaplanan bir hücrenin ilgili verilerinin hesaplanmasını temsil eder
AbstractCalculationMonitor.OnCircular(IEnumerator circularCellsData): döngüsel referans ile karşılaştığında formül hesaplama motoru tarafından çağrılacaktır, numaralandırıcıdaki elemanlar, bir dairedeki tüm hücreleri temsil eden CalculationCell nesnelerdir. Döngü sonrasındaki çağrıda formül motorunun bu hücreleri hesaplaması gerekip gerekmediğini belirttiğiniz değeri döndürür.
Kullanıcı, bu döngüsel referansları AbstractCalculationMonitor.OnCircular() yönteminin uygulanmasında toplayabilir.
Kaynak örnek dosyası aşağıdaki bağlantıdan indirilebilir:
LoadOptions LoadOptions = new LoadOptions(); | |
Workbook objWB = new Workbook(sourceDir + "Circular Formulas.xls", LoadOptions); | |
objWB.getSettings().getFormulaSettings().setEnableIterativeCalculation(true); | |
CalculationOptions copts = new CalculationOptions(); | |
CircularMonitor cm = new CircularMonitor(); | |
copts.setCalculationMonitor(cm); | |
objWB.calculateFormula(copts); | |
int lngCircularRef = cm.circulars.size(); | |
System.out.println("Circular References found - " + lngCircularRef); |
Aşağıdaki CircularMonitor sınıfının tanımı, AbstractCalculationMonitor sınıfından türetilmiştir:
public class CircularMonitor extends AbstractCalculationMonitor | |
{ | |
public ArrayList circulars = new ArrayList(); | |
public ArrayList getCirculars() { return circulars; } | |
public /*override*/ boolean onCircular(Iterator circularCellsData) | |
{ | |
CalculationCell cc = null; | |
ArrayList cur = new ArrayList(); | |
while (circularCellsData.hasNext()) | |
{ | |
cc = (CalculationCell)circularCellsData.next(); | |
cur.add(cc.getWorksheet().getName() + "!" + CellsHelper.cellIndexToName(cc.getCellRow(), cc.getCellColumn())); | |
} | |
circulars.add(cur); | |
return true; | |
} | |
} |