想用C#做一个类似于excel里的公式库以及公式的运算模块,可以自定义函数,并可以解析公式并运算

主要包括数学计算函数、逻辑判断函数、文本函数、时间日期函数等,应用场合是模型平台,表达模型中不同参数之间的关系,存储介质是数据库,不是应用于类似于excel的表格。不知有没有类似的开源代码,或者有什么好的建议。谢谢!

第1个回答  2011-09-23
1.工具--宏-录制新宏-确定。

2.在宏窗口上“停止录制”

3.工具-宏-宏,点击macro1-编辑,进入一个窗口,把里面的内容全部删除,粘贴下面代码:
Function GetNum(b)
Dim i As Integer
Dim Al As String
For i = 1 To Len(b)
Al = Mid(b, i, 1)
If IsNumeric(Al) Or Al = "." Then
GetNum = GetNum & Al
End If
Next
End Function

选中一个单元格后,输入: =getnum(a1)

如果提取不是数字的,就改成:

Function Getstr(b)
Dim i As Integer
Dim Al As String
For i = 1 To Len(b)
Al = Mid(b, i, 1)
If not IsNumeric(Al) Then
Getstr= Getstr & Al
End If
Next
End Function

选中一个单元格后,输入: =getstr(a1)

第2个回答  2011-10-07
直接增加这几个宏就好了

#define MK_FP( seg,ofs )( (void _seg * )( seg ) +( void near * )( ofs ))
#define FP_SEG( fp )( (unsigned )( void _seg * )( void far * )( fp ))
#define FP_OFF( fp )( (unsigned )( fp ))本回答被提问者采纳
第3个回答  2018-01-17

也许他们没懂你什么意思,但是我差不多懂了你的意思,因为我最近也在做这些,我在做套版,客户自定义公式,获取自己想要的结果,像EXCEL一样输入公式就获得值。

我是建议你不要做什么反射,用什么js反编译,会降低你的软件性能,不参与什么编译,字符串转代码的事情,简单的循环一般的CPU还是应付得了的。

做这个事情首先你要内置函数,像EXCEL一样,他其实内置了封装函数,然后判断字符串去转义,我简单举例,看对你由帮助没有:

using System;
using System.Linq;
using System.Windows.Forms;

namespace mutua
{
    public class anys
    {
            //year函数
        public string year(string datestr)
        {
            return Convert.ToString(Convert.ToDateTime(datestr.Replace("\"", "")).Year);
        }
        //left函数
        public string left(string str, int len)
        {
            try
            {
                return str.Substring(0, len);
            }
            catch
            {
                return "#N/A";
            }
        }
        //公式解析
        public string gs(string gsstr)
        {
            //用一个数组去记录公式里的连接符嵌套函数体
            string[] gst = null;
            if (gsstr != "")
            {
                //用等于号开始
                if (gsstr.Substring(0, 1) == "=")
                {
                    //等于号去掉,用&符号分割,空格忽略加入数组
                    string[] ar = gsstr.Substring(1, gsstr.Length - 1).Trim().Split('&');
                    gst = ar;
                }
                else
                {
                    gst = null;
                }
            }
            else
            {
                gst = null;
            }
            //如果公式有效
            if (gst != null)
            {
                string arf = "";//寄存嵌套函数体计算结果
                foreach (string la in gst)//遍历数组
                {
                    string game = "";//寄存单个嵌套函数体的值
                    #region 
                    string laf = "";//处理单引号,双引号
                    laf = la.Replace("\"", "").Replace("'", "");
                    int kar = 0;//计算单个嵌套整体有几个函数
                    for (int i = 0; i < laf.Length; i++)
                    {
                        if (laf.Substring(i, 1) == "(")
                        {
                            kar++;
                        }
                    }
                    //从最深层函数开始运算,依次计算出函数体结果
                    for (int j = kar; j > 0; j--)
                    {
                        //获取最深层函数体( 位置
                        int jar = 0;
                        for (int i = 0; i < laf.Length; i++)
                        {
                            if (laf.Substring(i, 1) == "(")
                            {
                                jar = i + 1;
                            }
                        }
                        //获取函数体前面标志位置,截取函数体
                        int ga = 0, y = 0;
                        for (int i = laf.Length - 1; i > 0; i--)
                        {
                            if (laf.Substring(i, 1) == "(")
                            {
                                y++;
                                if (y == 2)
                                {
                                    ga = i + 1;
                                }
                            }
                        }
                        //如果只找到一个(,那么他前面就没有函数嵌套
                        if (y < 2)
                        {
                            ga = 0;
                        }
                        //字符串深层第一个)
                        int tur = 0;
                        for (int i = 0; i < laf.Length; i++)
                        {
                            if (laf.Substring(i, 1) == ")")
                            {
                                tur = i + 1;
                                break;
                            }
                        }
                        string fx = laf.Substring(ga, jar - ga - 1).ToLower();//获取深层函数名称
                        string value = "";//寄存深层函数参数
                        //内置函数转义
                        switch (fx)
                        {
                            case "year":
                                value = year(laf.Substring(jar, tur - jar - 1));//转义year函数
                                break;
                            case "left":
                                value = left(laf.Substring(jar, tur - jar - 1), Convert.ToInt32(laf.Substring(jar, tur - jar - 1).Split(',')[1]));//转义left函数
                                break;
                        }
                        //重新组织函数体
                        laf = laf.Substring(0, ga) + value + laf.Substring(tur, laf.Length - tur);
                        //得到函数体值
                        game = laf;
                    }
                    #endregion
                    //累计公式的值
                    arf += game;
                }
                //获取公式结果
                return arf;
            }
            else
            {
                //公式不成立就返回自身
                return gsstr;
            }
        }
    }
}

