用户问题: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(var k=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);
- }}}}}}
复制代码
|