找回密码
 立即注册

QQ登录

只需一步,快速开始

Joestar.Xu SpreadJS 开发认证
超级版主   /  发表于:2024-2-27 15:13  /   查看:1488  /  回复:3
部分用户在使用SpreadJS想要从Excel中复制一些数据过来,但是发现有时候会带上空格,数据量不大的话还可以手动处理,但是一旦数据量较大,处理起来就非常困难了,对于这个问题是否有可以解决的方案呢?


由于SpreadJS在从外部进行复制粘贴时会直接读取系统的剪切板,所以要从Clipboard相关事件入手来解决这个问题。

  1. let copiedText = "";
  2. let clipPasted = false;
  3. let pasteRange;

  4. spread.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (sender, args) {
  5.   clipPasted = false;

  6.   if (args.pasteData.html != "" && args.pasteData.text != "") {
  7.     clipPasted = true;
  8.     pasteRange = args.cellRange;
  9.   }

  10.   if (!navigator.clipboard) {
  11.     setTextArray(copiedText);
  12.   }
  13. });

  14. document.querySelector(".preview-excel").addEventListener('paste', function (event) {
  15.   if (!navigator.clipboard) {
  16.     if (event.clipboardData) {
  17.       copiedText = event.clipboardData.getData('text');
  18.     } else {
  19.       copiedText = window.clipboardData.getData('text');
  20.     }
  21.     return;
  22.   }
  23.   if (!clipPasted) return;
  24.   let paste = (event.clipboardData || window.clipboardData).getData('text');
  25.   setTextArray(paste);
  26. });

  27. function setTextArray(paste) {
  28.   let sheet = spread.getActiveSheet();

  29.   var textArray = [];
  30.   var copyText = paste.split('\n');

  31.   for (var i = 0; i < pasteRange.rowCount; i++) {
  32.     var copyRow = copyText[i].replace(/\r/, "").split('\t');
  33.     for (var j = 0; j < copyRow.length; j++) {
  34.       if (copyRow[j] === "") {
  35.         copyRow[j] = null;
  36.       }
  37.     }
  38.     textArray.push(copyRow);
  39.   }

  40.   sheet.suspendPaint();
  41.   sheet.suspendDirty();
  42.   sheet.suspendEvent();

  43.   console.log(textArray);
  44.   for (let i = 0; i < textArray.length; i++) {
  45.     for (let j = 0; j < textArray[i].length; j++) {
  46.       sheet.setText(i + pasteRange.row, j + pasteRange.col, textArray[i][j]);
  47.     }
  48.   }

  49.   sheet.resumeEvent();
  50.   sheet.resumeDirty();
  51.   sheet.resumePaint();
  52. };
复制代码


以上代码分别对SpreadJS和SpreadJS的容器设置了事件监听,可能有部分小伙伴看到过之前的帖子(https://gcdn.grapecity.com.cn/showtopic-88616-1-1.html),对这段代码非常的眼熟。

之前帖子中的代码有一个致命的缺陷,在复制数值单元格到SpreadJS中的时候你会发现数值被存储为了字符串,这并不是我们想要的效果,因此将原来方法中的setArray换成了setText来实现,这样就可以解决这个问题了。

3 个回复

倒序浏览
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-7-24 14:20:32
沙发
也可参考:

  1. let oldSetValue = GC.Spread.Sheets.Worksheet.prototype.setValue;
  2. GC.Spread.Sheets.Worksheet.prototype.setValue = function (
  3.   row,
  4.   col,
  5.   value,
  6.   sheetArea,
  7.   ignoreRecalc
  8. ) {
  9.   console.log(row, col, value);
  10.   if (value == " ") {
  11.     value = null;
  12.   }
  13.   console.log(row, col, value);
  14.   oldSetValue.call(this, row, col, value, sheetArea, ignoreRecalc);
  15. };
复制代码
回复 使用道具 举报
athenadeveloper
注册会员   /  发表于:2024-11-8 11:18:58
板凳

这种方式是否无法区分用户数据的空格还是copy加上的空格?
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-11-8 17:41:05
地板
是的,无法区分。

不过一般情况下,客户给单元格中添加单纯的空格也没有实际意义。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部