部分用户在使用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[i].replace(/\r/, "").split('\t');
- for (var j = 0; j < copyRow.length; j++) {
- if (copyRow[j] === "") {
- copyRow[j] = 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[i].length; j++) {
- sheet.setText(i + pasteRange.row, j + pasteRange.col, textArray[i][j]);
- }
- }
- sheet.resumeEvent();
- sheet.resumeDirty();
- sheet.resumePaint();
- };
复制代码
以上代码分别对SpreadJS和SpreadJS的容器设置了事件监听,可能有部分小伙伴看到过之前的帖子(https://gcdn.grapecity.com.cn/showtopic-88616-1-1.html),对这段代码非常的眼熟。
之前帖子中的代码有一个致命的缺陷,在复制数值单元格到SpreadJS中的时候你会发现数值被存储为了字符串,这并不是我们想要的效果,因此将原来方法中的setArray换成了setText来实现,这样就可以解决这个问题了。
|
|