licp
2024-07-01 c6334d29171e1d3edf2d10a01ab2489fbdd310c8
src/util/excelFountion.js
@@ -6,13 +6,17 @@
 * @returns 返回所有参数的和,如果参数列表为空或参数类型非数值型,则返回null
 */
function SUM(...val){
  let num = null;
  if(val&&val.length>0){
    val.forEach(item=>{
      num+=item;
    })
  try {
    let num = null;
    if(val&&val.length>0){
      val.forEach(item=>{
        num+=item;
      })
    }
    return num;
  } catch (error) {
  }
  return num;
}
/**
 * 计算传入参数中的最大值
@@ -21,16 +25,20 @@
 * @returns 返回最大值,如果参数列表为空或为null/undefined/'',则返回null
 */
function MAX(...val){
  let max = null;
  if(val&&val.length>0){
    val = val.filter(item=>item!=null&&item!=='')
    if(val.length>0){
      max = Math.max(...val)
    }else{
      max = null;
  try {
    let max = null;
    if(val&&val.length>0){
      val = val.filter(item=>item!=null&&item!=='')
      if(val.length>0){
        max = Math.max(...val)
      }else{
        max = null;
      }
    }
    return max;
  } catch (error) {
  }
  return max;
}
/**
 * 计算传入参数中的最小值
@@ -39,15 +47,19 @@
 * @returns 返回传入参数中的最小值,如果传入参数为空或所有值均为null或空字符串,则返回null
 */
function MIN(...val){
  let min = null;
  if(val&&val.length>0){
    val = val.filter(item=>item!=null&&item!=='')
    console.log(val)
    if(val.length>0){
      min = Math.min(...val)
  try {
    let min = null;
    if(val&&val.length>0){
      val = val.filter(item=>item!=null&&item!=='')
      console.log(val)
      if(val.length>0){
        min = Math.min(...val)
      }
    }
    return min;
  } catch (error) {
  }
  return min;
}
/**
 * 计算给定数值的平均值
@@ -56,20 +68,24 @@
 * @returns 返回平均值,如果数值列表为空或包含非数值项,则返回null
 */
function AVERAGE(...val){
  let num = null;
  let arr = [];
  if(val&&val.length>0){
    arr = val.filter(item=>item!=null&&item!=='')
    arr.forEach(item=>{
      num+=item;
    })
    if(arr.length>0){
      return num/arr.length;
  try {
    let num = null;
    let arr = [];
    if(val&&val.length>0){
      arr = val.filter(item=>item!=null&&item!=='')
      arr.forEach(item=>{
        num+=item;
      })
      if(arr.length>0){
        return num/arr.length;
      }else{
        return null;
      }
    }else{
      return null;
    }
  }else{
    return null;
  } catch (error) {
  }
}
/**
@@ -79,7 +95,11 @@
 * @returns 返回该数值的绝对值
 */
function ABS(val){
  return Math.abs(val);
  try {
    return Math.abs(val);
  } catch (error) {
  }
}
/**
 * 计算一组数字的中位数
@@ -88,24 +108,28 @@
 * @returns 如果参数中有有效的数字,则返回计算出的中位数;否则返回null
 */
function MEDIAN(...val){
  let arr = [];
  if(val&&val.length>0){
    arr = val.filter(item=>item!=null&&item!=='')
    const sortedArr = arr.sort((a, b) => a - b);
    // 计算中位数
    const half = Math.floor(sortedArr.length / 2);
    if(arr.length>0){
      // 如果数组长度是奇数,直接取中间的元素
      if (sortedArr.length % 2 === 1) {
        return sortedArr[half];
      } else { // 如果数组长度是偶数,取中间两个元素的平均值
        return (sortedArr[half - 1] + sortedArr[half]) / 2;
  try {
    let arr = [];
    if(val&&val.length>0){
      arr = val.filter(item=>item!=null&&item!=='')
      const sortedArr = arr.sort((a, b) => a - b);
      // 计算中位数
      const half = Math.floor(sortedArr.length / 2);
      if(arr.length>0){
        // 如果数组长度是奇数,直接取中间的元素
        if (sortedArr.length % 2 === 1) {
          return sortedArr[half];
        } else { // 如果数组长度是偶数,取中间两个元素的平均值
          return (sortedArr[half - 1] + sortedArr[half]) / 2;
        }
      }else{
        return null;
      }
    }else{
      return null;
    }
  }else{
    return null;
  } catch (error) {
  }
}
@@ -184,27 +208,31 @@
 * @returns 返回一个包含坐标信息的数组
 */
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
          })
  try {
    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))
      }
    }else{
      arr2.push(getIdFromColumnName(item))
    }
  })
  return arr2;
    })
    return arr2;
  } catch (error) {
  }
}
/**
 * 获取包含 ABC 字符的列表
@@ -213,22 +241,26 @@
 * @returns 包含 ABC 字符的数组列表
 */
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;
  try {
    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;
  } catch (error) {
  }
}
/**
 * 获取所有单元格
@@ -237,12 +269,16 @@
 * @returns 返回一个对象,其键为单元格的唯一标识符(由列和行ID拼接而成),值为null
 */
function getAllCell(f){
  let arr = changeParameter(f)
  let arr0 = {}
  arr.forEach(item=>{
    arr0[getColumnNameFromId(`${item.c}`+'-'+`${item.r}`)] = null
  })
  return arr0;
  try {
    let arr = changeParameter(f)
    let arr0 = {}
    arr.forEach(item=>{
      arr0[getColumnNameFromId(`${item.c}`+'-'+`${item.r}`)] = null
    })
    return arr0;
  } catch (error) {
  }
}
/**
@@ -253,55 +289,54 @@
 * @returns 返回计算后的结果,如果计算失败则返回0
 */
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
          })
        }
  try {
    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 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{
    // 解析公式参数,特别是带:的
    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])
    }
    // 计算
    for (var a in arr) {
      str = str.replaceAll(a, arr[a])
    }
    return eval(str)
  }catch(e){
    console.log('e',e)
    return 0
  } catch (error) {
  }
}