Ellia.Duan 发表于 2023-2-1 10:29:07

SpreadJS设置只允许粘贴值同时,允许粘贴图片

一些用户有一些业务需求,从外部excel复制一些单元格,粘贴到SpreadJS 时,只允许粘贴值,不允许粘贴格式等。

这时候可以设置
spread.options.allowCopyPasteExcelStyle = false设置此行代码后,发现从excel中复制图片后,无法在SpreadJS中进行粘贴。
如果此时既想保持只复制值,又想可以粘贴图片。为此有两个解决方案
一、在window对象上添加paste事件监听,获取粘贴流,判断此时是否包含图片,如果是的话,将其进行转化,用SpreadJS进行添加图片
      window.addEventListener("paste", function (e) {
            var clipboardData = e.clipboardData;
            var blob = void 0, items = clipboardData.items;
            var text = clipboardData.getData('text/plain');
            if (text) {
                return;
            }
            for (var i = 0; i < items.length; i++) {
                if (items.type.indexOf("image") === 0) {
                  blob = items.getAsFile();
                  if (blob) {
                        break;
                  }
                }
            }
            if (blob) {
                var reader = new FileReader();
                reader.onload = function (event) {
                  var img = new Image();
                  img.src = event.target.result;
                  img.onload = function () {
                        var spread = GC.Spread.Sheets.findControl("ss");
                        var sheet = spread.getActiveSheet();
                        let imgName = "image" + new Date().valueOf();
                        sheet.shapes.addPictureShape(imgName, img.src, 0, 0, img.width, img.height);
                        var pic = sheet.shapes.get(imgName);
                        pic.startRow(sheet.getActiveRowIndex());
                        pic.startColumn(sheet.getActiveColumnIndex());
                  };
                };
                reader.readAsDataURL(blob);
            }
      }, true);但是此方案的弊端是:使用代码执行的添加图片的操作无法进行撤回,即使用ctrl+z 快捷键无法撤回粘贴图片操作。
第二种方案是:
不设置allowCopyPasteExcelStyle
然后从外部excel中ctrl+C复制带格式的单元格时,此时可以在粘贴事件ClipboardPasted中清除其格式。此方案较为简单。
spread.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (sender, args) {
            const {pasteData, cellRange, sheet} = args
            if (!pasteData.image) {
                sheet.getRange(cellRange.row, cellRange.col, cellRange.rowCount, cellRange.colCount).setStyle(new GC.Spread.Sheets.Style());
            }

      });但是此方案的弊端是:原有的SpreadJS粘贴区域如果设置有样式,执行上述操作,也会同时将SpreadJS中设置好的样式清除。
综上所述,两种方案各有利弊,可以按需选择。

MasterJ 发表于 2024-1-29 16:55:03

您好,第一种实现方法,用户在excel中选中三张图片进行粘贴,粘贴到设计器中会合并成一张图片,有什么解决办法吗

Ellia.Duan 发表于 2024-1-29 18:02:03

您好,由于没有复现您的问题,
您可以新发一个帖子,对此问题进行详细描述,
页: [1]
查看完整版本: SpreadJS设置只允许粘贴值同时,允许粘贴图片