找回密码
 立即注册

QQ登录

只需一步,快速开始

zhata
论坛元老   /  发表于:2015-5-14 10:46  /   查看:6339  /  回复:5
在帮助文档中看到以下这句话:
CalcEngine 是独立于 Spread 的程序集。这样做的好处是,您可以在不加载 Spread 控件的情况下,使用公式进行运算。
怎么才能做到呢?

5 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2015-5-14 16:35:00
沙发
回复 1楼zhata的帖子

感谢你对该问题的反馈。
FarPoint.CacEngine提供了基础类和结构,给calculations, formulas, functions, operators和expressions功能。
这些functions和operators是公式的一部分。

拿其中一个CalcError来举例。
如下示例介绍如何使用,以及返回了error value。
  1. //Spread for Windows Forms
  2. FarPoint.CalcEngine.ErrorExpression err = new FarPoint.CalcEngine.ErrorExpression(FarPoint.CalcEngine.CalcError.DivideByZero);
  3. fpSpread1.ActiveSheet.AddCustomName("Alpha", err);
  4. fpSpread1.ActiveSheet.SetFormula(0, 0, "Alpha * 10");
  5. FarPoint.CalcEngine.Expression expr = fpSpread1.ActiveSheet.GetCustomName("Alpha");
  6. if (expr is FarPoint.CalcEngine.ErrorExpression)
  7. {
  8. FarPoint.CalcEngine.ErrorExpression ex = ((FarPoint.CalcEngine.ErrorExpression)(expr));
  9. MessageBox.Show("The error is " + ex.ErrorValue.ToString());
  10. }
  11. //Spread for Web Forms
  12. FarPoint.CalcEngine.ErrorExpression err = new FarPoint.CalcEngine.ErrorExpression(FarPoint.CalcEngine.CalcError.DivideByZero);
  13. FarPoint.Web.Spread.Model.DefaultSheetDataModel dataModel = new FarPoint.Web.Spread.Model.DefaultSheetDataModel();  
  14. dataModel = (FarPoint.Web.Spread.Model.DefaultSheetDataModel)FpSpread1.ActiveSheetView.DataModel;
  15. dataModel.AddCustomName("Alpha", err);
  16. FpSpread1.Sheets[0].SetFormula(0, 0, "Alpha * 10");
  17. FarPoint.CalcEngine.Expression expr = dataModel.GetCustomName("Alpha");
  18. if (expr is FarPoint.CalcEngine.ErrorExpression)
  19. {
  20. FarPoint.CalcEngine.ErrorExpression ex = ((FarPoint.CalcEngine.ErrorExpression)(expr));
  21. TextBox1.Text = "The error is " + ex.ErrorValue.ToString();
  22. }
复制代码
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
zhata
论坛元老   /  发表于:2015-5-14 17:50:00
板凳
这个例子加载了 Spread 控件,如何不加载 Spread 控件的情况下,使用公式进行运算。
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-5-15 14:12:00
地板
回复 3楼zhata的帖子

你好。
不知道你使用这个dll进行公式运算的需求是什么。
但如2楼所提示,你只要添加CalcEngine的引用,就可以直接使用它,根据你的需求计算。
比如:
  1.             object[,] knownY = { { 2.0, 3.0, 9.0, 1.0, 8.0, 7.0, 5.0 } };
  2.             object[,] knownX = { { 6.0, 5.0, 11.0, 7.0, 5.0, 4.0, 4.0 } };
  3.             FarPoint.CalcEngine.ArrayExpression arg1 = new FarPoint.CalcEngine.ArrayExpression(knownY);
  4.             FarPoint.CalcEngine.ArrayExpression arg2 = new FarPoint.CalcEngine.ArrayExpression(knownX);
  5.             FarPoint.CalcEngine.Expression[] args = { arg1, arg2 };
  6.             FarPoint.CalcEngine.Expression func = new FarPoint.CalcEngine.FunctionExpression(FarPoint.CalcEngine.FunctionInfo.SlopeFunction, args);
  7.             FarPoint.CalcEngine.CalcArray ca = arg1.ArrayValue;
  8.             MessageBox.Show(ca.GetValue(0, 0).ToString());
复制代码

它还可以通过继承的方式自定义。

另外,如果你是想将公式用于别的控件和计算结果,建议你使用FormulaProvider。
它的使用方法请参考产品博客:http://blog.gcpowertools.com.cn/post/2013/06/07/Spread-Studio-使用-FormulaProvider.aspx
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
zhata
论坛元老   /  发表于:2015-5-15 19:34:00
5#
谢谢耐心回答。再追问一个问题,如下代码:
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim F As FarPoint.Win.Spread.FormulaProvider = New FarPoint.Win.Spread.FormulaProvider
        Dim V As Object
        F.SetFormula(Me.TextBox2, "=1+2000+abs(-1)")
        V = Me.TextBox2.Text
        MsgBox(V)
    End Sub
    该代码可以将公式"=1+2000+abs(-1)"的计算结果显示在Me.TextBox2中,但我想运行性能更好一些,希望将计算结果直接储存在变量V中,应该怎么做(即:不想通过Me.TextBox2作中介)?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-5-18 15:10:00
6#
回复 5楼zhata的帖子

你好。
Formula Provider是针对控件的,它将formula设置在控件上。无法支持你提到的变量。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部