请选择 进入手机版 | 继续访问电脑版

maki

金牌服务用户

41

主题

172

帖子

641

积分

金牌服务用户

积分
641
maki
金牌服务用户   /  发表于:2026-1-27 16:50  /   查看:161  /  回复:11
1金币
本帖最后由 maki 于 2026-1-27 17:31 编辑

表格开启了选择列,能一键全选,如何实现,在表格上方增加一个输入框,输入多少数字,就选择多少行,如果输入数字超出行数据,就弹框提醒?以及如何,实现表格的反选功能。

最佳答案

查看完整内容

maki您好,这个问题我们又调查了下,发现性能瓶颈其实在【勾选时界面的重新绘制】,属于是Spreadjs上常见的问题了 因此优化的思路也是【暂停界面绘制】→【尽可能少的勾选】→【重新绘制】的方案,例如用JavaScript执行: 测试优化后500条的反选大概200毫秒以内 参考的是Spreadjs的性能优化FAQ https://demo.grapecity.com.cn/sp ... e-optimize-project2

11 个回复

最佳答案
最佳答案
Tony.Fu活字格认证 Wyn认证
超级版主   /  发表于:2026-1-27 16:50:28
来自 7#
本帖最后由 Tony.Fu 于 2026-1-28 17:03 编辑

maki您好,这个问题我们又调查了下,发现性能瓶颈其实在【勾选时界面的重新绘制】,属于是Spreadjs上常见的问题了
因此优化的思路也是【暂停界面绘制】→【尽可能少的勾选】→【重新绘制】的方案,例如用JavaScript执行:

  1. var page = Forguncy.Page;
  2. var listview = page.getListView("表格1");

  3. var rowCount = listview.getRowCount();
  4. var selectedIndexes = listview.getSelectedRowIndexs();
  5. var selectedSet = new Set(selectedIndexes);

  6. var sheet = listview.getControl().getActiveSheet();
  7. // ↓关键,暂停SpreadJS的界面绘制
  8. sheet.suspendPaint();

  9. var selectedCount = selectedIndexes.length;
  10. var unselectedCount = rowCount - selectedCount;

  11. //对比下哪部分多,只操作少的部分 最大化提升性能
  12. if (unselectedCount < selectedCount) {
  13.     // 反选:只选中“原来没选中的”
  14.     listview.clearAllSelectedRows();

  15.     for (var i = 0; i < rowCount; i++) {
  16.         if (!selectedSet.has(i)) {
  17.             listview.addSelectedRow(i);
  18.         }
  19.     }
  20. } else {
  21.     // 反选:先全选,再清除原来选中的
  22.     listview.selectAllRows();

  23.     selectedIndexes.forEach(function (index) {
  24.         listview.clearSelectedRow(index);
  25.     });
  26. }

  27. sheet.resumePaint();
复制代码
测试优化后500条的反选大概200毫秒以内


参考的是Spreadjs的性能优化FAQ
https://demo.grapecity.com.cn/sp ... e-optimize-project2



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Simon.Sun活字格认证 Wyn认证
超级版主   /  发表于:2026-1-27 17:48:54
2#
您好,初步的方案是借助表格操作命令去循环增加选择行:

demo 见附件,可以参考下能否满足您的需求。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
maki
金牌服务用户   /  发表于:2026-1-27 18:02:24
3#
Simon.Sun 发表于 2026-1-27 17:48
您好,初步的方案是借助表格操作命令去循环增加选择行:

demo 见附件,可以参考下能否满足您的需求。

感谢大佬的回复,用循环我也想到过。奈何实际业务中有个变态的地方就是, 有时候订单数量只有几十个那还好,有时候订单有几千个。毕竟是制造业嘛,选择前2000个,这时候就要循环几秒钟。页面就会卡住。顺便问一下大佬,反选怎么搞。实际情况还有这种,先做2000个,后面还有别人来做另外2000个。这时候,前两千个已经选中了。就需要用到反选。
回复 使用道具 举报
Shawn.Liu活字格认证
超级版主   /  发表于:2026-1-27 18:12:19
4#
maki 发表于 2026-1-27 18:02
感谢大佬的回复,用循环我也想到过。奈何实际业务中有个变态的地方就是, 有时候订单数量只有几十个那还 ...

反选尝试一下JS的方案,获取选择行列表,之后循环判断不在选择行列表中的行再次选中。
  1. let listview = Forguncy.Page.getListView("表格1");
  2. let rowCount = listview.getRowCount();
  3. let selectedRowsIndexs = listview.getSelectedRowIndexs();
  4. listview.clearAllSelectedRows();
  5. for (let i = 0; i < rowCount; i++) {
  6.     if (selectedRowsIndexs.indexOf(i) === -1) {
  7.         listview.addSelectedRow(i);
  8.     }
  9. }
