找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-2-7 11:21  /   查看:3739  /  回复:0
背景:
当某一列存在筛选的情况下时,删除整列操作会导致跟Excel结果不同,Excel中筛选掉的结果不会被删除,SpreadJS中会全部删除包括筛选掉的结果,这里在设计上会有稍许差异,如果想要保持跟Excel的行为一致可以参考下面方法
思路:
通过重写删除命令,在命令中来控制删除行为
核心代码:
  1. var oldclear = GC.Spread.Sheets.Commands.clear.execute;
  2.                 var myClear = {
  3.                         canUndo: true,
  4.                         execute: function (context, options, isUndo) {
  5.                                 var Commands = GC.Spread.Sheets.Commands;
  6.                                 options.cmd = "myClear";
  7.                                 if (isUndo) {
  8.                                         Commands.undoTransaction(context, options);
  9.                                         return true;
  10.                                 } else {
  11.                                         if(!sheet.isEditing()){
  12.                                                 Commands.startTransaction(context, options);
  13.                                                 spread.suspendPaint();
  14.                                                 var sheet = context.getActiveSheet();
  15.                                                 var filterRange = sheet.rowFilter().range;
  16.                                                 var filterRow = filterRange.row;
  17.                                                 var filterRowCount = filterRange.rowCount;
  18.                                                 var filterCol = filterRange.col;
  19.                                                 var filterColCount = filterRange.colCount;
  20.                                                 var selections = sheet.getSelections();
  21.                                                
  22.                                                 for(var i = 0; i < selections.length; i++){
  23.                                                
  24.                                                         var row = selections[i].row == -1 ? 0 : selections[i].row;
  25.                                                         var col = selections[i].col;
  26.                                                         var rowCount = selections[i].rowCount;
  27.                                                         var colCount = selections[i].colCount;
  28.                                                         //筛选标记
  29.                                                         var isfilteredFlag = false;
  30.                                                         for(var i = col; i < col + colCount; i++){
  31.                                                                 if(sheet.rowFilter().isFiltered(i)){
  32.                                                                         isfilteredFlag = true;
  33.                                                                 }
  34.                                                         }
  35.                                                                
  36.                                                         if(col < filterCol || col+colCount > filterCol+filterColCount){
  37.                                                                 //filter区域外
  38.                                                                 sheet.clear(row,col,rowCount,colCount,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
  39.                                                         }else{
  40.                                                                 if(isfilteredFlag){
  41.                                                                         if(rowCount > 1){
  42.                                                                                
  43.                                                                                 for(var i=row; i < row + rowCount; i++){
  44.                                                                                         if( i < filterRow + filterRowCount && i >= filterRow){
  45.                                                                                                 if(!sheet.rowFilter().isRowFilteredOut(i)){
  46.                                                                                                         sheet.clear(i,col,1,colCount,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
  47.                                                                                                 }
  48.                                                                                         } else {
  49.                                                                                                 sheet.clear(i,col,1,colCount,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
  50.                                                                                         }
  51.                                                                                 }
  52.                                                                                
  53.                                                                         }else{
  54.                                                                                 sheet.clear(row,col,rowCount,colCount,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
  55.                                                                         }
  56.                                                                 }else{
  57.                                                                         sheet.clear(row,col,rowCount,colCount,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
  58.                                                                 }
  59.                                                                
  60.                                                         }

  61.                                                 }
  62.                                                
  63.                                                 options.cmd = "myClear";
  64.                                                 spread.resumePaint();
  65.                                                 Commands.endTransaction(context, options);

  66.                                                 return true;
  67.                                                
  68.                                         } else {
  69.                                                 return false;
  70.                                         }
  71.                                                
  72.                                 }
  73.                         }
  74.                 };
  75.                
  76.                 spread.commandManager().register("myClear", myClear);       
  77.                
  78.                 spread.commandManager().setShortcutKey('myClear', GC.Spread.Commands.Key.del, false, false, false, false);
复制代码
完整demo参考附件

filter中del行为保持与Excel一致(重写del).html

4.14 KB, 下载次数: 125

0 个回复

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