找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证

超级版主

200

主题

9899

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
15533

讲师达人悬赏达人微信认证勋章SpreadJS 认证SpreadJS 高级认证元老葡萄

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-8-1 20:42  /   查看:2246  /  回复:0
在Excel中如果排序选中的单元格区域周围存在数据,那么在点击升序或者降序的时候系统会给予提示,例如下图所示:当选中区域的周围存在其他数据时,这个时候点击排序按钮,Excel会给出“发现在选定区域旁边还有数据。该数据未被选择,将不参与排序。”提示。

image.png72449034.png

然而排序的功能在SpreadJS中源生是没有这样的提示的,但是SpreadJS本身的强大扩展功能支持用户通过二次开发来实现这样的需求。
以在线表格编辑器为例:
首先我们找到在线表格编辑器中排序的实现逻辑
  1. var sortAZ = GC.Spread.Sheets.Designer.getCommand("sortAZ");
复制代码
然后我们将sortAZ的execute方法以变量形式保存起来,该方法中存放的就是SpreadJS源生的排序实现逻辑。
  1. var oldSortAZExecute = sortAZ.execute;
复制代码
之后我们需要重写execute方法,在方法中加入逻辑判断并给予对话框提示,具体代码如下:
                        sortAZ.execute = function(context, propertyName) {
                                var activeSheet = context.getWorkbook().getActiveSheet();
                                var flag = false;
                                var selection = activeSheet.getSelections()[0];
                               
                                for(var i=selection.row;i<selection.row+selection.rowCount;i++){
                                        if(selection.col>0){
                                                var valueLeft = activeSheet.getValue(i,selection.col-1);
                                                if(valueLeft != null){
                                                        flag = true;
                                                        break;
                                                }
                                        }
                                        if((selection.col+selection.colCount)<activeSheet.getColumnCount()){
                                                var valueRight = activeSheet.getValue(i,selection.col+selection.colCount);
                                                if(valueRight != null){
                                                        flag = true;
                                                        break;
                                                }
                                        }
                               
                                }
                               
                                if(flag){
                                        GC.Spread.Sheets.Designer.showMessageBox("发现在选定区域旁边还有数据。该数据未被选择,将不参与排序。", "提示", GC.Spread.Sheets.Designer.MessageBoxIcon.warning,function(){
                                                oldSortAZExecute.call(this, context, propertyName);
                                        });
                                }else{
                                        oldSortAZExecute.call(this, context, propertyName);
                                }
                               
                               
                               
                               
                        };

这里面主要是判断方法,根据选中的区域判断它的左右两侧是否存在数据。如果存在数据弹出提示,在提示结束后调用之前保存的源生排序逻辑进行排序。

完整的实现可以参考附件demo



purejs.zip

8.92 MB, 下载次数: 32

评分

参与人数 1满意度 +5 收起 理由
liuweix + 5

查看全部评分

0 个回复

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