gaoluyang
2024-06-28 897faa2d11f5a64d0c5e0f3d802e363430f8bdc0
src/util/excelFountion.js
@@ -1,42 +1,5 @@
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){
@@ -44,29 +7,43 @@
      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);
}
/**
@@ -88,7 +65,6 @@
   letter += String.fromCharCode(65 + (i % 26));
   return letter + (parseInt(cellId[1]) + 1);
}
console.log("getColumnNameFromId",getColumnNameFromId([1,1]))//B2
/**
 * 根据列名获取坐标
 * @param {Object} id
@@ -128,9 +104,114 @@
   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
}