找回密码
 立即注册

QQ登录

只需一步,快速开始

鸳鸯配2024
金牌服务用户   /  发表于:2024-7-31 11:44:42
11#
本帖最后由 鸳鸯配2024 于 2024-7-31 13:55 编辑
Wilson.Zhang 发表于 2024-7-31 11:23
您好!提供给您的demo中的“自定义删除列”菜单选项在鼠标右键列头时出现的菜单中。

看到了。但不知道为什么,放到我代码里面去,就会报错。 Cannot read properties of undefined (reading 'visibleContext')


1722397388448.png636000976.png

然后我看到。你的dome版本是16.但我的代码版本是17,不知道是不是版本的问题。


还有一个区别就是我可能用的是表格编辑器。有工具栏这块,你发的dome是没有的。不知道2者语法上有什么不一样
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-7-31 15:33:03
12#
鸳鸯配2024 发表于 2024-7-31 11:44
看到了。但不知道为什么,放到我代码里面去,就会报错。 Cannot read properties of undefined (reading  ...

您使用的是在线表格编辑器,我发给您的demo是在SpreadJS中自定义右键菜单,两者存在差异但实现效果类似。在线表格编辑器将工具栏和右键菜单选项全部集成为配置项,由GC.Spread.Sheets.Designer.DefaultConfig管理,通常对DefaultConfig新增配置项以扩展自定义右键菜单选项和自定义工具栏选项。visibleContext是在线表格编辑器中控制菜单选项是否可见的属性名称,相关属性为true是对应的菜单选项可见,反之不可见。
您可以参考官网教程了解详情:
https://demo.grapecity.com.cn/sp ... textMenu/insertrows
回复 使用道具 举报
鸳鸯配2024
金牌服务用户   /  发表于:2024-7-31 16:09:13
13#
Wilson.Zhang 发表于 2024-7-31 15:33
您使用的是在线表格编辑器,我发给您的demo是在SpreadJS中自定义右键菜单,两者存在差异但实现效果类似。 ...

给你看下我的代码,直接拿过来了,还是不生效,不知道哪里问题,我把我的代码贴出来,你帮忙看下。这样我能更好的理解一些,然后有没有表格编辑器相关的视频可以看啊,我看到的好像都是spreadJS 的视频,这样对于初学者来说,很容易搞混。


  1. HTML 相关的
复制代码
  1. import '@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css'
  2. import '@grapecity/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css'
  3. import GC from '@grapecity/spread-sheets'
  4. import '@grapecity/spread-sheets-shapes'
  5. import '@grapecity/spread-sheets-charts'
  6. import '@grapecity/spread-sheets-slicers'
  7. import '@grapecity/spread-sheets-print'
  8. import '@grapecity/spread-sheets-barcode'
  9. import '@grapecity/spread-sheets-tablesheet'
  10. import '@grapecity/spread-sheets-formula-panel'
  11. import '@grapecity/spread-sheets-io'
  12. import '@grapecity/spread-sheets-resources-zh'
  13. import '@grapecity/spread-sheets-designer-resources-cn'
  14. import GCDesigner from '@grapecity/spread-sheets-designer'
复制代码
  1. GC.Spread.Common.CultureManager.culture('zh-cn')

  2.   // Designer实例
  3. let designer = GCDesigner.Spread.Sheets.Designer.Designer
  4. let spread = GC.Spread.Sheets.Workbook

  5. onMounted(() => {
  6. let config = GC.Spread.Sheets.Designer.DefaultConfig;
  7.     config.commandMap = {};
  8.     config.commandMap.batchInsertRowContextMenu = {
  9.         text: '批量插入',
  10.         commandName: "batchInsertRowContextMenu",
  11.         visibleContext: "ClickRowHeader",
  12.         subCommands: [
  13.             "batchInsertRows10",
  14.             "batchInsertRows50",
  15.             "batchInsertRows100"
  16.         ]
  17.     };
  18.     config.commandMap.batchInsertRows10 = {
  19.         text: '插入 10 行',
  20.         commandName: "batchInsertRows10",
  21.         execute: async (context, propertyName, fontItalicChecked) => {
  22.             var commandManager = context.Spread.commandManager();
  23.             commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:10});       
  24.         }
  25.     };

  26.     config.commandMap.batchInsertRows50 = {
  27.         text: '插入 50 行',
  28.         commandName: "batchInsertRows50",
  29.         execute: async (context, propertyName, fontItalicChecked) => {
  30.             var commandManager = context.Spread.commandManager();
  31.             commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:50});       
  32.         }
  33.     };

  34.     config.commandMap.batchInsertRows100 = {
  35.         text: '插入 100 行',
  36.         commandName: "batchInsertRows100",
  37.         execute: async (context, propertyName, fontItalicChecked) => {
  38.             var commandManager = context.Spread.commandManager();
  39.             commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:100});       
  40.         }
  41.     };
  42.    
  43.     config.contextMenu.push("batchInsertRowContextMenu");
  44.    
  45.     config.commandMap["gc.spread.contextMenu.insertRows"] = {
  46.         commandName: "myInsertRows",
  47.         enableContext: "AllowInsertRows && selectFullRows",
  48.         text: "插入",
  49.         visibleContext: "ClickRowHeader && !AllowInsertCopiedCutCells",
  50.         execute: async (context, propertyName) => {
  51.             var commandManager = context.Spread.commandManager();
  52.             commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:1});       
  53.         }
  54.     };

  55.     // designer = new GCDesigner.Spread.Sheets.Designer.Designer('designer-container',config);
  56.     designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("designer-container"), config);
  57.     spread = designer.getWorkbook();
  58.     var commandManager = spread.commandManager();
  59.     let insertRowAndCopyContent = {
  60.         canUndo: true,
  61.         execute: function (context, options, isUndo) {
  62.             let Commands = GC.Spread.Sheets.Commands;
  63.             options.cmd = "insertRowAndCopyContent";
  64.             console.log(options, '--options---')
  65.             if (isUndo) {
  66.                 Commands.undoTransaction(context, options);
  67.                 return true;
  68.             } else {
  69.                 Commands.startTransaction(context, options);
  70.                 context.suspendPaint();
  71.                 context.suspendEvent();
  72.                 var sheet = context.getSheetFromName(options.sheetName);
  73.                 var selections = sheet.getSelections();
  74.                
  75.                 for(var i = 0; i < selections.length; i++){
  76.                     var row = selections[i].row;
  77.                     sheet.addRows(row,options.rowCount);
  78.                     var fromRange = [new GC.Spread.Sheets.Range(row + options.rowCount, 0, 1, sheet.getColumnCount())];
  79.                     var toRanges = [new GC.Spread.Sheets.Range(row, 0, options.rowCount, sheet.getColumnCount())];
  80.                     spread.commandManager().execute({cmd: "clipboardPaste", sheetName: options.sheetName, fromSheet: sheet, fromRanges: fromRange, pastedRanges: toRanges, isCutting: false, clipboardText: "", pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.formulasAndFormatting});
  81.                 }
  82.                
  83.                 context.resumeEvent();
  84.                 context.resumePaint();
  85.                 Commands.endTransaction(context, options);
  86.                 return true;
  87.             }
  88.             }
  89.     };
  90.     var commandManager = spread.commandManager();
  91.     commandManager.register("insertRowAndCopyContent", insertRowAndCopyContent);
  92. })
