找回密码
 立即注册

QQ登录

只需一步,快速开始

Richard.Huang SpreadJS 开发认证

超级版主

43

主题

3222

帖子

4999

积分

超级版主

Rank: 8Rank: 8

积分
4999

SpreadJS 认证SpreadJS 高级认证

Richard.Huang SpreadJS 开发认证
超级版主   /  发表于:2023-12-29 11:21  /   查看:1494  /  回复:0
背景
大家对于在线表格编辑器和Excel的自动求和按钮赞美有加,但是很多用户希望在SpreadJS上也能实现这样的功能,方便他们的用户能够很方便的使用它们的系统。
image.png963473205.png

解释
如果不借助designer的话,则需要借助原生js来进行实现,而我们的每个单元格实际上可以通过类似dom元素进行获取,获取之后我们可以借助window.getSelection等原生js来控制光标的位置。

解决方法
为了完整写入“=SUM()”这个公式,我们首先需要把允许非法公式打开
  1. spread.options.allowInvalidFormula = true;
复制代码
接着我们往单元格中填入的必须是value而非formula,只有用户输入结束后才能视作formula
  1. sheet.setActiveCell(sheetSelection.row, sheetSelection.col);
  2. sheet.setValue(sheetSelection.row, sheetSelection.col, "=SUM()")
复制代码
控制光标位置:
实际上每个dom元素会被js视作一颗树,dom元素中的内容则是这棵树上的节点,因此我们需要解析这棵树并将光标放在括号内
  1. // 通过索引控制光标位置
  2. function setCaretCharIndex(containerEl, index) {
  3.     var node;
  4.     var treeWalker = document.createTreeWalker(containerEl, NodeFilter.SHOW_TEXT, function (node) {
  5.         var nodeRange = document.createRange();
  6.         nodeRange.selectNodeContents(node);

  7.         if (index > nodeRange.endOffset) {
  8.             index -= nodeRange.endOffset;
  9.             return NodeFilter.FILTER_REJECT;
  10.         } else {
  11.             return NodeFilter.FILTER_ACCEPT;
  12.         }
  13.     });

  14.     while (treeWalker.nextNode()) {
  15.         node = treeWalker.currentNode;
  16.         break;
  17.     }

  18.     var range = document.createRange();
  19.     var sel = window.getSelection();
  20.     range.setStart(node, index);
  21.     range.collapse(true);
  22.     sel.removeAllRanges();
  23.     sel.addRange(range);
  24.     containerEl.focus();
  25. }
复制代码


填充公式并将光标放在括号内.html

4.27 KB, 下载次数: 123

0 个回复

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