找回密码
 立即注册

QQ登录

只需一步,快速开始

Ellia.Duan SpreadJS 开发认证

超级版主

58

主题

4146

帖子

6394

积分

超级版主

Rank: 8Rank: 8

积分
6394

SpreadJS 认证SpreadJS 高级认证

Ellia.Duan SpreadJS 开发认证
超级版主   /  发表于:2024-6-21 18:05  /   查看:49  /  回复:0
本帖最后由 Ellia.Duan 于 2024-6-25 09:34 编辑

在Excel中,如何选中的列数刚好等于table的列数,此时右键点击“删除“”表列”可以达到删除整个table的作用,如下图所示:

删除表列.gif

但是在SpreadJS中,当选中的列数等于tale的列数,此时点击“删除“”表列”,并不会删除整个table  ,为此我们可以重写下删除表列的相关逻辑
首先,获取到此命令:
  1. let oldDeleteColumnCommand = GC.Spread.Sheets.Commands.tableDeleteColumnsForContextMenu.execute;
  2.             
复制代码
然后重写execute
  1. GC.Spread.Sheets.Commands.tableDeleteColumnsForContextMenu.execute = function (spread, options, isUndo) {
  2.             
  3.   var Commands = GC.Spread.Sheets.Commands;
  4.                 if (isUndo) {
  5.                     Commands.undoTransaction(spread, options);
  6.                     return true;
  7.                 }
  8.                 let { sheetName } = options;
  9.                 let sheet = spread.getSheetFromName(sheetName);
  10.                 let tables = sheet.tables.all();
  11.                 let tableNames = [];
  12.                 sheet.getSelections().forEach(function (selection) {
  13.                     for (let i = 0; i < tables.length; i++) {
  14.                         let table = tables[i];
  15.                         if (table.range().col == selection.col && table.range().colCount == selection.colCount) {
  16.                             tableNames.push(table.name());
  17.                         }
  18.                     }
  19.                 });
  20.                 if (tableNames.length) {
  21.                     Commands.startTransaction(spread, options);
  22.                     spread.suspendPaint();
  23.                     if (sheet && tableNames && tableNames.length > 0) {
  24.                         tableNames.forEach(function (tableName) {
  25.                             var table = sheet.tables.findByName(tableName);
  26.                             if (table) {
  27.                                 sheet.tables.remove(table);
  28.                             }
  29.                         })
  30.                     }
  31.                     spread.resumePaint();
  32.                     Commands.endTransaction(spread, options);
  33.                     return true;
  34.                 } else {
  35.                     //删除表列
  36.                     return oldDeleteColumnCommand.apply(this, arguments);
  37.                 }
  38.             }
复制代码

在上述代码中,我们遍历了整个工作簿的sheet ,然后判断当前选中区域的colCount是不是等于tableRange的colCount 。如果是,则添加进tableNames数组。
最后遍历tableNames数组,试用sheet.tables.remove(table)进行删除table 。
否则,我们按照原来的逻辑,删除表列。

同时,我们要注意,一个sheet中可能有多个table 。所以,在对选择区域遍历的同时,要对tables进行遍历。

0 个回复

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