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]