Ellia.Duan 发表于 2024-6-21 18:05:09

在线表格编辑器重写右键菜单之 ”删除表列“

本帖最后由 Ellia.Duan 于 2024-7-3 10:18 编辑

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



但是在SpreadJS中,当选中的列数等于tale的列数,此时点击“删除“”表列”,并不会删除整个table,为此我们可以重写下删除表列的相关逻辑
首先,获取到此命令:
let oldDeleteColumnCommand = GC.Spread.Sheets.Commands.tableDeleteColumnsForContextMenu.execute;
            然后重写execute
GC.Spread.Sheets.Commands.tableDeleteColumnsForContextMenu.execute = function (spread, options, isUndo) {
            
var Commands = GC.Spread.Sheets.Commands;
                if (isUndo) {
                  Commands.undoTransaction(spread, options);
                  return true;
                }
                let { sheetName } = options;
                let sheet = spread.getSheetFromName(sheetName);
                let tables = sheet.tables.all();
                let tableNames = [];
                sheet.getSelections().forEach(function (selection) {
                  for (let i = 0; i < tables.length; i++) {
                        let table = tables;
                        if (table.range().col == selection.col && table.range().colCount == selection.colCount) {
                            tableNames.push(table.name());
                        }
                  }
                });
                if (tableNames.length) {
                  Commands.startTransaction(spread, options);
                  spread.suspendPaint();
                  if (sheet && tableNames && tableNames.length > 0) {
                        tableNames.forEach(function (tableName) {
                            var table = sheet.tables.findByName(tableName);
                            if (table) {
                              sheet.tables.remove(table);
                            }
                        })
                  }
                  spread.resumePaint();
                  Commands.endTransaction(spread, options);
                  return true;
                } else {
                  //删除表列
                  return oldDeleteColumnCommand.apply(this, arguments);
                }
            }

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

同时,我们要注意,一个sheet中可能有多个table 。所以,在对选择区域遍历的同时,要对tables进行遍历。
页: [1]
查看完整版本: 在线表格编辑器重写右键菜单之 ”删除表列“