长安/ 发表于 2024-12-4 15:58:27

单元格合并

两个单元格, 一个设置必填, 一个设置成时间选择且必填, 合并之后无法通过验证, 如何解决?

Joestar.Xu 发表于 2024-12-4 15:58:28

您好,可以参考以下代码来实现:

let newCommand = GC.Spread.Sheets.Designer.getCommand(
GC.Spread.Sheets.Designer.CommandNames.MergeCenter
);
if (newCommand) {
let oldExecute = newCommand.execute;
newCommand.execute = function (context, propertyName, args) {
    let activeSheet = context.getWorkbook().getActiveSheet();
    let sel = activeSheet.getSelections();
    if (sel.rowCount > 1) {
      alert("not allow");
    } else {
      oldExecute.call(this, context, propertyName, args);
    }
};
}
designerConfig.commandMap = {};
designerConfig.commandMap[
GC.Spread.Sheets.Designer.CommandNames.MergeCenter
] = newCommand;

Wilson.Zhang 发表于 2024-12-4 17:37:08

您好!合并之后,保留了单元格原来的数据验证,需要清除原来的数据验证,针对合并后的单元格重新设置数据验证。

长安/ 发表于 2024-12-4 17:54:08

Wilson.Zhang 发表于 2024-12-4 17:37
您好!合并之后,保留了单元格原来的数据验证,需要清除原来的数据验证,针对合并后的单元格重新设置数据验 ...


如何监听到单元格合并事件?
(我用cellChanged, 但是其他的动作也能触发,然后用了这个
      let mergeCenterCommand = GC.Spread.Sheets.Designer.getCommand(GC.Spread.Sheets.Designer.CommandNames.MergeCenter);
      if (mergeCenterCommand) {
      let oldExecute = mergeCenterCommand.execute;
      mergeCenterCommand.execute = function (context, propertyName, args) {
          alert("开始合并单元格")
          //添加confirm逻辑

          oldExecute.call(this, context, propertyName, args);
      }
      }
      var config = GC.Spread.Sheets.Designer.DefaultConfig
      config.commandMap = mergeCenterCommand;
      this.designer.setConfig(config)

还有没有其他的方法?
),
如何清除掉原来的数据验证, 用clear吗, 这个好像是清除整个Excal的?

Wilson.Zhang 发表于 2024-12-5 09:14:54

长安/ 发表于 2024-12-4 17:54
如何监听到单元格合并事件?
(我用cellChanged, 但是其他的动作也能触发,然后用了这个
      let merg ...

可以通过sheet.setDataValidator(row, col, null);将单元格上的数据验证清除。

您需要监听通过UI操作的单元格合并吗?可以通过如下代码监听到大多数UI操作的命令,根据参数command的cmd属性可以了解对应的命令名称,据此可以判断是否为“合并单元格”或“合并后居中”功能按钮被触发了,如果是,在其中定义相关业务逻辑代码。
spread.commandManager().addListener('-', function(args) {
    console.log('args: ', args);
});
如下图所示为“合并单元格”对用的命令监听信息:

长安/ 发表于 2024-12-5 10:56:53

本帖最后由 长安/ 于 2024-12-5 10:58 编辑

Wilson.Zhang 发表于 2024-12-5 09:14
可以通过sheet.setDataValidator(row, col, null);将单元格上的数据验证清除。

您需要监听通过UI操作 ...
合并单元格的时候, 如果合并区域存在有数据验证的单元格, 就提示不允许合并 (自定义的合并, 和设计器上的合并都不允许), 如何处理?

Wilson.Zhang 发表于 2024-12-5 15:24:29

长安/ 发表于 2024-12-5 10:56
合并单元格的时候, 如果合并区域存在有数据验证的单元格, 就提示不允许合并 (自定义的合并, 和设计器上的 ...

我理解遍历目标合并区域中的每个单元格,依次判断单元格是否有数据验证,Worksheet:getDataValidator()返回结果为undefined即无数据验证,反之则有。

对设计器上的合并操作,可以通过在4楼提供给您的监听方式判断合并命令,判断结果为true时执行上述关于单元格是否有数据验证的判断逻辑。对自定义的合并,那就是通过自定义的代码执行,按照上述逻辑合理组织代码先后顺序即可。

长安/ 发表于 2024-12-5 16:16:04

Wilson.Zhang 发表于 2024-12-5 15:24
我理解遍历目标合并区域中的每个单元格,依次判断单元格是否有数据验证,Worksheet:getDataValidator()返 ...

spread.commandManager().addListener('-', function(args) {
    console.log('args: ', args);
});
用这个虽然可以监听到合并事件, 但是并不能打断合并事件
我要的效果是如果监听到某个单元格有数据验证, 就不合并了, 并给他提示

长安/ 发表于 2024-12-5 17:47:47

Joestar.Xu 发表于 2024-12-5 17:39
您好,可以参考以下代码来实现:

let newCommand = GC.Spread.Sheets.Designer.getCommand(


能稍微详细说明一下吗? 谢谢

Wilson.Zhang 发表于 2024-12-6 09:24:10

需要您自定义单元格合并按钮代替工具栏中原有的“合并单元格”菜单选项实现,在自定义的合并单元格命令中检查当前选择的目标合并区域中每个单元格是否有数据验证规则,如果有则提示不允许合并。
页: [1]
查看完整版本: 单元格合并