迭代计算

迭代计算(也称为循环引用)可以通过使用先前的结果反复运行来帮助找到某些计算的解决方案。 您还可以使用 CalcEngine.goalSeek 函数执行假设分析,该函数在SpreadJS中使用迭代计算。

尝试在下面更改最大迭代次数和最大更改,然后单击重新计算以查看A1更改中的值。

用户可以在工作簿选项上启用/禁用迭代计算。 当禁用迭代计算时,所有具有循环引用的单元格的值将为0,同时引用它们的其他单元格的值也将为0。 当启用迭代计算时,所有的循环引用将进行迭代计算,直到所有值的变化小于iterativeCalculationMaximumChange或迭代次数为iterativeCalculationMaximumIterations为止。 API如下: iterativeCalculation:启用或禁用迭代计算 iterativeCalculationMaximumIterations:迭代计算时的最大迭代次数,默认为1000,取值范围为1〜32767 iterativeCalculationMaximumChange:迭代计算时的最大变化,默认为0.01,取值范围为0〜1.79769313486232e308 为 Events.UserFormulaEntered添加了isCircularReference属性,如果用户输入了循环引用,则为true。 例如: 您可以通过函数getCircularReference获取工作簿中的所有循环引用的单元格信息。 例如:
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(_getElementById("ss")); initSpread(spread); }; function initSpread(spread) { var sheet = spread.getActiveSheet(); spread.suspendPaint(); spread.suspendCalcService(); sheet.setColumnWidth(1, 130); sheet.setColumnWidth(2, 120); sheet.getCell(2, 3).foreColor("blue"); sheet.getCell(6, 3).foreColor("blue"); sheet.getCell(10, 3).foreColor("blue").formatter("0.0%"); sheet.getRange(2, 3, 7, 1).formatter("0.0"); sheet.setFormula(0, 0, '=A1+1'); sheet.setValue(2, 2, "Cash Revenue"); sheet.setValue(3, 2, "Interest Expense"); sheet.setValue(4, 2, "Cash Profit"); sheet.setValue(6, 2, "Beginning Debt"); sheet.setValue(7, 2, "Ending Debt"); sheet.setValue(8, 2, "Average Debt"); sheet.setValue(10, 2, "Interest"); sheet.setValue(2, 3, 100); sheet.setFormula(3, 3, '=D11*D9'); sheet.setFormula(4, 3, '=D3-D4'); sheet.setValue(6, 3, 150); sheet.setFormula(7, 3, '=D7-D5'); sheet.setFormula(8, 3, '=AVERAGE(D7:D8)'); sheet.setValue(10, 3, 0.05); sheet.setFormula(3, 4, '=FORMULATEXT(D4)'); sheet.setFormula(4, 4, '=FORMULATEXT(D5)'); sheet.setFormula(7, 4, '=FORMULATEXT(D8)'); sheet.setFormula(8, 4, '=FORMULATEXT(D9)'); sheet.setValue(16, 1, "Use the Leibniz formula to approximate π") sheet.setValue(17, 1, "n: 1→∞") sheet.setValue(18, 1, {"richText":[{"text":"Pn: 4*(-1)"},{"style":{"vertAlign":1},"text":"n+1"},{"text":"/(2n-1)"}],"text":"Pn=4*(-1)n+1/(2n-1)"}); sheet.setValue(19, 1, "π: P1+P2+P3+...+Pn") sheet.setFormula(19, 2, '=IFERROR(C19,0)+C20'); sheet.setFormula(18, 2, '=IF(C18<1,0,4/(2*C18-1)*POWER(-1,C18+1))'); sheet.setFormula(17, 2, '=C18+1'); // set the n in the last to make sure that added from n=1 spread.resumeCalcService(); spread.resumePaint(); bindEvent(spread); } function bindEvent (spread) { _getElementById("IterativeCalculation").addEventListener('change', function () { spread.options.iterativeCalculation = this.checked; }); _getElementById("MaximumIterations").addEventListener('change', function () { spread.options.iterativeCalculationMaximumIterations = this.value; }); _getElementById("MaximumChange").addEventListener('change', function () { spread.options.iterativeCalculationMaximumChange = this.value; }); _getElementById("RecalcAll").addEventListener('click', function () { spread.getActiveSheet().recalcAll(true); }); } function _getElementById(id) { return document.getElementById(id); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="spreadjs culture" content="zh-cn" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/zh/purejs/node_modules/@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity/spread-sheets-resources-zh/dist/gc.spread.sheets.resources.zh.min.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> <div class="options-container"> <div class="option-row"> <input style="width: 20px;float: left;" type="checkbox" id="IterativeCalculation" checked="checked"/> <label for="IterativeCalculation">Iterative Calculation</label> </div> <div class="option-row"> <label for="MaximumIterations">Maximum Iterations:</label> <input type="number" id="MaximumIterations" value="1000"> </div> <div class="option-row"> <label for="MaximumChange">Maximum Change:</label> <input type="number" id="MaximumChange" value="0.01"> </div> <div class="option-row"> <button id="RecalcAll">Recalculate</button> </div> </div> </div></body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; padding: 5px; margin-top: 10px; } input { margin-bottom: 5px; padding: 2px 4px; width: 100%; box-sizing: border-box; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }