Winny 发表于 2022-2-8 17:03:30

SpreadJS编辑器插入特殊字符

本帖最后由 Winny 于 2022-2-8 17:03 编辑

SpreadJS从V12之后,增加了对富文本的支持,不仅可以导入导出Excel中的富文本内容,也可以通过API的像是设置富文本。富文本的支持很好的解决了文档中上下标的问题及单元格导出PDF时,特殊字符乱码的问题。
但在当前的电子文档中,不少文档开始应用一些好看实用的图标字体,以阿里的iconfont为例,该网站是阿里打造的矢量图标管理、交流平台,设计师将图标上传到iconfont平台,用户可以自定义下载多种格式的icon,平台也可以将图标转换为字体,便于前端工程师自由调整和调用。
在一些特殊行业中,往往需要将某些特殊符号插入到单元格当中,在SpreadJS中插入这些特殊符号可以参考文章SpreadJS通过自定义字体解决文档中特殊字符的问题。本文侧重于介绍如何将iconfont中自己喜欢的一些图标插入到SpreadJS单元格中。
step1: 创建自己需要的图标字符集;

登录iconfont,在iconfont上挑选自己想要的图标添加到右上方购物车中(鼠标悬浮在图标上会出现加入购物车的提示浮层)。

step2: 将自己选中的字符集下载到本地;

下载完成后的目录结构如下图所示:

文件中提供的demo_index.html是在网站上使用该字体的一些介绍说明,感兴趣的同学可以仔细地阅读一下这部分。iconfont.ttf是这些图标对应的字体文件,我们在SpreadJS中也主要使用的是这个字体文件。以上两步更多的是iconfont的使用,如果有什么不了解的自行百度即可。

step3:创建包含在线编辑器的工程;
使用自己熟悉的方式创建一个包含编辑器的工程。

step4: 将下载好的图标字体中的ttf文件和css引用到项目当中;

css可以结合自己的业务在定义字体时做一些微调。

step4:创建编辑器并在编辑器中增加插入特殊字符的菜单项;首先,需要在编辑器的ribbon中加入特殊字符集的操作组,核心代码如下:
var designer = new GC.Spread.Sheets.Designer.Designer("gc-designer-container");
      var config = GC.Spread.Sheets.Designer.DefaultConfig;
      // 插入tab添加插入特殊字符
      var fontIconConfig = {
            "label": "字符集",
            commandGroup: {
                "commands": [
                  "setFontIcon",
                ]
            }
      };
      config.ribbon.buttonGroups.splice(config.ribbon.buttonGroups.length - 1, 0, fontIconConfig)接下来设置对应的操作特殊字符的菜单项,并编写setFontIcon命令,关于自定义编辑器添加操作项可以参考自定义编辑器汇总,本帖不做详细介绍,核心的代码如下:
config.commandMap = {}
      var fontIconCammands = {
            "setFontIcon": {
                text: "特殊字符",
                title: "插入特殊字符",
                type: "dropdown",
                bigButton: "=ribbonHeight>toolbarHeight",
                iconClass: "ribbon-button-fontIcon",
                commandName: "setFontIcon",
                direction: "=IF(ribbonHeight<toolbarHeight,\"horizontal\",\"vertical\")",
                dropdownList: [
                  {
                        groupName: "Spring",
                        groupItems: [{
                            iconClass: "iconfont icon-chunlianer",
                            iconHeight: 20,
                            iconWidth: 14,
                            value: "iconfont-" + String.fromCharCode(parseInt("e6b5", 16))
                        }, {
                            iconClass: "iconfont icon-denglongyi",
                            iconHeight: 20,
                            iconWidth: 14,
                            value: "iconfont-" + String.fromCharCode(parseInt("e6b7", 16))
                        }
                        ],
                  },
                ],
                execute: async (context, selectValue) => {
                  if (selectValue != null && selectValue != undefined) {
                        let newFont = selectValue.split("-"),
                            content = selectValue.split("-");
                        let sheet = context.Spread.getActiveSheet(),
                            row = sheet.getActiveRowIndex(),
                            col = sheet.getActiveColumnIndex(),
                            cell = sheet.getCell(row, col),
                            font = cell.font();
                        var span = document.createElement("span");
                        span.style.font = font;
                        span.style.fontFamily = newFont;
                        var iconFont = span.style.font;

                        let value = sheet.getValue(row, col, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.ValueType.richText);
                        if (value === null || value === undefined) {
                            value = { richText: [{ style: { font: iconFont }, text: content }] };
                        }else if (value instanceof Object && value.richText) {
                            let rt = value.richText;
                            if (rt.length > 1 && rt.style) {
                              let exStyle = JSON.parse(JSON.stringify(rt.style));
                              if (rt.style.font) {
                                    var span = document.createElement("span");
                                    span.style.font = rt.style.font;
                                    span.style.fontFamily = newFont;
                                    exStyle.font = span.style.font;
                              }
                              else {
                                    exStyle.font = iconFont;
                              }
                              rt.push({ style: exStyle, text: content });
                            }
                            else {
                              rt.push({ style: { font: iconFont }, text: content });
                            }
                        }
                        else {
                            value = {
                              richText: [
                                    { style: { font: font }, text: value },
                                    { style: { font: iconFont }, text: content }]
                            };
                        }

                        context.Spread.commandManager().execute({ cmd: "editCell", sheetName: sheet.name(), row: row, col: col, newValue: value });
                  }
                },
                getState: (context) => {
                  return "";
                }

            }
      }

      Object.assign(config.commandMap, fontIconCammands)
      designer.setConfig(config)
通过上述几步操作就可实现在SpreadJS编辑器中插入图表字符的需求了,具体的实现效果如下:


测试项目见文章末尾。


页: [1]
查看完整版本: SpreadJS编辑器插入特殊字符