透视Datatable

  源代码:/Files/zhuqil/PivotDataTable.zip 

  现在,以表格的形式显示的数据是任何应用程序的重要组成部分。但有时你需要以数据行格式显示大量的数据。如果行数巨大,它变得非常难以分析。在这种情况下,您可能希望使用其他格式统计你的数据,如: charts, graphs, groups, pivots等 。本文将介绍一种使用适当的聚合函数的方式来透视你的数据,它可以很容易提高您的报表功能。

  下面的截图是在GridView中显示的数据透视功能。(关于数据透视还可以参考:ASP.NET实现类似Excel的数据透视表 )

  为了简化方案,我把表的结果分三个区域显示:RowField, DataField, 和ColumnFields,除了这些,Pivot类提供一些供您来选择的聚合函数来绑定的数据。可提供的选项有:

  • Count: 返回匹配的数据数量
  • Sum: 返回匹配的数据总和(为了得到总和,将DataField的类型必须转换为decimal类型)
  • First: 返回匹配的数据第一项
  • Last: 返回匹配的数据最后一项
  • Average: 返回匹配的数据平均(为了得到平均值,将DataField的类型必须转换为decimal类型)
  • Max: 返回匹配的数据最大值
  • Min: 返回匹配的数据最小值
  • Exists: 如果有匹配的数据,返回“true”,否则“false”

      代码主要包含了一个名字为"Pivot"的类,在它的构造函数中创建DataTable。 ColumnFields 是一个字符串数组参数,它允许你透视多列数据。这个类还包含了一个实际透视你数据的PivotData() 方法。

    代码public DataTable PivotData(string RowField, string DataField, 
           AggregateFunction Aggregate, 
    params string[] ColumnFields)
    {
        DataTable dt 
    = new DataTable();
        
    string Separator = ".";
        var RowList 
    = (from x in _SourceTable.AsEnumerable() 
            select 
    new { Name = x.Field<object>(RowField) }).Distinct();
        var ColList 
    = (from x in _SourceTable.AsEnumerable() 
                       select 
    new { Name = ColumnFields.Select(n => x.Field<object>(n))
                           .Aggregate((a, b) 
    => a += Separator + b.ToString()) })
                           .Distinct()
                           .OrderBy(m 
    => m.Name);

        dt.Columns.Add(RowField);
        
    foreach (var col in ColList)
        {
            dt.Columns.Add(col.Name.ToString());
        }

        
    foreach (var RowName in RowList)
        {
            DataRow row 
    = dt.NewRow();
            row[RowField] 
    = RowName.Name.ToString();
            
    foreach (var col in ColList)
            {
                
    string strFilter = RowField + " = '" + RowName.Name + "'";
                
    string[] strColValues = 
                  col.Name.ToString().Split(Separator.ToCharArray(), 
                                            StringSplitOptions.None);
                
    for (int i = 0; i < ColumnFields.Length; i++)
                    strFilter 
    += " and " + ColumnFields[i] + 
                                 
    " = '" + strColValues[i] + "'";
                row[col.Name.ToString()] 
    = GetData(strFilter, DataField, Aggregate);
            }
            dt.Rows.Add(row);
        }
        
    return dt;
    }

    NET技术透视Datatable,转载需保留来源!

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。