您好!SpreadJS不支持模拟运算分析,不过可以参考Microsoft Excel中模拟运算分析功能的操作步骤自定义实现。
如下动图所示,用以模拟运算分析的单元格区域为A6:B10,其中单元格A7:A10为在模拟计算时用以代替公式“=SUM(B1,B2)”中B1或B2,B6为参与模拟运算的公式,A7:A10中数据经B6中公式计算后所得结果填充在B7:B10中。
从上述流程中了解到模拟运算分析有三个关键因素:计算公式(B6)、待替换的旧引用(B1或B2)、新引用(A7:A10)。以B1为例,可以想象模拟分析运算逐次将B2公式中的B1替换为A7、A8、A9、A10执行计算,并将计算结果逐次填充在B7:B10中。
那么,在SpreadJS中,只要可以知道上述三项因素即可复刻该功能。再来看看SpreadJS的支持:
CalcEngine:formulaToExpression()可以将公式转换为表达式,非公式字符串,而是将公式解析为表达树形式的表达式,如下图所示,表达式Expression对象中的arguments即公式参数引用:
可以看到arguments属性值数组中每项均由row、column属性,分别代表引用单元格行列。那么,可以改写row和col为新引用单元格,如下图所示,将公式“=SUM(B1,B2)”第一个参数B1引用修改为A7:
经过CalcEngine:expressionToFormula()可得到修改应用单元格后的公式,就可以使用CalcEngine:evaluateFormula()计算公式,如下图所示:
以上是一个简单的例子,实际场景可能会使用更复杂的公式,可以根据具体使用场景细化过程。而且,您可以从上面的图中看到arguments属性值数组中的各项参数有type属性,其值为数字,实际类型为枚举类ExpressionType,值为1时代表参数为引用,可以据此判断参数类型。
SpreadJS不支持模拟运算分析功能,上述是基于Microsoft Excel就模拟分析运算功能提供的操作步骤结合SpreadJS计算引擎支持的功能形成的实现方案。其中关于Expression实例的属性,除type外均未在API文档中公开,不确定在产品后续的迭代过程中是否会修改Expression对象的内部实现。如果您采取了上述方案,那么,建议您在使用过程中每次升级SpreadJS版本后都测试上述方案,确保Expression各属性调用正常,功能正常。
如上所述,您可以亲测评估下。
|