找回密码
 立即注册

QQ登录

只需一步,快速开始

Joestar.Xu SpreadJS 开发认证

超级版主

38

主题

6638

帖子

8682

积分

超级版主

Rank: 8Rank: 8

积分
8682

SpreadJS 认证SpreadJS 高级认证

Joestar.Xu SpreadJS 开发认证
超级版主   /  发表于:2023-12-28 16:21  /   查看:636  /  回复:0
本帖最后由 Joestar.Xu 于 2024-1-3 15:44 编辑

部分客户可能会需要在编辑完单元格后将当前编辑的单元格的Formatter设置为文本或小数,这个需求有多种实现方式,这里主要介绍两种:


第一种:通过监听EditEnded事件,在这个事件中设置单元格的Formatter,但是这样会遇到一个问题,通过代码设置的Formatter无法撤销。

如果这个时候又想撤销要怎么做呢?

可以将设置Formatter的操作封装为一个Command,然后在EditEnded这个事件中执行这个Command,就可以使用Crtl+Z来撤销了。

但是这样会带来另一个问题,我需要撤销两次才可以将单元格中的值清除掉。这是因为第一次撤销的时候只撤销了Formatter的设置,只有第二次撤销的时候才会清除单元格中的值。那么有没有一个两全其美的办法呢?

第二种:通过重写editCell命令来实现。


editCell命令会在设计器编辑单元格的时候触发,我们可以重写editCell命令的execute方法来实现这个功能,核心代码如下:



  1. let editCellCommand = spread.commandManager().getCommand("editCell");
  2.   let oldExecute = editCellCommand.execute;
  3.   editCellCommand.execute = function (context, propertyName, args) {
  4.     oldExecute.call(this, context, propertyName, args);
  5.     let row = context.getActiveSheet().getActiveRowIndex();
  6.     let col = context.getActiveSheet().getActiveColumnIndex();
  7.     let cell = context.getActiveSheet().getCell(row, col);
  8.     cell.formatter("@");
  9.   };
复制代码


这样就既可以实现编辑完单元格后设置Formatter的需求,也能实现只撤销一次的需求了。

SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~

0 个回复

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