Clark.Pan 发表于 2024-7-18 12:33:49

SpreadJS实现跨Workbook复制公式的功能

背景:

将SpreadJS中的公式复制到SpreadJS外部的区域(线下 Excel 或 另一个Spread中)时,会发现只能粘贴公式计算的结果,公式无法粘贴到外部。


本教程将讲解如何实现将公式粘贴至SpreadJS外部。

原因:

SpreadJS外部复制粘贴采用的是浏览器源生的复制粘贴功能,即 Ctrl+C Ctrl+V。浏览器源生在复制的时候并不认识公式,所以不会将公式记入剪切板中。

解决方案:

我们可以利用 SpreadJS 提供的 showFormula 方法,通过该方法可以将单元格中的公式和计算结果进行切换。因为浏览器剪切板会记录单元格中的内容,切换成公式后就可以顺理成章的记录公式。粘贴到线下 Excel 或 另一个Spread中时,由于两者都具有公式引擎,粘贴上去后公式会立即进行计算,从而达到复制公式的效果。

那么接下来我们需要做的就是将 showFormula 与复制的操作集成起来,让用户使用时尽可能不用做额外的操作。

基于SpreadJS的高扩展性,我们可以重写复制时执行的命令。此处由于我们只是在命令上额外执行showFormula的操作,我们需要先将原始的复制命令用变量缓存起来。在执行showFormula的操作之后,再去执行原始的复制命令。并且在执行之后,我们需要还原之前的showFormula设置,完整代码如下:
var oldcopy = GC.Spread.Sheets.Commands.copy.execute
        GC.Spread.Sheets.Commands.copy.execute = function(context,options){
                var sheet = context.getSheetFromName(options.sheetName);
                var showFormulasFlag = sheet.options.showFormulas;
                if(!showFormulasFlag){
                        sheet.options.showFormulas = !showFormulasFlag;
                }
                oldcopy.apply(this, arguments);
                setTimeout(function(){
                        sheet.options.showFormulas = showFormulasFlag;
                },0)
               
        }

以上操作可以实现复制公式到工作簿外部的功能,但有两点需要注意:


1.复制后的公式不会随着粘贴位置发生相对位移变化。

2.复制的时候由于设置showFormula会改变单元格的显示,复制单元格会闪一下。



页: [1]
查看完整版本: SpreadJS实现跨Workbook复制公式的功能