新特性背景:
非法公式不等同于会返回#value,#name等特殊提示的公式,而是在输入结束后,无法正确保存的公式,例如函数缺失参数,非法符号等等。在本地Excel及SpreadJS V16之前,用户输入非法公式后,会弹出非法提示并自动清空公式,如下所示:
对大部分客户来说,弹出非法提示很正常,但直接清空公式,就让客户难以接受,辛辛苦苦输入了一堆参数,因为一个标点符号非法,就清空了所有已经输入的内容,这简直太糟糕了。
SpreadJS为进一步提升客户体验,在V16中对该功能进行了优化,对非法的公式做了支持上的增强,如果在使用时希望能保留非法公式,首先需要开启工作簿Spread上的相关设置,具体代码如下:
- spread.options.allowInvalidFormula = true
复制代码 设置完成之后,再次输入非法公式,显示如下:
设置完允许非法公式后,可以正常输入非法公式,但这个公式其实会成为单元格的值,当使用getValue()时,可以拿到这个非法的公式。
此时,如果将spread.options.allowInvalidFormula再次设置为false时,页面中的非法公式会自动添加引号,如下所示:
除此之外,V16对非法单元格也添加了状态验证显示,对于非法公式,可以使用一些特殊样式,让客户能显而易见的看到哪个单元格上存在非法的单元格。
- let style = new GC.Spread.Sheets.Style();
- let borderTop = new GC.Spread.Sheets.LineBorder('red', GC.Spread.Sheets.LineStyle.mediumDashed);
- let borderBottom = new GC.Spread.Sheets.LineBorder('green', GC.Spread.Sheets.LineStyle.mediumDashed);
- let borderLeft = new GC.Spread.Sheets.LineBorder('yellow', GC.Spread.Sheets.LineStyle.mediumDashed);
- let borderRight = new GC.Spread.Sheets.LineBorder('red', GC.Spread.Sheets.LineStyle.mediumDashed);
- style.borderTop = borderTop;
- style.borderBottom = borderBottom;
- style.borderLeft = borderLeft;
- style.borderRight = borderRight;
- sheet.cellStates.add(new GC.Spread.Sheets.Range(0, 0, sheet.getRowCount(), sheet.getColumnCount()), GC.Spread.Sheets.CellStatesType.invalidFormula, style, 3)
复制代码 设置完成之后,再查看界面中非法公式所在的单元格,可以看到单元格的边框如下:
关于单元格公式状态的检查策略如下:
1. GC.Spread.Sheets.CalcEngine.formulaToExpression(sheet,value,row,col,useR1C1)抛出无效公式异常,具有该公式的单元格将应用无效公式单元格状态;
2. 不考虑合法公式和具有引号前缀样式的非字符串类型值单元格;
3. 单个等号不会被视作无效公式。
|