2017-07-14 58 views
1

我正在使用NReco庫構建數據透視表。我遵循這些例子,我能夠從DataSet中構建一個簡單的PvT。現在我想要構建一個PvT,它接收在運行時選擇的多個度量,但是我使用一系列度量的過程的動態特性遇到問題,每個度量都有其自己的聚合公式。該公式在運行時是已知的,它只不過是一個總和或一個平均值,而是特定於該度量。我有以下代碼:NReco在運行時採取多重措施

private string CreatePivotTable(DataTable dt, string[] lines, string[] columns, string[] dimensions, string measure) 
    { 

     var pivotData = new PivotData(dimensions, new SumAggregatorFactory(measure), new DataTableReader(dt)); 

     var pivotTable = new PivotTable(lines, columns, pivotData); 
     var htmlResult = new StringWriter(); 
     var pvtHtmlWr = new PivotTableHtmlWriter(htmlResult); 
     pvtHtmlWr.Write(pivotTable); 

     return htmlResult.ToString(); 
    } 

我想做一些類似下面的代碼添加的措施,並在運行時動態的聚合:

private string CreatePivotTable(DataTable dt, string[] lines, string[] columns, string[] dimensions, Measure[] measures) 
    { 


     var pivotData = new PivotData(dimensions, null, new DataTableReader(dt)); 

     foreach(var m in measures) 
     { 
      if (m.Formula.equals("sum")) 
       pivotData.AggregatorFactory.Create(new SumAggregator(m.ColName)); 
      else if(m.Formula.equals("avg")){ 
      pivotData.AggregatorFactory.Create(new AvgAggregator(m.ColName)); 
      } 
     } 
    } 

如何能夠做到這樣呢?有沒有辦法做到這一點?

回答

0

您可以配置PivotData類收集了一些措施以下列方式:

private string CreatePivotTable(
    DataTable dt, string[] lines, string[] columns, string[] dimensions, Measure[] measures) 
{ 
    var aggrFactories = new List<IAggregatorFactory>(); 
    foreach(var m in measures) { 
     if (m.Formula.equals("sum")) 
      aggrFactories.Add(new SumAggregatorFactory(m.ColName)); 
     else if(m.Formula.equals("avg")){ 
      aggrFactories.Add(new AverageAggregatorFactory(m.ColName)); 
     } 
    } 
    if (aggrFactories.Length==0) { 
     // no measures provided. 
     // Throw an exception or configure "default" measure (say, CountAggregatorFactory) 
     aggrFactories.Add(new CountAggregatorFactory()); 
    } 
    var pivotData = new PivotData(dimensions, 
     aggrFactories.Length==1 ? aggrFactories[0] : new CompositeAggregatorFactory(aggrFactories.ToArray()), 
     new DataTableReader(dt)); 
    // you code that renders HTML pivot table with PivotTableHtmlWriter 
} 

作爲替代,您可以使用PivotDataFactory組件(NReco.PivotData.Extensions總成),可以通過PivotDataConfiguration模型創建PivotData實例:

private string CreatePivotTable(DataTable dt, string[] lines, string[] columns, string[] dimensions, Measure[] measures) 
{ 
    var pvtDataFactory = new PivotDataFactory(); 
    var pivotData = pvtDataFactory.Create(new PivotDataConfiguration() { 
     Dimensions = dimensions, 
     Aggregators = measures 
      .Select(m => new AggregatorFactoryConfiguration(m.Formula, new[] {m.ColName})) 
      .ToArray() 
    }); 
    // you code that renders HTML pivot table with PivotTableHtmlWriter 
} 

PivotDataFactory知道標準的聚合類型(「計數」,「求和」,「平均」,「最小」,「最大」),如果您使用自定義impleme您可以使用PivotDataFactory.RegisterAggregator方法註冊它們(有關更多詳細信息,請參閱Implement custom aggregator)。

BTW真正的用戶定義的公式(可以使用聚合器值作爲參數)也是可能的:請參閱PivotData SDK示例包中的「DynamicFormulaMeasure」示例。

+0

謝謝你的詳細解答。我無法通過NReco文檔將這些部分連接在一起,但我知道這是可能的。保持良好的工作Vitaliy,NReco是驚人的,併爲我節省了很多時間! – zriv

相關問題