From fa5aee05d219940576c11a38ed3da135268c13b6 Mon Sep 17 00:00:00 2001
From: licp <lichunping@guanfang.com.cn>
Date: 星期三, 26 六月 2024 17:39:50 +0800
Subject: [PATCH] 完成公式计算

---
 src/util/excelFountion.js |  167 ++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 121 insertions(+), 46 deletions(-)

diff --git a/src/util/excelFountion.js b/src/util/excelFountion.js
index b8c51a1..406c872 100644
--- a/src/util/excelFountion.js
+++ b/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,7 +7,6 @@
       num+=item;
     })
   }
-  console.log('SUM',num)
   return num;
 }
 function MAX(...val){
@@ -52,7 +14,6 @@
   if(val&&val.length>0){
     max = Math.max(...val)
   }
-  console.log('MAX',max)
   return max;
 }
 function MIN(...val){
@@ -60,13 +21,23 @@
   if(val&&val.length>0){
     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;
+  if(val&&val.length>0){
+    val.forEach(item=>{
+      num+=item;
+    })
+  }
+  return num/val.length;
 }
+
+function APS(val){
+  return Math.abs(val);
+}
+
 
 
 /**
@@ -88,7 +59,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 +98,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]){
+      arr[a] = comValue[a]
+    }
+  }
+  // 瑙f瀽鍏紡鍙傛暟锛岀壒鍒槸甯︼細鐨�
+  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
 }

--
Gitblit v1.9.3