Winny 发表于 2022-10-28 17:34:14

【SpreadJS v16.0 新特性预览】允许用户输入无效的公式并高亮显示无效公式

新特性背景:

非法公式不等同于会返回#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. 单个等号不会被视作无效公式。






页: [1]
查看完整版本: 【SpreadJS v16.0 新特性预览】允许用户输入无效的公式并高亮显示无效公式