Joestar.Xu 发表于 2024-2-27 15:13:06

从Excel复制数据到SpreadJS出现多余空格

部分用户在使用SpreadJS想要从Excel中复制一些数据过来,但是发现有时候会带上空格,数据量不大的话还可以手动处理,但是一旦数据量较大,处理起来就非常困难了,对于这个问题是否有可以解决的方案呢?


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

let copiedText = "";
let clipPasted = false;
let pasteRange;

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

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

if (!navigator.clipboard) {
    setTextArray(copiedText);
}
});

document.querySelector(".preview-excel").addEventListener('paste', function (event) {
if (!navigator.clipboard) {
    if (event.clipboardData) {
      copiedText = event.clipboardData.getData('text');
    } else {
      copiedText = window.clipboardData.getData('text');
    }
    return;
}
if (!clipPasted) return;
let paste = (event.clipboardData || window.clipboardData).getData('text');
setTextArray(paste);
});

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

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

for (var i = 0; i < pasteRange.rowCount; i++) {
    var copyRow = copyText.replace(/\r/, "").split('\t');
    for (var j = 0; j < copyRow.length; j++) {
      if (copyRow === "") {
      copyRow = null;
      }
    }
    textArray.push(copyRow);
}

sheet.suspendPaint();
sheet.suspendDirty();
sheet.suspendEvent();

console.log(textArray);
for (let i = 0; i < textArray.length; i++) {
    for (let j = 0; j < textArray.length; j++) {
      sheet.setText(i + pasteRange.row, j + pasteRange.col, textArray);
    }
}

sheet.resumeEvent();
sheet.resumeDirty();
sheet.resumePaint();
};

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

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

Joestar.Xu 发表于 2024-7-24 14:20:32

也可参考:

let oldSetValue = GC.Spread.Sheets.Worksheet.prototype.setValue;
GC.Spread.Sheets.Worksheet.prototype.setValue = function (
row,
col,
value,
sheetArea,
ignoreRecalc
) {
console.log(row, col, value);
if (value == " ") {
    value = null;
}
console.log(row, col, value);
oldSetValue.call(this, row, col, value, sheetArea, ignoreRecalc);
};

athenadeveloper 发表于 2024-11-8 11:18:58

Joestar.Xu 发表于 2024-7-24 14:20
也可参考:
这种方式是否无法区分用户数据的空格还是copy加上的空格?

Joestar.Xu 发表于 2024-11-8 17:41:05

是的,无法区分。

不过一般情况下,客户给单元格中添加单纯的空格也没有实际意义。
页: [1]
查看完整版本: 从Excel复制数据到SpreadJS出现多余空格