透视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;

}

  首先,该函数通过获取RowList的Distinct的值,确定行的成员;通过获取ColList的Distinct值,确定列的成员。然后,创建datatable的列。然后根据所提供的聚合函数,遍历每一行和获取匹配值到相应的单元格上。调用GetData()函数,检索匹配值。

代码private object GetData(string Filter, string DataField, AggregateFunction Aggregate)

{

    try

    {

        DataRow[] FilteredRows = _SourceTable.Select(Filter);

        object[] objList = 

         FilteredRows.Select(x => x.Field<object>(DataField)).ToArray();

switch (Aggregate)

        {

            case AggregateFunction.Average:

                return GetAverage(objList);

            case AggregateFunction.Count:

                return objList.Count();

            case AggregateFunction.Exists:

                return (objList.Count() == 0) ? "False" : "True";

            case AggregateFunction.First:

                return GetFirst(objList);

            case AggregateFunction.Last:

                return GetLast(objList);

            case AggregateFunction.Max:

                return GetMax(objList);

            case AggregateFunction.Min:

                return GetMin(objList);

            case AggregateFunction.Sum:

                return GetSum(objList);

            default:

                return null;

        }

    }

    catch (Exception ex)

    {

        return "#Error";

    }

    return null;

}

这个函数首先过滤到DataRow []数组中匹配RowField和ColumnFields数据 ,然后调用相应的聚合函数。

  如何使用代码:

  代码使用起来很简单。创建一个Pivot类的实例,然后使用要求的参数调用PivotData方法。PivotData()方法返回DataTable,他可直接作为GridView的数据源。

代码DataTable dt = ExcelLayer.GetDataTable("_Data\\DataForPivot.xls", "Sheet1$");

Pivot pvt = new Pivot(dt);

grdPivot.DataSource = pvt.PivotData("Designation", "CTC", 

   AggregateFunction.Max, "Company", "Department", "Year");

grdPivot.DataBind();

示例中使用的数据库是一个Excel Sheet ,放在示例应用程序的根文件夹下的“_Data”文件夹中。

该MergeHeader函数创建合并头部的单元格,并提供了一个简化的外观。

代码private void MergeHeader(GridView gv, GridViewRow row, int PivotLevel)

{

    for (int iCount = 1; iCount <= PivotLevel; iCount++)

    {

        GridViewRow oGridViewRow = new GridViewRow(0, 0, 

          DataControlRowType.Header, DataControlRowState.Insert);

        var Header = (row.Cells.Cast<tablecell>()

            .Select(x => GetHeaderText(x.Text, iCount, PivotLevel)))

            .GroupBy(x => x);

foreach (var v in Header)

        {

            TableHeaderCell cell = new TableHeaderCell();

            cell.Text = v.Key.Substring(v.Key.LastIndexOf(_Separator) + 1);

            cell.ColumnSpan = v.Count();

            oGridViewRow.Cells.Add(cell);

        }

        gv.Controls[0].Controls.AddAt(row.RowIndex, oGridViewRow);

    }

    row.Visible = false;

}

  该函数为每个PivotLevel创建新行,和相应的合并。 PivotLevel这里是列上的轴完成的数量。

  Header从一个数组中得到所有的列值,对GetHeaderText()返回的重复的值进行分组,根据HeaderText的重复数量,设置新创建的单元格的ColumnSpan属性。将单元格添加到GridViewRow中。最后添加GridViewRow到GridView。GetHeaderText() 函数根据PivotLevel返回header text.

  例如,假设一个透视表,完成三个ColumnField: Company, Department, 和Year。GridView的初始化时候,头部将拥有Company.Department。PivotLevel 1是Year。 GetHeaderText()将返回Company。对于PivotLevel 2,GetHeaderText()将返回Company.Department。对于PivotLevel 3,GetHeaderText()将返回Company.Department.Year,等等...

  以下是GridView的截图,包含三个层次透视数据:

  代码帮助您合并你想要的格式GridView的头单元格。对于初学者,在ExcelLayer.GetDataTable()方法将是一个从Excel表中的中获得数据例子。

  目前,代码只在DataTable中透视数据。该代码将得到加强,将来透视IListSource或ICollection派生的任何对象。

  参考原文:http://www.codeproject.com/KB/aspnet/PivotDataTable.aspx

时间: 2024-11-03 11:19:54

透视Datatable的相关文章

艾伟_转载:透视Datatable

