找回密码
 立即注册

QQ登录

只需一步,快速开始

Ellia.Duan SpreadJS 开发认证
超级版主   /  发表于:2023-2-1 10:29  /   查看:1149  /  回复:2
一些用户有一些业务需求,从外部excel复制一些单元格,粘贴到SpreadJS 时,只允许粘贴值,不允许粘贴格式等。

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

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

2 个回复

倒序浏览
MasterJ
注册会员   /  发表于:2024-1-29 16:55:03
沙发
您好,第一种实现方法,用户在excel中选中三张图片进行粘贴,粘贴到设计器中会合并成一张图片,有什么解决办法吗
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-1-29 18:02:03
板凳
您好,由于没有复现您的问题,
您可以新发一个帖子,对此问题进行详细描述,
三个图片.gif
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部