Foxtable(狐表)用户栏目专家坐堂 → [求助]仿EXCEL编辑公式


  共有7392人关注过本帖树形打印复制链接

主题:[求助]仿EXCEL编辑公式

帅哥哟,离线,有人找我吗?
ywlin521
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:95 积分:1029 威望:0 精华:0 注册:2011/8/13 14:57:00
[求助]仿EXCEL编辑公式  发帖心情 Post By:2013/4/13 14:38:00 [显示全部帖子]

仿EXCEL的单元格计算公式,自定义了函数,EVAL3,可是

R("第一列") = 100

R("第二列") = 200

R("第三列") = 300

R("第四列") 的内容 = [第一列] + [第二列] + [第三列]

结果:100200300,应该是600

 

如果R("第四列") 的内容 = [第一列] * 2

结果是正确的:200

表事件DrawCell调用EVAL3

具体看下程序,谢谢!

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.foxdb

[此贴子已经被作者于2013-4-15 18:02:27编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
ywlin521
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:95 积分:1029 威望:0 精华:0 注册:2011/8/13 14:57:00
  发帖心情 Post By:2013/4/13 16:35:00 [显示全部帖子]

EXCEL中,单元格可以是文本,所以仿的话,是要用文本


 回到顶部
帅哥哟,离线,有人找我吗?
ywlin521
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:95 积分:1029 威望:0 精华:0 注册:2011/8/13 14:57:00
  发帖心情 Post By:2013/4/15 18:00:00 [显示全部帖子]

已成功了,列的类型可以是文本

自定义eval3函数,可以成功仿EXCEL功能

调用:在DRAWCELL中调用

具体:

Dim s As String = e.Row(e.col.Name)
If s.StartsWith("=") Then
    e.Text = Functions.Execute("Eval3",s,e.Row)
End If

 

Dim s As String = args(0)
Dim r As Row = args(1)
'判断是否是表达式,不是表达式,转换为数值返回
If s.StartsWith("=") = False Then
    Return s
Else
    s = s.TrimStart("=")
   
    If IsNumeric(s) Then '如果是单个数字,直接返回
        Return Val(s)
    End If
    '扫描表达式里的 [列名]
    Dim strCols As String = Nothing
    For Each c As Col In r.Table.Cols
        If s.Contains("[" & c.Name & "]") Then
            strCols &= "[" & c.Name & "]|"
        End If
    Next
   
    If strCols Is Nothing Then  '不存在[列名],但是个表达式,返回
        Return eval2(s,r)
    Else  '存在[列名]
        strCols = strCols.TrimEnd("|")
        Dim saCols() As String = strCols.Split("|")
       
        Dim sCol As String = Nothing
        Dim sValue As String = Nothing
        For j As Integer = 0 To saCols.Length - 1
            sCol = saCols(j)
            sCol = sCol.TrimStart("[")
            sCol = sCol.TrimEnd("]")
           
            sValue = Functions.Execute("Eval3",r(sCol),r)
            s = s.Replace(saCols(j),sValue)

        Next
       
        Return eval2(s,r)
    End If
End If

[此贴子已经被作者于2013-4-15 18:04:44编辑过]

 回到顶部