源代码:/Files/zhuqil/PivotDataTable.zip  现在,以表格的形式显示的数据是任何应用程序的重要组成部分.但有时你需要以数据行格式显示大量的数据.如果行数巨大,它变得非常难以分析.在这种情况下,您可能希望使用其他格式统计你的数据,如: charts, graphs, groups, pivots等 .本文将介绍一种使用适当的聚合函数的方式来透视你的数据,它可以很容易提高您的报表功能. 下面的截图是在GridView中显示的数据透视功能.(关于数据透视还可以参考:ASP

ASP.NET实例教程:创建数据透视表

代码:Pivot.zip 数据透视表提供的数据三维视图效果,在Microsoft Excel能创建数据透视表,但是,它并不会总是很方便使用Excel.您可能希望在Web应用程序中创建一个数据透视报表.创建一个简单的数据透视表可能是一件非常复杂的任务.所以,我打算不但为你提供一个非常有用的工具创建简单和高级的数据透视表,而且为你移除一些笼罩他们的神秘面纱. 目标是:我们想要有能力将datatable中的二维的数据转换成三维视图. 在大多数情况下,你会从数据库的查询数据填充数据表,例如 SELECT

ASP.NET实现类似Excel的数据透视表

数据透视表提供的数据三维视图效果,在Microsoft Excel能创建数据透视表,但是,它并不会总是很 方便使用Excel.您可能希望在Web应用程序中创建一个数据透视报表.创建一个简单的数据透视表可能是 一件非常复杂的任务.所以,我打算不但为你提供一个非常有用的工具创建简单和高级的数据透视表,而 且为你移除一些笼罩他们的神秘面纱. 目标是:我们想要有能力将datatable中的二维的数据转换成三维视图. 在大多数情况下,你会从数据库的查询数据填充数据表,例如 SELECt SalesPeop

艾伟_转载:ASP.NET实现类似Excel的数据透视表

    代码:/Files/zhuqil/Pivot.zip     数据透视表提供的数据三维视图效果,在Microsoft Excel能创建数据透视表,但是,它并不会总是很方便使用Excel.您可能希望在Web应用程序中创建一个数据透视报表.创建一个简单的数据透视表可能是一件非常复杂的任务.所以,我打算不但为你提供一个非常有用的工具创建简单和高级的数据透视表,而且为你移除一些笼罩他们的神秘面纱.    目标是:我们想要有能力将datatable中的二维的数据转换成三维视图.    在大多数情况

Photoshop透视制作折叠字效果

  效果图: 启动Photoshop CS5,新建一个600*500的文件,填充背景色为蓝色(这里也可以随自己填充喜欢的颜色); 使用文字工具,在文件中输入文字"第九软件网",接着对文字进行"栅格化文字"的效果; 选择"矩形选框工具"选择文字的一部分,如图操作 对新建的文字图层,执行[编辑--变换--透视],如图进行变换; OK,我们的折叠效果就出来咯,再稍微调整一下位置,即可完成,最终效果! 分类: PS文字教程

Excel2013数据透视表字段分组

  先插入一个数据透视表,在[插入]选项下,点击[数据透视表] 这里选择默认的设置就好了点击确定 将种类拖入行字段,数量拖入值字段,如图所示 现在我们可以看到数据透视表已经做好了,就差分组了 选中属于蔬菜的种类,按下Ctrl见可以选择不连续的多个单元格 点击[分析]选项下的[组选择] 你会看到出现了一个新的列,在种类2这里,我们更改类别名称为蔬菜 接着,我们选择其他的种类 同样的方法我们建立数据组2,将其重命名为水果 至此,我们的字段分组就做成了 分类: Excel教程

如何搜索DataTable中的值

Gets a specified DataRow. Overload ListGets the row specified by the primary key value. [Visual Basic] Overloads Public Function Find(Object) As DataRow[C#] public DataRow Find(object);[C++] public: DataRow* Find(Object*);[JScript] public function Fi

wps表格如何使用透视表功能

  wps表格使用透视表功能的方法 进入wps2016之后,找到文件所在的位置,打开需要处理的文件,进入Excel主界面之后,点击插入按钮. 点击插入过后,点击一下最左边的数据透视表. 进入新界面之后,我们可以点击一下途中的小图标,缩小该框架. 再点击鼠标左键,拖拽我们想要设定的区域.这里我们不仅仅要处理数字,内容也要圈上. 圈上之后,在输入框里也会显示出来相应的表格位置. 再回到刚才的界面,点击最下方的确定按钮. 这时候,右侧的数据透视表字段内容,将所有你想要计算的内容前面勾上对号. 如果我们

空间|时间|对象 圈人 + 目标人群透视 - 暨PostgreSQL 10与Greenplum的对比和选择

标签 PostgreSQL , PostGIS , geohash , brin , gist索引 , Greenplum , HybridDB for PostgreSQL 背景 通常一个人的常驻地可能会包括:家.儿女家.双方父母家.情人.异性伴侣家.公司.商圈若干等. 通过对这些数据的运营,可以实现很多业务需求.例如: 1.寻人 <海量用户实时定位和圈人 - 团圆社会公益系统(位置寻人\圈人)> 2.线下广告投放人群圈选,选址,商圈人群画像. <数据寻龙点穴(空间聚集分析) - 阿里