找回密码
 立即注册

QQ登录

只需一步,快速开始

ymslx_sjs

初级会员

49

主题

122

帖子

417

积分

初级会员

积分
417
ymslx_sjs
初级会员   /  发表于:2022-2-18 17:25  /   查看:2058  /  回复:5

如图,在A1单元格内写入公式,然后在后端执行一个复制黏贴的动作后,不希望这个公式的的值的变动在脏数据里

image.png634278869.png

image.png272153014.png
  1. var spread = GC.Spread.Sheets.Designer.findControl(document.getElementById('gc-designer-container')).getWorkbook();
  2. var sheet = spread.getActiveSheet();
  3. sheet.getDirtyCells();

  4. spread.suspendPaint();
  5. spread.suspendCalcService();

  6. spread.commandManager().execute({
  7.         cmd: "clipboardPaste",
  8.         sheetName: sheet.name(),
  9.         fromSheet: sheet,
  10.         fromRanges: [new GC.Spread.Sheets.Range(0, 0, 2, 1)],
  11.         pastedRanges: [new GC.Spread.Sheets.Range(3, 0, 2, 1)],
  12.         isCutting: false,
  13.         clipboardText: "",
  14.         pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
  15. });

  16. sheet.clearPendingChanges();

  17. spread.resumeCalcService();
  18. spread.resumePaint();
复制代码


5 个回复

倒序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-18 18:09:36
沙发
您好,
您可以在执行粘贴命令前后使用suspendDirty/ resumeDirty暂停记录脏数据,
此时粘贴命令产生的脏数据将不会被记录。

示例代码:
  1. sheet.suspendDirty();
  2. spread.commandManager().execute({
  3.         cmd: "clipboardPaste",
  4.         sheetName: sheet.name(),
  5.         fromSheet: sheet,
  6.         fromRanges: [new GC.Spread.Sheets.Range(0, 0, 2, 1)],
  7.         pastedRanges: [new GC.Spread.Sheets.Range(3, 0, 2, 1)],
  8.         isCutting: false,
  9.         clipboardText: "",
  10.         pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
  11. });
  12. sheet.resumeDirty();
复制代码


回复 使用道具 举报
ymslx_sjs
初级会员   /  发表于:2022-2-21 09:42:17
板凳
Lynn.Dou 发表于 2022-2-18 18:09
您好,
您可以在执行粘贴命令前后使用suspendDirty/ resumeDirty暂停记录脏数据,
此时粘贴命令产生的脏 ...

如图,并没有效果
image.png811897582.png
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-21 10:34:27
地板
根据对问题的理解,这边测试代码如下:
  1. var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 1 });
  2.             var sheet = spread.getActiveSheet();
  3.             // 合并单元格
  4.             sheet.addSpan(0,0,2,1);
  5.             // 在A1单元格写入公式
  6.             sheet.setFormula(0,0,"=row()/2-5")
  7.             console.log(sheet.getDirtyCells());
  8.             sheet.suspendDirty();
  9.             spread.commandManager().execute({
  10.                 cmd: "clipboardPaste",
  11.                 sheetName: sheet.name(),
  12.                 fromSheet: sheet,
  13.                 fromRanges: [new GC.Spread.Sheets.Range(0, 0, 2, 1)],
  14.                 pastedRanges: [new GC.Spread.Sheets.Range(3, 0, 2, 1)],
  15.                 isCutting: false,
  16.                 clipboardText: "",
  17.                 pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
  18.             });
  19.             sheet.resumeDirty();
  20.             console.log(sheet.getDirtyCells());
复制代码
测试结果如下图:
image.png640714110.png

从图中可以看出,公式单元格值的修改未记录在脏数据中。
具体您可以参考附件demo实际运行测试下。

如果这边对问题的理解有误,请结合代码具体指出并详细描述您的问题和需求。


demo-sjs模板.html

3.51 KB, 下载次数: 75

回复 使用道具 举报
ymslx_sjs
初级会员   /  发表于:2022-2-21 11:08:36
5#
Lynn.Dou 发表于 2022-2-21 10:34
根据对问题的理解,这边测试代码如下:测试结果如下图:

请把绘制挂起,
spread.suspendPaint();
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-21 11:23:13
6#
出现您描述问题的原因与 挂起绘制 和 挂起计算 API 的执行顺序 有关。
将执行顺序修改如下:
  1. spread.suspendPaint();
  2.             // 先执行 挂起脏数据
  3.             sheet.suspendDirty();
  4.             // 再执行挂起计算
  5.             spread.suspendCalcService();
  6.             spread.commandManager().execute({
  7.                 cmd: "clipboardPaste",
  8.                 sheetName: sheet.name(),
  9.                 fromSheet: sheet,
  10.                 fromRanges: [new GC.Spread.Sheets.Range(0, 0, 2, 1)],
  11.                 pastedRanges: [new GC.Spread.Sheets.Range(3, 0, 2, 1)],
  12.                 isCutting: false,
  13.                 clipboardText: "",
  14.                 pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
  15.             });
  16.             // 先执行 恢复计算
  17.             spread.resumeCalcService();
  18.             // 先执行 恢复脏数据
  19.             sheet.resumeDirty();
  20.             spread.resumePaint();
  21.             console.log(sheet.getDirtyCells());
复制代码
具体查看附件demo

demo-sjs模板.html

3.82 KB, 下载次数: 60

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部