从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来实现,这样就可以解决这个问题了。
也可参考:
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);
}; Joestar.Xu 发表于 2024-7-24 14:20
也可参考:
这种方式是否无法区分用户数据的空格还是copy加上的空格? 是的,无法区分。
不过一般情况下,客户给单元格中添加单纯的空格也没有实际意义。
页:
[1]