复制代码
1722413327209.png189703368.png

我是把这个dome下载下来后,把里面的代码,copy进去,还是没有生效。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-7-31 18:09:04
14#
鸳鸯配2024 发表于 2024-7-31 16:09
给你看下我的代码,直接拿过来了,还是不生效,不知道哪里问题,我把我的代码贴出来,你帮忙看下。这样我 ...

好的,容我研究一下!
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-8-1 09:31:48
15#
鸳鸯配2024 发表于 2024-7-31 16:09
给你看下我的代码,直接拿过来了,还是不生效,不知道哪里问题,我把我的代码贴出来,你帮忙看下。这样我 ...

您好!您复制的官网教程中的代码新增的自定义菜单选项仅在右键点击行头时出现的菜单中,如下图所示:

1722475266661.png913894653.png

根据您提供的是代码片段,稍作调整,请参考如下代码:
  1. GC.Spread.Common.CultureManager.culture('zh-cn')

  2.                           // Designer实例
  3. let designer;
  4. let spread;

  5.                         let config = GC.Spread.Sheets.Designer.DefaultConfig;
  6.                             config.commandMap = {};
  7.                             config.commandMap.batchInsertRowContextMenu = {
  8.                                 text: '批量插入',
  9.                                 commandName: "batchInsertRowContextMenu",
  10.                                 visibleContext: "ClickRowHeader",
  11.                                 subCommands: [
  12.                                     "batchInsertRows10",
  13.                                     "batchInsertRows50",
  14.                                     "batchInsertRows100"
  15.                                 ]
  16.                             };
  17.                             config.commandMap.batchInsertRows10 = {
  18.                                 text: '插入 10 行',
  19.                                 commandName: "batchInsertRows10",
  20.                                 execute: async (context, propertyName, fontItalicChecked) => {
  21.                                     var commandManager = context.Spread.commandManager();
  22.                                     commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:10});        
  23.                                 }
  24.                             };

  25.                             config.commandMap.batchInsertRows50 = {
  26.                                 text: '插入 50 行',
  27.                                 commandName: "batchInsertRows50",
  28.                                 execute: async (context, propertyName, fontItalicChecked) => {
  29.                                     var commandManager = context.Spread.commandManager();
  30.                                     commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:50});        
  31.                                 }
  32.                             };

  33.                             config.commandMap.batchInsertRows100 = {
  34.                                 text: '插入 100 行',
  35.                                 commandName: "batchInsertRows100",
  36.                                 execute: async (context, propertyName, fontItalicChecked) => {
  37.                                     var commandManager = context.Spread.commandManager();
  38.                                     commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:100});        
  39.                                 }
  40.                             };
  41.                             
  42.                             config.contextMenu.push("batchInsertRowContextMenu");
  43.                             
  44.                             config.commandMap["gc.spread.contextMenu.insertRows"] = {
  45.                                 commandName: "myInsertRows",
  46.                                 enableContext: "AllowInsertRows && selectFullRows",
  47.                                 text: "插入",
  48.                                 visibleContext: "ClickRowHeader && !AllowInsertCopiedCutCells",
  49.                                 execute: async (context, propertyName) => {
  50.                                     var commandManager = context.Spread.commandManager();
  51.                                     commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:1});        
  52.                                 }
  53.                             };

  54.                             designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("gc-designer-container"), config);
  55.                             spread = designer.getWorkbook();
  56.                             var commandManager = spread.commandManager();
  57.                             let insertRowAndCopyContent = {
  58.                                 canUndo: true,
  59.                                 execute: function (context, options, isUndo) {
  60.                                     let Commands = GC.Spread.Sheets.Commands;
  61.                                     options.cmd = "insertRowAndCopyContent";
  62.                                     console.log(options, '--options---')
  63.                                     if (isUndo) {
  64.                                         Commands.undoTransaction(context, options);
  65.                                         return true;
  66.                                     } else {
  67.                                         Commands.startTransaction(context, options);
  68.                                         context.suspendPaint();
  69.                                         context.suspendEvent();
  70.                                         var sheet = context.getSheetFromName(options.sheetName);
  71.                                         var selections = sheet.getSelections();
  72.                                         
  73.                                         for(var i = 0; i < selections.length; i++){
  74.                                             var row = selections[i].row;
  75.                                             sheet.addRows(row,options.rowCount);
  76.                                             var fromRange = [new GC.Spread.Sheets.Range(row + options.rowCount, 0, 1, sheet.getColumnCount())];
  77.                                             var toRanges = [new GC.Spread.Sheets.Range(row, 0, options.rowCount, sheet.getColumnCount())];
  78.                                             spread.commandManager().execute({cmd: "clipboardPaste", sheetName: options.sheetName, fromSheet: sheet, fromRanges: fromRange, pastedRanges: toRanges, isCutting: false, clipboardText: "", pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.formulasAndFormatting});
  79.                                         }
  80.                                         
  81.                                         context.resumeEvent();
  82.                                         context.resumePaint();
  83.                                         Commands.endTransaction(context, options);
  84.                                         return true;
  85.                                     }
  86.                                     }
  87.                             };
  88.                             var commandManager = spread.commandManager();
  89.                             commandManager.register("insertRowAndCopyContent", insertRowAndCopyContent);
