找回密码
 立即注册

QQ登录

只需一步,快速开始

Richard.Ma 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-6-1 09:11  /   查看:3630  /  回复:0
本帖最后由 Richard.Ma 于 2020-6-1 09:18 编辑

ComponentOne中的 CalcEngine是一个.NET标准库,可以在任何平台运行时分析和表达的评估上使用。
该库可用于:
  • 解析和评估公式(例如Microsoft Excel)。
  • 计算销售预测或统计计算以找到数据模式。
  • 将数据从内存中的业务对象加载到DataGrid或显示计算值。
  • 使用变量评估代数表达式,数学函数和公式。
CalcEngine可用于ComponentOne中的所有.NET平台,并且该库作为nuget.org上的NuGet包提供。您也可以通过安装WinForms Edition获得示例代码。
在本文中,我们将逐步介绍CalcEngine的主要功能,并展示它们如何工作。
CalcEngine入门
要开始使用CalcEngine,请创建一个.NET Framework 4.6.2+或.NET Core应用程序,然后将nuget.org中的C1.CalcEngine NuGet包添加到项目中。
创建简单表达式
如果您曾经使用过Excel,则使用CalcEngine创建和评估表达式非常简单明了。在这里,我们演示如何创建分配给CalcEngine的Expression属性的简单表达式,以及如何使用Evaluate函数获取结果。
  1. var calcEngine = new C1CalcEngine();  
  2. calcEngine.Expression = “5+2”;  
  3. var result = calcEngine.Evaluate()
复制代码

CalcEngine还支持带有函数的更复杂的表达式。它支持Excel中的文本,日期时间,数学,逻辑,转换和聚合函数,以及各种常量和运算符。
有关支持功能的完整列表,请参阅文档。如果要将自定义函数添加到库中,可以使用AddFunction方法来实现。
使用数据绑定跨数据源执行计算
CalcEngine可以绑定到列表,数组或数据表等数据源。这有助于在对象和数据字段的集合上执行计算。在这里,我们有一个Store对象的集合,并使用CalcEngine将表达式应用于整个集合或单个对象。
  1. public class Store  
  2. {  
  3.     public int StoreId { get; set; }  
  4.     public double Sales { get; set; }  
  5. }

  6. var collection = new List<Store>() { new Store { StoreId = 27, Sales = 150000.00 }, new Store { StoreId = 15, Sales = 20000.00 } };

  7. // 1\. When you have to apply expression over an object:  
  8. var engine = new &#65279;C1CalcEngine ();  
  9. engine.DataSource = collection[0];  
  10. engine.Expression = "[Sales]*2";
复制代码
  1. // 2\. When you have collection and aggregate function:  
  2. var engine = new &#65279;C1CalcEngine ();  
  3. engine.DataSource = collection;  
  4. engine.Expression = "Sum([Sales])";  
  5. var result = engine.Evaluate();
复制代码
  1. // 3\. When you have collection and need evaluate one entry:  
  2. var engine = new C1CalcEngine();  
  3. engine.DataSource = collection;  
  4. engine.CurrentIndex = 1;  
  5. engine.Expression = "[Sales] / Sum([Sales])";  
  6. var result = engine.Evaluate();
复制代码



处理多个数据收集
当信息分散到多个集合中时,很难一起处理这些数据。这是交叉引用会有所帮助的地方。在这种情况下,可以使用内置的Excel引擎的跨工作表引用。在交叉表引用中,单元格引用包括对另一个表中单元格的引用。
与Excel一样,它可以用在公式中,在该公式中输入目标工作表的名称,然后在单元格引用或单元格范围引用之前输入一个惊叹号(!)。
  1. calcEngine.Expression = "=Sum(Sheet1!A3:B7) + Sum(Sheet2!A3:B7)";
复制代码

为了能够创建上述表达式,每个数据源都应从实现GetValue()函数的IDataSheet派生:
  1. public class SheetTable : DataTable, IDataSheet
  2.     {
  3.         public string Name
  4.         {
  5.             get => TableName;
  6.             set => TableName = value;
  7.         }

  8.         public object GetValue(int col, int row)
  9.         {
  10.             return Rows[row][col];
  11.         }
  12.     }
复制代码

在这里,GetValue从特定的行或列返回一个值。
出于本文的目的,我们演示了一个使用上面实现的SheetTable类的简单数据源:
  1. //Method to generate data for C1CalcEngine
  2.     private const string columnNames = "ABCDEF";

  3.     var sheet1 = GetDataTable("Sheet1");
  4.      var sheet2 = GetDataTable("Sheet2");

  5.     public static SheetTable GetDataTable(string sheetName)
  6.     {
  7.         var table = new SheetTable();
  8.         table.Name = sheetName;
  9.         foreach (var col in columnNames)
  10.             table.Columns.Add(col.ToString(), typeof(int));
  11.         for (int i = 0; i < 100; i++)
  12.             table.Rows.Add(new object[] { i * 2, i * 3, i * 4, i * 5, i * 6, i * 7 });
  13.         return table;
  14.     }
复制代码


最后,可以如下创建跨表表达式:
  1. C1CalcEngine calcEngine = new C1CalcEngine();

  2. calcEngine.DataSource = new List<IDataSheet> { sheet1, sheet2 };

  3.             //Assign the cross sheet reference expression to be calculated by C1CalcEngine
  4.             calcEngine.Expression = "=Sum(Sheet1!A3:B7) + Sum(Sheet2!A3:B7)";

  5.             //Invoke the TryEvaluate method of C1CalcEngine to calculate the expression
  6.             var res = calcEngine.TryEvaluate(out object result) ? result.ToString() : calcEngine.GetErrors().FirstOrDefault()?.FullMessage ?? "";
复制代码

下图显示了交叉表引用的示例,其中从单元格引用中解析了表达式。
ComponentOne WinForms Edition中提供了此示例:
ComponentOne CalcEngine是一个功能强大的库,可以解决许多业务用例。欢迎使用,有任何问题欢迎回帖讨论



0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部