复制代码


回复 使用道具 举报
maki
金牌服务用户   /  发表于:2026-1-28 13:58:44
5#
Shawn.Liu 发表于 2026-1-27 18:12
反选尝试一下JS的方案,获取选择行列表,之后循环判断不在选择行列表中的行再次选中。

感谢大佬的回复,这个代码有用。依然是,数量多了以后,会比较卡。
回复 使用道具 举报
Shawn.Liu活字格认证
超级版主   /  发表于:2026-1-28 15:02:42
6#
maki 发表于 2026-1-28 13:58
感谢大佬的回复,这个代码有用。依然是,数量多了以后,会比较卡。

这个可能是避免不了的,代码逻辑本身是正确的反选,从代码侧优化的空间不是很大,可以在检测当前行i是否在已选行数组中时,将其切换为Set来优化一点查询速度,但在大数据量面前效果不太显著,只能考虑分页等方式在业务和反选之间做一些平衡。
  1. let listview = Forguncy.Page.getListView("表格1");
  2. let rowCount = listview.getRowCount();
  3. let selectedRowsIndexs = listview.getSelectedRowIndexs();
  4. let selectedSet = new Set(selectedRowsIndexs);

  5. listview.clearAllSelectedRows();

  6. let unselectedCount = rowCount - selectedRowsIndexs.length;

  7. if (unselectedCount < selectedRowsIndexs.length) {
  8.     for (let i = 0; i < rowCount; i++) {
  9.         if (!selectedSet.has(i)) {
  10.             listview.addSelectedRow(i);
  11.         }
  12.     }
  13. } else {
  14.     listview.selectAllRows();
  15.     selectedRowsIndexs.forEach(index => {
  16.         listview.clearSelectedRow(index);
  17.     });
  18. }
复制代码


回复 使用道具 举报
maki
金牌服务用户   /  发表于:2026-1-29 14:09:43
8#
Tony.Fu 发表于 2026-1-27 16:50
maki您好,这个问题我们又调查了下,发现性能瓶颈其实在【勾选时界面的重新绘制】,属于是Spreadjs上常见的 ...

太棒了。~
回复 使用道具 举报
maki
金牌服务用户   /  发表于:2026-1-29 14:27:17
9#
Tony.Fu 发表于 2026-1-27 16:50
maki您好,这个问题我们又调查了下,发现性能瓶颈其实在【勾选时界面的重新绘制】,属于是Spreadjs上常见的 ...

大佬,再帮小弟一个忙啊,这个demo, 表格上面有个滑块。我想用这个滑块调整表格的选择数量,我的思路是,先清空选择,然后设置一个0 的参数,按照滑块选择数字循环,每次加1,但是这样做,也是需要400的订单要卡 好几秒钟,JS 命令有没有更丝滑的办法,谢谢大佬啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Tony.Fu活字格认证 Wyn认证
超级版主   /  发表于:2026-1-29 18:04:18
10#
本帖最后由 Tony.Fu 于 2026-1-29 18:43 编辑
maki 发表于 2026-1-29 14:27
大佬,再帮小弟一个忙啊,这个demo, 表格上面有个滑块。我想用这个滑块调整表格的选择数量,我的思路是 ...


客气了哈,都是互相学习,您试试这个效果,结合您前面的附件,增加了勾选行数的限制
P.S:我这边下午一直在会议上,抱歉回复有些耽搁






  1. var page = Forguncy.Page;
  2. var listview = page.getListView("表格1");

  3. var rowCount = listview.getRowCount();
  4. var selectedIndexes = listview.getSelectedRowIndexs();
  5. var selectedSet = new Set(selectedIndexes);

  6. var checkLimit = Forguncy.CommandHelper.getVariableValue("限制行数");
  7. var overlimitMethod = Forguncy.CommandHelper.getVariableValue("超限的做法");

  8. var targetCount = rowCount - selectedIndexes.length;

  9. // 超限判断
  10. if (checkLimit > 0 && targetCount > checkLimit && overlimitMethod == 2) {
  11.     alert("最多只能选择 " + checkLimit + " 行,请减少选择后再操作。");
  12.     return;
  13. }

  14. var sheet = listview.getControl().getActiveSheet();
  15. sheet.suspendPaint();

  16. // 统一清空
  17. listview.clearAllSelectedRows();

  18. var added = 0;

  19. for (var i = 0; i < rowCount; i++) {
  20.     if (!selectedSet.has(i)) {
  21.         listview.addSelectedRow(i);
  22.         added++;

  23.         // 勾到上限数量就停
  24.         if (checkLimit > 0 && overlimitMethod == 1 && added >= checkLimit) {
  25.             break;
  26.         }
  27.     }
  28. }

  29. sheet.resumePaint();
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

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