找回密码
 立即注册

QQ登录

只需一步,快速开始

Winny

超级版主

141

主题

263

帖子

1696

积分

超级版主

Rank: 8Rank: 8

积分
1696
Winny
超级版主   /  发表于:2022-10-28 17:34  /   查看:2003  /  回复:0
新特性背景:

非法公式不等同于会返回#value,#name等特殊提示的公式,而是在输入结束后,无法正确保存的公式,例如函数缺失参数,非法符号等等。在本地Excel及SpreadJS V16之前,用户输入非法公式后,会弹出非法提示并自动清空公式,如下所示:
formula.gif849119262.png
对大部分客户来说,弹出非法提示很正常,但直接清空公式,就让客户难以接受,辛辛苦苦输入了一堆参数,因为一个标点符号非法,就清空了所有已经输入的内容,这简直太糟糕了。

SpreadJS为进一步提升客户体验,在V16中对该功能进行了优化,对非法的公式做了支持上的增强,如果在使用时希望能保留非法公式,首先需要开启工作簿Spread上的相关设置,具体代码如下:
  1. spread.options.allowInvalidFormula = true
复制代码
设置完成之后,再次输入非法公式,显示如下:
formula2.gif899483337.png
设置完允许非法公式后,可以正常输入非法公式,但这个公式其实会成为单元格的值,当使用getValue()时,可以拿到这个非法的公式。
image.png131363219.png
此时,如果将spread.options.allowInvalidFormula再次设置为false时,页面中的非法公式会自动添加引号,如下所示:
image.png88793944.png

除此之外,V16对非法单元格也添加了状态验证显示,对于非法公式,可以使用一些特殊样式,让客户能显而易见的看到哪个单元格上存在非法的单元格。
  1. let style = new GC.Spread.Sheets.Style();
  2. let borderTop = new GC.Spread.Sheets.LineBorder('red', GC.Spread.Sheets.LineStyle.mediumDashed);
  3. let borderBottom = new GC.Spread.Sheets.LineBorder('green', GC.Spread.Sheets.LineStyle.mediumDashed);
  4. let borderLeft = new GC.Spread.Sheets.LineBorder('yellow', GC.Spread.Sheets.LineStyle.mediumDashed);
  5. let borderRight = new GC.Spread.Sheets.LineBorder('red', GC.Spread.Sheets.LineStyle.mediumDashed);
  6. style.borderTop = borderTop;
  7. style.borderBottom = borderBottom;
  8. style.borderLeft = borderLeft;
  9. style.borderRight = borderRight;
  10. sheet.cellStates.add(new GC.Spread.Sheets.Range(0, 0, sheet.getRowCount(), sheet.getColumnCount()), GC.Spread.Sheets.CellStatesType.invalidFormula, style, 3)
复制代码
设置完成之后,再查看界面中非法公式所在的单元格,可以看到单元格的边框如下:
image.png701350402.png
关于单元格公式状态的检查策略如下:

1. GC.Spread.Sheets.CalcEngine.formulaToExpression(sheet,value,row,col,useR1C1)抛出无效公式异常,具有该公式的单元格将应用无效公式单元格状态;

2. 不考虑合法公式和具有引号前缀样式的非字符串类型值单元格;
3. 单个等号不会被视作无效公式。






评分

参与人数 1满意度 +5 收起 理由
xcymoo + 5

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部