本帖最后由 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[i];
- 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进行遍历。
|
|