| | |
| | | let f = 'SUM(MAX(1,2,3)*2-MIN(1,2,3),1,2)' |
| | | |
| | | |
| | | function changeParameter(f){ |
| | | let regex = /[=\+\-\*\%\(\)\/\^\s]/g; |
| | | let fouList = [ |
| | | "SUM", |
| | | 'MAX', |
| | | 'MIN' |
| | | ] |
| | | f = f.replace(regex, ',') |
| | | fouList.forEach(item=>{ |
| | | f = f.replaceAll(item,',') |
| | | }) |
| | | let arr = f.split(',').filter(item=>{ |
| | | return item&& /[a-zA-Z]/.test(item) |
| | | }); |
| | | let arr2 = [] |
| | | arr.forEach(item=>{ |
| | | if(item.includes(':')){ |
| | | |
| | | let r0 = getIdFromColumnName(item.split(':')[0]).r; |
| | | let c0 = getIdFromColumnName(item.split(':')[0]).c; |
| | | let r1 = getIdFromColumnName(item.split(':')[1]).r; |
| | | let c1 = getIdFromColumnName(item.split(':')[1]).c; |
| | | for (let i = Number(r0); i <= Number(r1); i++) { |
| | | for (let u = Number(c0); u <= Number(c1); u++) { |
| | | arr2.push({ |
| | | r: i, |
| | | c: u |
| | | }) |
| | | } |
| | | } |
| | | }else{ |
| | | arr2.push(getIdFromColumnName(item)) |
| | | } |
| | | }) |
| | | return arr2; |
| | | } |
| | | function SUM(...val){ |
| | | let num = 0; |
| | | if(val&&val.length>0){ |
| | |
| | | num+=item; |
| | | }) |
| | | } |
| | | console.log('SUM',num) |
| | | return num; |
| | | } |
| | | function MAX(...val){ |
| | | let max = 0; |
| | | if(val&&val.length>0){ |
| | | val = val.filter(item=>item!=null&&item!=='') |
| | | max = Math.max(...val) |
| | | } |
| | | console.log('MAX',max) |
| | | return max; |
| | | } |
| | | function MIN(...val){ |
| | | let min = 0; |
| | | if(val&&val.length>0){ |
| | | val = val.filter(item=>item!=null&&item!=='') |
| | | min = Math.min(...val) |
| | | } |
| | | console.log('MIN',min) |
| | | return min; |
| | | } |
| | | function handel(f){ |
| | | console.log(changeParameter(f)) |
| | | // console.log(eval(f)) |
| | | |
| | | function AVERAGE(...val){ |
| | | let num = 0; |
| | | let arr = []; |
| | | if(val&&val.length>0){ |
| | | arr = val.filter(item=>item!=null&&item!=='') |
| | | arr.forEach(item=>{ |
| | | num+=item; |
| | | }) |
| | | return num/arr.length; |
| | | }else{ |
| | | return 0; |
| | | } |
| | | } |
| | | |
| | | function APS(val){ |
| | | return Math.abs(val); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | letter += String.fromCharCode(65 + (i % 26)); |
| | | return letter + (parseInt(cellId[1]) + 1); |
| | | } |
| | | console.log("getColumnNameFromId",getColumnNameFromId([1,1]))//B2 |
| | | /** |
| | | * 根据列名获取坐标 |
| | | * @param {Object} id |
| | |
| | | return id; |
| | | } |
| | | |
| | | console.log("getIdFromColumnName",getIdFromColumnName("B2",true))//[1,1] |
| | | // 获取参数列表 |
| | | function changeParameter(f){ |
| | | let arr = getABCList(f) |
| | | let arr2 = [] |
| | | arr.forEach(item=>{ |
| | | if(item.includes(':')){ |
| | | let r0 = getIdFromColumnName(item.split(':')[0]).r; |
| | | let c0 = getIdFromColumnName(item.split(':')[0]).c; |
| | | let r1 = getIdFromColumnName(item.split(':')[1]).r; |
| | | let c1 = getIdFromColumnName(item.split(':')[1]).c; |
| | | for (let i = Number(r0); i <= Number(r1); i++) { |
| | | for (let u = Number(c0); u <= Number(c1); u++) { |
| | | arr2.push({ |
| | | r: i, |
| | | c: u |
| | | }) |
| | | } |
| | | } |
| | | }else{ |
| | | arr2.push(getIdFromColumnName(item)) |
| | | } |
| | | }) |
| | | return arr2; |
| | | } |
| | | |
| | | function getABCList(f){ |
| | | let regex = /[=\+\-\*\%\(\)\/\^\s]/g; |
| | | let fouList = [ |
| | | "SUM", |
| | | 'MAX', |
| | | 'MIN', |
| | | 'AVERAGE', |
| | | 'APS', |
| | | ] |
| | | f = f.replace(regex, ',') |
| | | fouList.forEach(item=>{ |
| | | f = f.replaceAll(item,',') |
| | | }) |
| | | let arr = f.split(',').filter(item=>{ |
| | | return item&& /[a-zA-Z]/.test(item)&&item!='undefined'&&item!='null' |
| | | }); |
| | | return arr; |
| | | } |
| | | |
| | | function getAllCell(f){ |
| | | let arr = changeParameter(f) |
| | | let arr0 = {} |
| | | arr.forEach(item=>{ |
| | | arr0[getColumnNameFromId(`${item.c}`+'-'+`${item.r}`)] = null |
| | | }) |
| | | return arr0; |
| | | } |
| | | |
| | | // 计算公式 |
| | | function compute(f,comValue){ |
| | | let str = f |
| | | // 获取单元格对应值 |
| | | let arr = getAllCell(f) |
| | | for (var a in comValue) { |
| | | if(comValue[a]!=='undefine'&&comValue[a]!=='null'&&comValue[a]!==undefined){ |
| | | arr[a] = comValue[a] |
| | | } |
| | | } |
| | | // 解析公式参数,特别是带:的 |
| | | let arr0 = getABCList(f) |
| | | let obj = {} |
| | | arr0.forEach(item=>{ |
| | | if(item.includes(':')){ |
| | | let arr1 = [] |
| | | let r0 = getIdFromColumnName(item.split(':')[0]).r; |
| | | let c0 = getIdFromColumnName(item.split(':')[0]).c; |
| | | let r1 = getIdFromColumnName(item.split(':')[1]).r; |
| | | let c1 = getIdFromColumnName(item.split(':')[1]).c; |
| | | for (let i = Number(r0); i <= Number(r1); i++) { |
| | | for (let u = Number(c0); u <= Number(c1); u++) { |
| | | arr1.push({ |
| | | r: i, |
| | | c: u |
| | | }) |
| | | } |
| | | } |
| | | let arr2 = [] |
| | | arr1.forEach(m=>{ |
| | | arr2.push(getColumnNameFromId(`${m.c}`+'-'+`${m.r}`)) |
| | | }) |
| | | obj[item.split(':').join('-')] = arr2.join(',') |
| | | }else{ |
| | | obj[item] = item |
| | | } |
| | | }) |
| | | str = str.replaceAll(':', '-') |
| | | // 替换参数 |
| | | for (var a in obj) { |
| | | str = str.replaceAll(a, obj[a]) |
| | | } |
| | | // 计算 |
| | | try{ |
| | | for (var a in arr) { |
| | | str = str.replaceAll(a, arr[a]) |
| | | } |
| | | return eval(str) |
| | | }catch(e){ |
| | | console.log('e',e) |
| | | return 0 |
| | | } |
| | | } |
| | | |
| | | export default { |
| | | handel |
| | | compute, |
| | | changeParameter |
| | | } |