Fiooona 发表于 2020-9-22 17:06:00

SpreadJS 如何导入跨表公式,保留值忽略错误公式

用户问题:spreadjs可以在加载excel的时候选择不导入公式但是这个是针对于整个excel的,如何能实现针对特定的公式不导入?
背景:spreadjs不支持跨表公式,但是导入的时候如果选择不导入公式,是能够取到跨表公式最终结果的。
         我想在excel加载的时候,如果公式是跨表公式则直接转换为值,其他公式则正常。
思路: 在excelIo.open方法中可以获取到单元格中的公式及值,新建一个临时的Spread,fromJSON时忽略公式,在正式的表单中遍历所有单元格,匹配到用了跨表格公式的单元格,将其中的公式清空,设置值。
导入有跨表格的公式的Excel,会出现#REF的公式报错:

实现效果如下图所示,在Excel中设置了一些跨表格的公式,和未跨表格的公式:


导入SpreadJS 之后,可以保留普通公式,并将外部引用的公式替换为值:

关键代码:
excelIo.open(excelFile, function (json) {
            var workbookObj = json;
            var tempspread = new GC.Spread.Sheets.Workbook();
            tempspread.fromJSON(workbookObj,{ignoreFormula: true})
            spread.fromJSON(workbookObj);
            debugger
            for(var i = 0;i< tempspread.getSheetCount();i++){
                var sheet =tempspread.getSheet(i);
                var colcount= tempspread.getSheet(i).getColumnCount();
                var rowcount= tempspread.getSheet(i).getRowCount();
                for(var j = 0;j<rowcount;j++){
                  for(vark=0;k<colcount;k++){
                        if(spread.getSheet(i).getFormula(j,k)){
                            //正则匹配 表单中有[数字]这样格式的公式为外部引用
                            if((spread.getSheet(i).getFormula(j,k)).match(/\[\d\]/g)){
                                    var value= tempspread.getSheet(i).getValue(j,k)
                            spread.getSheet(i).setFormula(j,k,null);
                            spread.getSheet(i).setValue(j,k,value);
                            }}}}}}

陌上花开_ 发表于 2021-10-29 09:45:03

你发的这个案例下面的也没出来

Derrick.Jiao 发表于 2021-10-29 11:13:06

陌上花开_ 发表于 2021-10-29 09:45
你发的这个案例下面的也没出来

上面给出的正则只是匹配这种只有个位数的情况,如果像是这种两位数则无法匹配。可以参考下面的代码修改
页: [1]
查看完整版本: SpreadJS 如何导入跨表公式,保留值忽略错误公式