前言
2024年3月份马上就要结束,困扰我近2个月的感冒总算要痊愈了,为此特别发布本篇文章以示安慰。
kbnet.toolkit.formulas是一个.net/c#类库,提供类似Excel一样的公式用于计算数据,当然没有excel公式那么多、那么全,但是应该足够使用了。用它来做什么?难道用它来自己实现一个excel软件么?如果有此需求是可以的,其实我设计实现它的主要目的是为了数据检查和消息预警,尤其是物联网场景。下位机采集各个传感器的数据,然后提交到服务器,此时接收到数据的服务器第一步应该做什么,也许是存起来,好吧,除此之外,是不是应该根据传感器的数值做判断,从而验证传感器现场的环境状态,比如温度、压力、流速、风力等等,然后对超出数值范围的传感器发出消息预警,使得运维人员即时了解情况,从而避免各类生产事故的发生。当然,你可能会说用其他办法一样可以实现,为什么要用kbnet.toolkit.formulas这个类库,比如sql数据库、时序数据库、或者让程序员写个程序,没错,实现类似需求的方式方案有多种,只是我想说相比较于其他方案,使用这个类库也有好处的,第一它不会给sql数据库造成巨大的检索压力,第二它可以任意配置正确的公式,不仅可以检测一个点的数据,还可以几个点同时作为条件运算,第三它不需要程序员等技术人员参与,只要是会编写excel公式的工作人员,就能设置和使用,更加不需要算法工程师瞎捣鼓算法,那么你现在认识到它的价值了么?也许你还会发现其他更多好处。
废话不多说了,直接上类库地址:
https://www.alipan.com/s/bZmX8KkdpV9
提取码: 2b4w
.net4x:表示.net framework 4.8.1
.net6:表示.net 6
.net8:表示.net 8
测试代码
1 public static void Test() 2 { 3 Formula.Init(); 4 5 var dList = new List<DataModel>(); 6 7 Console.WriteLine("程序暂时支持的运算符如下:异或^、并且&&、或者||、加法+、减法-、乘法*、除法/、取余%、等于=、不等于!=、不等于<>、大于>、大于等于>=、小于<、小于等于<="); 8 Console.WriteLine(""); 9 Console.WriteLine("以下内容是在测试随机数据和定义的公式是否正确运行,其中{\"R\":\"1\"}表示一个测点。"); 10 Random rd = new Random(); 11 int testCount = 0; 12 while (true) 13 { 14 testCount++; 15 dList.Clear(); 16 17 Console.WriteLine("**************************************"); 18 for (int d = 0; d < 1; d++) 19 { 20 for (int i = 0; i < 2; i++) 21 { 22 dList.Add(new DataModel { SheetName = "Test", ColumnName = "Device" + (d + 1).ToString(), RowName = (i + 1).ToString(), CellValue = rd.Next(200), RecordTime = DateTime.Now }); 23 } 24 } 25 foreach (var item in dList) 26 { 27 Console.WriteLine($"区域ID:{item.SheetName},设备ID:{item.ColumnName},测点ID:{item.RowName},测点值:{item.CellValue}"); 28 } 29 var expression = "({\"R\":\"1\"}>0)&&({\"R\":\"2\"}<50)"; 30 Console.WriteLine($"公式:{expression}"); 31 var f = Formula.Parse(expression); 32 var r = f.Compute(dList); 33 if (r != null) 34 { 35 Console.WriteLine($"第 {testCount} 次,测试结果:" + r.Result.ToString()); 36 } 37 38 Console.WriteLine("**************************************"); 39 Console.WriteLine("是否继续测试?(y/n)"); 40 var ckey = Console.ReadLine(); 41 if (ckey.ToLower() != "y") 42 { 43 break; 44 } 45 } 46 47 Console.WriteLine(""); 48 Console.WriteLine("**************************************"); 49 Console.WriteLine("是否想继续测试数学运算?比如想计算表达式 \"(-1*(1+2+3+4+5)/2*-1+0.5)%3\" 的运算结果,如果想知道请输入计算公式:"); 50 testCount = 0; 51 while (true) 52 { 53 testCount++; 54 55 var cFunc = Console.ReadLine();//"1+1+(10/2*5-10)-50"; 56 if (!string.IsNullOrEmpty(cFunc) && !string.IsNullOrWhiteSpace(cFunc)) 57 { 58 var f = Formula.Parse(cFunc); 59 var r = f.Compute(dList); 60 if (r != null) 61 { 62 Console.WriteLine($"第 {testCount} 次,测试结果:" + r.Result.ToString()); 63 } 64 Console.WriteLine("#######################################"); 65 Console.WriteLine("是否继续测试?(y/n)"); 66 var ckey = Console.ReadLine(); 67 if (ckey.ToLower() != "y") 68 { 69 break; 70 } 71 else 72 { 73 Console.WriteLine("请输入公式:"); 74 } 75 } 76 else 77 { 78 Console.WriteLine("您输入的公式有误,请输入正确的公式"); 79 } 80 } 81 82 83 Console.WriteLine(""); 84 Console.WriteLine("感谢使用程序,功能运行结束,按任意键退出..."); 85 Console.ReadLine(); 86 }
总结
一直以来都在研究架构和平台方面的技术,这是第一篇功能类库的文章,希望可以对您有助。
标签:类库,kbnet,formulas,excel,toolkit,net From: https://www.cnblogs.com/Jkinbor/p/18103522