Richard.Ma 发表于 2024-9-10 14:39:09

实现数据透视表的值字段和数据字段禁止同名

本帖最后由 AlexZ 于 2024-10-9 12:04 编辑


数据透视表的值字段名称用户可以自己来进行设置。在 SpreadJS 中,对于名称没有做任何限制。可以和透视表数据字段重名

但是, 在excel中,会有上述的限制,不允许重名(参考下图)


如果出于兼容性考虑,想要加上相同的限制的话,可以通过对相关的“UpdatePivotValueFieldCmd”命令进行重写。来实现类似的限制

下面是关键代码,
1.对UpdatePivotValueFieldCmd原来执行的方法进行了获取,
2.在重写的command中,先判断值字段名称是否和数据字段重名
3.如果重名则结束执行命令,如果不重名则执行原有的方法
//重写UpdatePivotValueFieldCmd命令
      oldExcute= GC.Spread.Sheets.Commands.UpdatePivotValueFieldCmd.execute;
      var newExcute=function (context, options, isUndo) {
            oldExcute (context, options, isUndo) ;
            return false;
      }

      let NewUpdatePivotValueFieldCmd = {
            canUndo: true,
            name: "UpdatePivotValueFieldCmd",
            execute: function (context, options, isUndo) {
                  console.log(options);
                  let Commands = GC.Spread.Sheets.Commands;
                  if (isUndo) {
                        Commands.undoTransaction(context, options);
                        return true;
                  } else {
                        
                        let sheet = context.getSheetFromName(options.sheetName);
                        
                        let pt=sheet.pivotTables.get(options.cmdOption.pivotName)
                        var fileds=pt.getSourceFields();
                        const hasValueFieldName = fileds.some(obj => obj.name === options.cmdOption.fieldName);
                        if(hasValueFieldName){
                              alert("值字段和已有字段名称不能重复");
                              return false;
                        }
                        Commands.startTransaction(context, options);

                        newExcute(context, options, isUndo);
                        
                        Commands.endTransaction(context, options);
                        return true;
                  }
            },
      };

      spread.commandManager().register("UpdatePivotValueFieldCmd", NewUpdatePivotValueFieldCmd);

完整的代码可以参考下面的demo


页: [1]
查看完整版本: 实现数据透视表的值字段和数据字段禁止同名