找回密码
 立即注册

QQ登录

只需一步,快速开始

Dtttax

高级会员

235

主题

572

帖子

1849

积分

高级会员

积分
1849
Dtttax
高级会员   /  发表于:2024-4-15 17:43  /   查看:315  /  回复:8
1金币
本帖最后由 Richard.Huang 于 2024-4-22 14:51 编辑

产品:SpreadJS
版本:V14.2.3
调研编号:SJS-23872

insertrow如果像右键insertrow。
直接用这个方法可以,如果有公式也可以直接还原。
  1. spread.commandManager().execute({
  2.   ...options,
  3.   cmd: 'gc.spread.contextMenu.insertRows'
  4. })
复制代码
但是如果需要加入其他功能比如写个方法
  1. insertrow(){
  2. spread.commandManager().execute({
  3.   ...options,
  4.   cmd: 'gc.spread.contextMenu.insertRows'
  5. })
  6. let cell = sheet.getCell(activeRow + i, 0)
  7. let t = cell.tag()
  8. if (!t) {
  9.   t = {}
  10. }
  11. t.manualInsert = true
  12. }
复制代码

或者写相同的代码
  1. insertrow(){
  2. sheet.addRows(activeRow, rowCount)
  3. let cell = sheet.getCell(activeRow + i, 0)
  4. let t = cell.tag()
  5. if (!t) {
  6.   t = {}
  7. }
  8. t.manualInsert = true
  9. }
复制代码
这样如果插入一行后到其他表单设置公式,撤回能撤回那个插入的行,但是公式不能跟着变化。

8 个回复

倒序浏览
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-4-16 17:47:33
沙发
您好,我看了一下您提供的信息,没有完全明白您的意思,您是想插入一行后在这一行输入公式后再撤销能够实现把行也撤销的效果吗?

如果不是的话还请您再详细说明一下,这边帮您调研看看。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2024-4-16 18:13:46
板凳
比如sheet1单元格有个公式,='Sheet2'!B13, 在Sheet2的13行上面用sheet.addRows(activeRow, rowCount) 插入一行,这个是那个公式就会变成了'Sheet2'!B14,如果马上撤回,这个时候公式不能跟着撤回。

也就是不用spread.commandManager().execute({
  cmd: 'gc.spread.contextMenu.insertRows'
}) 插入行。用sheet.addRows 插入行。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-4-17 17:32:39
地板
了解了,我这边做了一个简单的Demo,在这个Demo中我将addRows作为一个可以undo的command封装了起来,然后按照您说的在Sheet1中设置了='Sheet2'!B13公式后,在Sheet2中使用自定义的command增加了一行,此时Sheet1中设置的公式变为:='Sheet2'!B14。

然后,撤销增加一行的command,会发现Sheet1中的公式仍然是:='Sheet2'!B14。

但是实际上在使用gc.spread.contextMenu.insertRows这个command时,即使撤销了以后,Sheet1中的公式也会变回:='Sheet2'!B13。

综上,您实际的需求是想要让这个自定义command也能实现和gc.spread.contextMenu.insertRows一样的撤回效果,即让公式也恢复到没有添加行之前的效果。

不知道我的理解对吗?如果仍有疑问或异议请您再详细说明一下。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2024-4-17 17:38:00
5#
对的,就是这样
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-4-18 12:02:15
6#
好的,您描述的情况我了解了,这边调研一下,后续有进展我会在本贴中回复您。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:3 天前
7#
您好,经调研,此处需要一个内部接口才能实现,即startTransactionAll和endTransactionAll。

  1. let addRow = {
  2.     canUndo: true,
  3.     name: "addRow",
  4.     execute: function (context, options, isUndo) {
  5.       let Commands = GC.Spread.Sheets.Commands;
  6.       if (isUndo) {
  7.         Commands.undoTransaction(context, options);
  8.         return true;
  9.       } else {
  10.         Commands.startTransactionAll(context.sheets, options);
  11.         options.cmd = "addRow";
  12.         context
  13.           .getActiveSheet()
  14.           .addRows(context.getActiveSheet().getActiveRowIndex(), 1);
  15.         Commands.endTransactionAll(context.sheets, options);
  16.         return true;
  17.       }
  18.     },
  19.   };
复制代码


但是在V14中并没有这个接口,建议您升级到最新版后来使用,另外,因为这两个接口为内部接口,不排除在未来发生变动的可能,所以有着潜在的风险,这一点需要注意。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
Dtttax
高级会员   /  发表于:3 天前
8#
升级到最新版是升级到哪个版本V17吗?
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:3 天前
9#
Dtttax 发表于 2024-4-28 10:06
升级到最新版是升级到哪个版本V17吗?

是的。目前最新版本为17.0.8。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部