首页 新闻 会员 周边

.net 实现类似 excel 公式的方法

0
悬赏园豆:20 [已解决问题] 解决于 2023-04-10 16:51

有一个 字符串 3+(if(len(abc)+1>5,1,0)+ len(def))*20
解析这个字符串, 其中 if , len 都是自定义的方法, 求出这个字符串的值

百鸟朝凤的主页 百鸟朝凤 | 菜鸟二级 | 园豆:260
提问于:2023-03-31 09:59
< >
分享
最佳答案
0

可以考虑借助 EPPlus 直接使用 Excel 公式

using OfficeOpenXml;
using var package = new ExcelPackage();
var sheet = package.Workbook.Worksheets.Add("Formula");
sheet.Cells["A1"].Value = "abc";
sheet.Cells["A2"].Value = "def";
sheet.Cells["A3"].Formula = "3+(if(len(A1)+1>5,1,0)+len(A2))*20";
sheet.Calculate();
Console.WriteLine("Result: " + sheet.Cells["A3"].Text);
// Result: 65
收获园豆:20
dudu | 高人七级 |园豆:30943 | 2023-03-31 10:23

我这里的if 还有 len 这俩方法只是举例子, 代表的是自定义方法,可能这个方法名字叫 xiuyue 或者 别的, 我需要一个方法可以解析这个字符串, 先把里面的自定义方法找到,然后再把自定义方法中能计算的参数计算完毕, 再根据反射去查找对应的方法进行调用, 把方法的地方替换成计算结果, 最后再计算纯 四则运算. 我目前写了一版, 但是太罗嗦,而且没有办法处理 +(-20) 或者 *(-20) 这种数据

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2023-03-31 10:27

@百鸟朝凤: 或者借助 Source Generators 根据公式动态生成 C# 代码

dudu | 园豆:30943 (高人七级) | 2023-03-31 10:29

@dudu: 嗯...我看了一下,好像也不太行...我现在的难点是如何快速解析这个公式, 计算要遵循优先级, 还有最后的四则运算,写的也比较吃力

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2023-03-31 10:35

@百鸟朝凤: 可以看看这篇博文 Writing a Simple Math Expression Engine in C#

dudu | 园豆:30943 (高人七级) | 2023-03-31 10:45
其他回答(1)
0

excel 公式里的LEN函数 是返回字符串的字符数,IF 函数 跟 .net 三元表达式一样,下面就是用.NET 翻译过来的excel 公式

string rsult = (3 +( (abc.ToString().Length > 5 ? 1 : 0) + (def.ToString().Length) )* 20).ToString();
中华鲟3670 | 园豆:847 (小虾三级) | 2023-04-01 09:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册