Ellia.Duan 发表于 2024-7-26 13:59:37

利用字体插入特殊符号(二)

本帖最后由 Ellia.Duan 于 2024-7-29 13:34 编辑

在上一篇文章中,我们介绍到可以利用"Wingdings 2 "在表格中插入一些符号。但是对于普通用户来说,让他们去记忆符号对应的键盘值,无疑是困难的。

为此,我们可以在工具栏中添加图标下拉选择,选中后设置富文本,添加这个符号。
我们想要实现这个效果,如下图所示,该如何实现呢?

我们观察上图,除了其余部分是可以输入文字实现的。我们接下来处理,如何插入复选框符号。

1、定义菜单

我们先来实现如上图所示的一个工具栏菜单。
      var config = JSON.parse(JSON.stringify(GC.Spread.Sheets.Designer.DefaultConfig));
      let fontIconConfig = {
            label: "字符集",
            commandGroup: {
                commands: ["setFontIcon"],
            }
      };
      config.ribbon.buttonGroups.splice(config.ribbon.buttonGroups.length - 1, 0, fontIconConfig);
      let fontIconCammands = {
            setFontIcon: {
                bigButton: "=ribbonHeight>toolbarHeight",
                commandName: "setFontIcon",
                direction: "=IF(ribbonHeight<toolbarHeight,\"horizontal\",\"vertical\")",
                dropdownList: [
                  {
                        groupName: "Wingdings 2",
                        groupItems: [{
                            iconClass: "iconfont icon-checkbox",
                            iconHeight: 20,
                            iconWidth: 14,
                            tip: "勾选",
                            value: "R"
                        }, {
                            iconClass: "iconfont icon-uncheckbox",
                            iconHeight: 20,
                            iconWidth: 14,
                            tip: "不勾选",
                            value: "£"
                        }
                        ],
                  },
                ],
                // iconClass: "ribbon-button-shapes",
                text: "字符",
                title: "插入字符",
                type: "dropdown",
                iconClass: "icon-custom-special-symbol",

                execute: async (context, selectValue) => {
                        console.log(selectValue)
                },
            },
      };
      config.commandMap = {}
      Object.assign(config.commandMap, fontIconCammands)
      var designer = new GC.Spread.Sheets.Designer.Designer("gc-designer-container", config)通过上述代码,我们便实现了插入符号的菜单功能,这里就不详细介绍具体的实现细节,具体可以参考这篇文章。
2、重写execute
if (selectValue != null && selectValue != undefined) {
                        let sheet = context.getWorkbook().getActiveSheet(),
                            row = sheet.getActiveRowIndex(),
                            col = sheet.getActiveColumnIndex()
                        let value = sheet.getValue(row, col, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.ValueType.richText)

                        let richText = [
                            {
                              style: {
                                    font: '16px "Wingdings 2"',
                                    foreColor: "rgb(0, 0, 0)",
                                    textDecoration: 0
                              },
                              text: selectValue,
                            }
                        ]
                        if (value && value.richText) {
                            richText.unshift(...value.richText)
                        } else {
                            richText.unshift({text: sheet.getValue(row, col) == null ? '' : sheet.getValue(row, col) + ''})
                        }
                        let text = richText.map(item => item.text)
                        let newValue = {richText, text: text.join("")}
                        sheet.setValue(row, col, newValue, GC.Spread.Sheets.SheetArea.viewport);
                  }
在上述代码中,我们重写了富文本,添加了字符样式,并重新setValue
3、双击打开富文本编辑器
在双击事件中,判断如果当前单元格存在富文本,则打开富文本编辑器,如下代码:
sheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, function (e, info) {
            let value = sheet.getValue(info.row, info.col, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.ValueType.richText)
            if (value && value.richText) {
                spread.commandManager().execute({
                  cmd: "richText",
                  sheetName: sheet.name(),
                  row: info.row,
                  col: info.col
                });
            }

      });

最后,由于菜单中无法获取单元格的焦点,所以会在单元格文本内容最后插入符号,如果有在文本中间内容插入符号的需求,可以剪切到相应位置。
完整代码可以参考附件的demo:
页: [1]
查看完整版本: 利用字体插入特殊符号(二)