复制代码
另外,在开头的designer和spread的声明代码的正确方式应该如下代码所示:
  1. let designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("designer-container"), config);
  2. let spread = designer.getWorkbook();
复制代码


回复 使用道具 举报
鸳鸯配2024
金牌服务用户   /  发表于:2024-8-1 10:35:19
16#
Wilson.Zhang 发表于 2024-8-1 09:31
您好!您复制的官网教程中的代码新增的自定义菜单选项仅在右键点击行头时出现的菜单中,如下图所示:

...

看了下,功能确实没问题。但是会有个新的问题。
其它方法里面会获取不到 全局 spread  的方法.。获取到的designerspread 都是 undefined
在其它方法里面,用 spread 的时候,是这样写的

  1. let designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("designer-container"));
  2. let spread = designer.getWorkbook();
复制代码
但里面的很多方法都不执行。




回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-8-1 11:33:01
17#
鸳鸯配2024 发表于 2024-8-1 10:35
看了下,功能确实没问题。但是会有个新的问题。
其它方法里面会获取不到 全局 spread  的方法.。获取到 ...

您已经使用<div>创建了Designer,那在其他地方使用Designer时可以通过GC.Spread.Sheets.Designer.findControl('div元素ID')获取已经创建好的Designer实例,再通过Designer获取Workbook实例。所以,不用重新创建。
还有一个方式,在其他方法的参数列表中增加designer和spread分别代表Designer实例和Workbook实例。
回复 使用道具 举报
鸳鸯配2024
金牌服务用户   /  发表于:2024-8-1 17:55:15
18#
Wilson.Zhang 发表于 2024-8-1 11:33
您已经使用创建了Designer,那在其他地方使用Designer时可以通过GC.Spread.Sheets.Designer.findControl( ...

试过了,好奇怪。没有报错,但新加右键功能,就没有了。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-8-1 17:57:18
19#
鸳鸯配2024 发表于 2024-8-1 17:55
试过了,好奇怪。没有报错,但新加右键功能,就没有了。

您的意思是说现在又没有自定义新增的右键菜单选项了吗?
回复 使用道具 举报
鸳鸯配2024
金牌服务用户   /  发表于:2024-8-2 14:02:05
20#
Wilson.Zhang 发表于 2024-8-1 17:57
您的意思是说现在又没有自定义新增的右键菜单选项了吗?

是的,就是这样子,所以觉得很奇怪。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部