以上是公式模块,现在我们调用拖一个窗体,一个文本框一个按钮,输入公式测试

代码调用模块方法

效果如下

是你要的效果吗?

我的方法是每一个公式你都定义好,然后按自己的方法分解函数体,从深层到外层转义成值,最后再拼接函数体获得的值

第4个回答  2011-09-23
这个不会有开源的代码,只能自己写。

...的公式库以及公式的运算模块,可以自定义函数,并可以解析公式并...
选中一个单元格后,输入: =getstr(a1)

excel自定义公式编写excel自定义公式怎么编写
1.在单元格 B1 中输入等号 (=)。2.输入要使用的函数名,在这种情况下,我们使用乘法运算符(),所以输入。3.输入要相乘的单元格地址,在这种情况下,我们要乘以 A1,所以输入 A1。4.按下回车键,Excel 将计算并显示结果。完整的公式为:=A1*2 这将把单元格 A1 中的数字 10 乘以 2,并将结...

EXCEL如何加公式换算excel怎么用公式加减
其中,A1和B1是要相加的单元格。您可以将此公式应用于其他单元格以计算它们的总和。1. 使用自定义函数 如果您需要执行更复杂的公式换算,例如将一个值转换为另一个单位或格式化数字,则可以创建自定义函数。自定义函数允许您使用任何Excel支持的表达式和操作符来编写自己的计算逻辑。要创建自定义函数,请...

Excel中自定义函数自定义Excel函数来完成特定运算
1.执行“工具→宏→Visual Basic编辑器”菜单命令(或按“Alt+F11”快捷键),打开Visual Basic编辑窗口。2.在窗口中,执行“插入→模块”菜单命令,插入一个新的模块——模块1。3.在右边的“代码窗口”中输入以下代码:Function V(a,b,h)V = h*(a+b)\/2End Function 4.关闭窗口,自定义函数完...

excel函数公式大全,43个数据分析常用函数解析
举例说明,假设你需要将表格中所有名字的首字母转换为大写。不懂函数的你,可能会逐个手动修改,而实际上,只需使用`Proper`函数,输入相应的函数公式,即可在几秒钟内批量完成操作。这仅是众多函数中一个简单的例子。在理解了函数和公式的概念后,我们进一步探索函数的分类。Excel函数主要分为11类,包括...

excel自定义一个具有Like运算符功能的工作表函数
虽然用COUNTIF工作表函数可以实现类似的比较功能,但COUNTIF函数不支持中括号。为此,我们可以创建一个自定义函数来实现类似Like运算符的功能,使用起来非常方便。方法如下:按Alt+F11,打开VBA编辑器,单击菜单“插入→模块”,将下列代码输入到代码窗口中:Public Function IsLike(sText As String, _s...

如何在excel表格中设置自定义函数
Excel有虽然有自带函数库,并不是很够用,不能满足所有可能出现的情况,有时候就需要使用自定义函数。1、打开Excel程序,点击“工具”中的“宏”,选择“Visual Basic编辑器”选项。(按“Alt+F11”快捷键也可以实现)。2、会跳出“Visual Basic编辑器-Book1”窗口。在“Visual Basic编辑器-Book1”窗口...

Excel中怎样自定义函数
Excel中使用自定义函数,需要先在VBE中插入模块,输入自定义函数代码,才能使用自定义函数。操作系统:win10;软件版本:Office2010 方法如下:1.Alt+F11,在左侧空白处,点击右键,插入模块:2.在模块中输入自定义函数代码:3.关闭VBE,返回Excel,就可以使用自定义函数了:4.函数结果如下:...

Excel使用技巧?
我们可以自定义一个函数,来完成一些特定的运算。下面,我们就来自定义一个计算梯形面积的函数: 1.执行“工具→宏→Visual Basic编辑器”菜单命令(或按“Alt+F11”快捷键),打开Visual Basic编辑窗口。 2.在窗口中,执行“插入→模块”菜单命令,插入一个新的模块——模块1。 3.在右边的“代码窗口”中输入以下...

怎样做好excel表格中的函数?
矩阵函数是Excel进行矩阵计算的专用模块。用“插入”-“函数”命令打开“粘贴函数”对话框(如图11),选中函数分类栏中的“数学与三角函数”,在右边栏常用的矩阵函数有: MDETERM——计算一个矩阵的行列式; MINVERSE——计算一个矩阵的逆矩阵; MMULT——计算两个矩阵的乘积; SUMPRODUCT——计算所有...

相似回答