实现数据透视表的值字段和数据字段禁止同名
本帖最后由 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]