一些用户有一些业务需求,从外部excel复制一些单元格,粘贴到SpreadJS 时,只允许粘贴值,不允许粘贴格式等。
这时候可以设置
- spread.options.allowCopyPasteExcelStyle = false
复制代码 设置此行代码后,发现从excel中复制图片后,无法在SpreadJS中进行粘贴。
如果此时既想保持只复制值,又想可以粘贴图片。为此有两个解决方案
一、在window对象上添加paste事件监听,获取粘贴流,判断此时是否包含图片,如果是的话,将其进行转化,用SpreadJS进行添加图片
- window.addEventListener("paste", function (e) {
- var clipboardData = e.clipboardData;
- var blob = void 0, items = clipboardData.items;
- var text = clipboardData.getData('text/plain');
- if (text) {
- return;
- }
- for (var i = 0; i < items.length; i++) {
- if (items[i].type.indexOf("image") === 0) {
- blob = items[i].getAsFile();
- if (blob) {
- break;
- }
- }
- }
- if (blob) {
- var reader = new FileReader();
- reader.onload = function (event) {
- var img = new Image();
- img.src = event.target.result;
- img.onload = function () {
- var spread = GC.Spread.Sheets.findControl("ss");
- var sheet = spread.getActiveSheet();
- let imgName = "image" + new Date().valueOf();
- sheet.shapes.addPictureShape(imgName, img.src, 0, 0, img.width, img.height);
- var pic = sheet.shapes.get(imgName);
- pic.startRow(sheet.getActiveRowIndex());
- pic.startColumn(sheet.getActiveColumnIndex());
- };
- };
- reader.readAsDataURL(blob);
- }
- }, true);
复制代码 但是此方案的弊端是:使用代码执行的添加图片的操作无法进行撤回,即使用ctrl+z 快捷键无法撤回粘贴图片操作。
第二种方案是:
不设置allowCopyPasteExcelStyle
然后从外部excel中ctrl+C复制带格式的单元格时,此时可以在粘贴事件ClipboardPasted中清除其格式。此方案较为简单。
- spread.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (sender, args) {
- const {pasteData, cellRange, sheet} = args
- if (!pasteData.image) {
- sheet.getRange(cellRange.row, cellRange.col, cellRange.rowCount, cellRange.colCount).setStyle(new GC.Spread.Sheets.Style());
- }
- });
复制代码 但是此方案的弊端是:原有的SpreadJS粘贴区域如果设置有样式,执行上述操作,也会同时将SpreadJS中设置好的样式清除。
综上所述,两种方案各有利弊,可以按需选择。
|
|