可以考虑借助 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
我这里的if 还有 len 这俩方法只是举例子, 代表的是自定义方法,可能这个方法名字叫 xiuyue 或者 别的, 我需要一个方法可以解析这个字符串, 先把里面的自定义方法找到,然后再把自定义方法中能计算的参数计算完毕, 再根据反射去查找对应的方法进行调用, 把方法的地方替换成计算结果, 最后再计算纯 四则运算. 我目前写了一版, 但是太罗嗦,而且没有办法处理 +(-20) 或者 *(-20) 这种数据
@百鸟朝凤: 或者借助 Source Generators 根据公式动态生成 C# 代码
@dudu: 嗯...我看了一下,好像也不太行...我现在的难点是如何快速解析这个公式, 计算要遵循优先级, 还有最后的四则运算,写的也比较吃力
@百鸟朝凤: 可以看看这篇博文 Writing a Simple Math Expression Engine in C#
excel 公式里的LEN函数 是返回字符串的字符数,IF 函数 跟 .net 三元表达式一样,下面就是用.NET 翻译过来的excel 公式
string rsult = (3 +( (abc.ToString().Length > 5 ? 1 : 0) + (def.ToString().Length) )* 20).ToString();