知识大全 ASP.NET实现类似Excel的数据透视表

Posted 透视

篇首语:有志不在年高,无志空长百岁。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET实现类似Excel的数据透视表相关的知识,希望对你有一定的参考价值。

ASP.NET实现类似Excel的数据透视表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  数据透视表提供的数据三维视图效果 在Microsoft Excel能创建数据透视表 但是 它并不会总是很方便使用Excel 您可能希望在Web应用程序中创建一个数据透视报表 创建一个简单的数据透视表可能是一件非常复杂的任务 所以 我打算不但为你提供一个非常有用的工具创建简单和高级的数据透视表 而且为你移除一些笼罩他们的神秘面纱

  目标是 我们想要有能力将datatable中的二维的数据转换成三维视图

  在大多数情况下 你会从数据库的查询数据填充数据表 例如

  代码

  SELECT

  SalesPeople FullName AS [Sales Person]

   Products FullName AS [Product]

   SUM(Sales SalesAmount) AS [Sale Amount]

   SUM(Sales Qty) AS [Quantity]

  FROM

  Sales

  JOIN

  SalesPeople WITH (NOLOCK)

  ON SalesPeople SalesPersonID = Sales SalesPersonID

  JOIN

  Products WITH (NOLOCK)

  ON Products ProductCode = Sales ProductCode

  GROUP BY

  SalesPeople FullName

   Products FullName

  该查询会产生下面的数据表

  

  Sales Person

  Product

  Quantity

  Sale Amount

  John

  Pens

  

  

  John

  Pencils

  

  

  John

  Notebooks

  

  

  John

  Rulers

  

  

  John

  Calculators

  

  

  John

  Back Packs

  

  

  Jane

  Pens

  

  

  Jane

  Pencils

  

  

  Jane

  Notebooks

  

  

  Jane

  Rulers

  

  

  Jane

  Calculators

  

  

  Jane

  Back Packs

  

  

  Sally

  Pens

  

  

  Sally

  Pencils

  

  

  Sally

  Notebooks

  

  

  Sally

  Rulers

  

  

  Sally

  Calculators

  

  

  Sally

  Back Packs

  

  

  Sarah

  Pens

  

  

  Sarah

  Pencils

  

  

  Sarah

  Notebooks

  

  

  Sarah

  Rulers

  

  

  Sarah

  Calculators

  

  

  Sarah

  Back Packs

  

  

  正如你所看到的 这是一个二维表 它不是一个非常有用的报表 因此 我们得改变 将它变成更可读的数据表

  数据透视表有 个面

  X轴构成了在表格上方的大标题 Y轴构成表的左栏 Z轴构成了X轴和Y轴对应的值 简单的数据透视表将会对每一个x轴值都只有一个z轴列 高级的数据透视表将对于每个X轴的值会对应有多个Z轴的值

  一个非常重要的一点是 Z轴的值只能是数字 这是因为Z轴值为横轴和纵轴的总额 使用一个非数值Z轴字段将抛出一个异常

  因此 如果你注意上面的数据表 你会发现 Sales Person 和 Product 字段可以分配到的X轴或Y轴 但不能给z轴 在 Quantity 和 Sale Amount 字段可以被分配到z轴

  Pivot 类将数据表转换成 table 然后您可以将它输出到Web窗体上 那么 这只是实现的方法 如果你愿意 你可以根据这个类的逻辑创建一个用户控件

  代码

  #region Variables

  private DataTable _DataTable;

  private string _CssTopHeading;

  private string _CssSubHeading;

  private string _CssLeftColumn;

  private string _CssItems;

  private string _CssTotals;

  private string _CssTable;

  #endregion Variables

  #region Constructors

  public Pivot(DataTable dataTable)

  

  Init();

  _DataTable = dataTable;

  

  #endregion Constructors

  这部分的代码是非常自我解释 你能创建一个Pivot 对象 通过传递一个datatable作为参数 在init()方法只分配一个空字符串值给CSS变量 如果CSS的变量是一个空字符串 构造方法将使用默认的样式 每一个CSS变量都有一个相应的属性

  代码

  private string FindValue(string xAxisField string xAxisValue string yAxisField string yAxisValue string zAxisField)

  

  string zAxisValue = ;

  try

  

  foreach (DataRow row in _DataTable Rows)

  

  if (Convert ToString(row[xAxisField]) == xAxisValue && Convert ToString(row[yAxisField]) == yAxisValue)

  

  zAxisValue = Convert ToString(row[zAxisField]);

  break;

  

  

  

  catch

  

  throw;

  

  return zAxisValue;

  

  在FindValue( )方法在数据表中搜索的对应x轴和y轴值的Z轴值 xAxisField是X轴字段的列名(例如 Product ) 而xAxisValue是在该列的值 该yAxisField是的Y轴字段的列名(例如 Sales Person ) 并yAxisValue是在该列的值 该zAxisField是列名 在其中Z轴值 是您正在寻找地(例如 Sale Amount )

  代码

  private string[] FindValues(string xAxisField string xAxisValue string yAxisField string yAxisValue string[] zAxisFields)

  

  int zAxis = zAxisFields Length;

  if (zAxis < )

  zAxis++;

  string[] zAxisValues = new string[zAxis];

  //set default values

  for (int i = ; i <= zAxisValues GetUpperBound( ); i++)

  

  zAxisValues[i] = ;

  

  try

  

  foreach (DataRow row in _DataTable Rows)

  

  if (Convert ToString(row[xAxisField]) == xAxisValue && Convert ToString(row[yAxisField]) == yAxisValue)

  

  for (int z = ; z < zAxis; z++)

  

  zAxisValues[z] = Convert ToString(row[zAxisFields[z]]);

  

  break;

  

  

  

  catch

  

  throw;

  

  return zAxisValues;

  

  在FindValues( )方法类似FindValue( )方法 然而 它会返回多个z轴的值 这是用于高级的数据透视表 对应于x轴的值 您会有多个Z轴列

  代码

  private void MainHeaderTopCellStyle(HtmlTableCell cell)

  

  if (_CssTopHeading == )

  

  cell Style Add( font family tahoma );

  cell Style Add( font size pt );

  cell Style Add( font weight normal );

  cell Style Add( background color black );

  cell Style Add( color white );

  cell Style Add( text align center );

  

  else

  cell Attributes Add( Class _CssTopHeading);

  

  这是CSS样式的方法之一 这在X轴上使用流行的样式(table的顶行) 如果您没有指定一个CSS类名给这个属性 该方法将使用默认的样式 CSS类将会被应用到网页中的HTML table

  代码

  /// <summary>

  /// Creates an advanced D Pivot table

  /// </summary>

  /// <param name= xAxisField >The main heading at the top of the report </param>

  /// <param name= yAxisField >The heading on the left of the report </param>

  /// <param name= zAxisFields >The sub heading at the top of the report </param>

  /// <returns>HtmlTable Control </returns>

  public HtmlTable PivotTable(string xAxisField string yAxisField string[] zAxisFields)

  

  HtmlTable table = new HtmlTable();

  //style table

  TableStyle(table);

  /*

  * The x axis is the main horizontal row

  * The z axis is the sub horizontal row

  * The y axis is the left vertical column

  */

  try

  

  //get distinct xAxisFields

  ArrayList xAxis = new ArrayList();

  foreach (DataRow row in _DataTable Rows)

  

  if (!xAxis Contains(row[xAxisField]))

  xAxis Add(row[xAxisField]);

  

  //get distinct yAxisFields

  ArrayList yAxis = new ArrayList();

  foreach (DataRow row in _DataTable Rows)

  

  if (!yAxis Contains(row[yAxisField]))

  yAxis Add(row[yAxisField]);

  

  //create a D array for the y axis/z axis fields

  int zAxis = zAxisFields Length;

  if (zAxis < )

  zAxis = ;

  string[ ] matrix = new string[(xAxis Count * zAxis) yAxis Count];

  string[] zAxisValues = new string[zAxis];

  for (int y = ; y < yAxis Count; y++) //loop thru y axis fields

  

  //rows

  for (int x = ; x < xAxis Count; x++) //loop thru x axis fields

  

  //main columns

  //get the z axis values

  zAxisValues = FindValues(xAxisField Convert ToString(xAxis[x])

   yAxisField Convert ToString(yAxis[y]) zAxisFields);

  for (int z = ; z < zAxis; z++) //loop thru z axis fields

  

  //sub columns

  matrix[(((x + ) * zAxis zAxis) + z) y] = zAxisValues[z];

  

  

  

  //calculate totals for the y axis

  decimal[] yTotals = new decimal[(xAxis Count * zAxis)];

  for (int col = ; col < (xAxis Count * zAxis); col++)

  

  yTotals[col] = ;

  for (int row = ; row < yAxis Count; row++)

  

  yTotals[col] += Convert ToDecimal(matrix[col row]);

  

  

  //calculate totals for the x axis

  decimal[ ] xTotals = new decimal[zAxis (yAxis Count + )];

  for (int y = ; y < yAxis Count; y++) //loop thru the y axis

  

  int zCount = ;

  for (int z = ; z < (zAxis * xAxis Count); z++) //loop thru the z axis

  

  xTotals[zCount y] += Convert ToDecimal(matrix[z y]);

  if (zCount == (zAxis ))

  zCount = ;

  else

  zCount++;

  

  

  for (int xx = ; xx < zAxis; xx++) //Grand Total

  

  for (int xy = ; xy < yAxis Count; xy++)

  

  xTotals[xx yAxis Count] += xTotals[xx xy];

  

  

  //Build HTML Table

  //Append main row (x axis)

  HtmlTableRow mainRow = new HtmlTableRow();

  mainRow Cells Add(new HtmlTableCell());

  for (int x = ; x <= xAxis Count; x++) //loop thru x axis +

  

  HtmlTableCell cell = new HtmlTableCell();

  cell ColSpan = zAxis;

  if (x < xAxis Count)

  cell InnerText = Convert ToString(xAxis[x]);

  else

  cell InnerText = Grand Totals ;

  //style cell

  MainHeaderTopCellStyle(cell);

  mainRow Cells Add(cell);

  

  table Rows Add(mainRow);

  //Append sub row (z axis)

  HtmlTableRow subRow = new HtmlTableRow();

  subRow Cells Add(new HtmlTableCell());

  subRow Cells[ ] InnerText = yAxisField;

  //style cell

  SubHeaderCellStyle(subRow Cells[ ]);

  for (int x = ; x <= xAxis Count; x++) //loop thru x axis +

  

  for (int z = ; z < zAxis; z++)

  

  HtmlTableCell cell = new HtmlTableCell();

  cell InnerText = zAxisFields[z];

  //style cell

  SubHeaderCellStyle(cell);

  subRow Cells Add(cell);

  

  

  table Rows Add(subRow);

  //Append table items from matrix

  for (int y = ; y < yAxis Count; y++) //loop thru y axis

  

  HtmlTableRow itemRow = new HtmlTableRow();

  for (int z = ; z <= (zAxis * xAxis Count); z++) //loop thru z axis +

  

  HtmlTableCell cell = new HtmlTableCell();

  if (z == )

  

  cell InnerText = Convert ToString(yAxis[y]);

  //style cell

  MainHeaderLeftCellStyle(cell);

  

  else

  

  cell InnerText = Convert ToString(matrix[(z ) y]);

  //style cell

  ItemCellStyle(cell);

  

  itemRow Cells Add(cell);

  

  //append x axis grand totals

  for (int z = ; z < zAxis; z++)

  

  HtmlTableCell cell = new HtmlTableCell();

  cell InnerText = Convert ToString(xTotals[z y]);

  //style cell

  TotalCellStyle(cell);

  itemRow Cells Add(cell);

  

  table Rows Add(itemRow);

  

  //append y axis totals

  HtmlTableRow totalRow = new HtmlTableRow();

  for (int x = ; x <= (zAxis * xAxis Count); x++)

  

  HtmlTableCell cell = new HtmlTableCell();

  if (x == )

  cell InnerText = Totals ;

  else

  cell InnerText = Convert ToString(yTotals[x ]);

  //style cell

  TotalCellStyle(cell);

  totalRow Cells Add(cell);

  

  //append x axis/y axis totals

  for (int z = ; z < zAxis; z++)

  

  HtmlTableCell cell = new HtmlTableCell();

  cell InnerText = Convert ToString(xTotals[z xTotals GetUpperBound( )]);

  //style cell

  TotalCellStyle(cell);

  totalRow Cells Add(cell);

  

  table Rows Add(totalRow);

  

  catch

  

  throw;

  

  return table;

  

  PivotTable(…) 方法 是所有神奇发生的地方 有两种重载方法 一个创建了一个简单的数据透视表 而其他(上面的方法)创建一个高级的数据透视表 唯一的区别在于 一个简单只有一个的z轴 而高级的 不止一个

  Pivot zip文件中包括两个解决方案 Pivot 是一个类库解决方案是 您可以编译此解决方案和在Web应用程序中引用Pivot dll 另一个解决方案是PivotTest 它是是一个ASP NET应用程序 这说明如何实现Pivot类

  代码

  public DataTable DataTableForTesting

  

  get

  

  DataTable dt = new DataTable( Sales Table );

  dt Columns Add( Sales Person );

  dt Columns Add( Product );

  dt Columns Add( Quantity );

  dt Columns Add( Sale Amount );

  dt Rows Add(new object[] John Pens );

  dt Rows Add(new object[] John Pencils );

  dt Rows Add(new object[] John Notebooks );

  dt Rows Add(new object[] John Rulers );

  dt Rows Add(new object[] John Calculators );

  dt Rows Add(new object[] John Back Packs );

  dt Rows Add(new object[] Jane Pens );

  dt Rows Add(new object[] Jane Pencils );

  dt Rows Add(new object[] Jane Notebooks );

  dt Rows Add(new object[] Jane Rulers );

  dt Rows Add(new object[] Jane Calculators );

  dt Rows Add(new object[] Jane Back Packs );

  dt Rows Add(new object[] Sally Pens );

  dt Rows Add(new object[] Sally Pencils );

  dt Rows Add(new object[] Sally Notebooks );

  dt Rows Add(new object[] Sally Rulers );

  dt Rows Add(new object[] Sally Calculators );

  dt Rows Add(new object[] Sally Back Packs );

  dt Rows Add(new object[] Sarah Pens );

  dt Rows Add(new object[] Sarah Pencils );

  dt Rows Add(new object[] Sarah Notebooks );

  dt Rows Add(new object[] Sarah Rulers );

  dt Rows Add(new object[] Sarah Calculators );

  dt Rows Add(new object[] Sarah Back Packs );

  return dt;

  

  

  我已创建数据表的属性 它建立在上面的例子中的数据表 这只是用于演示目的

  代码

  protected void Page_Load(object sender EventArgs e)

  

  //Advanced Pivot

  Pivot advPivot = new Pivot(DataTableForTesting);

  HtmlTable advancedPivot = advPivot PivotTable( Sales Person Product new string[] Sale Amount Quantity );

  div Controls Add(advancedPivot);

  //Simple Pivot

  Pivot pivot = new Pivot(DataTableForTesting);

  //override default style with css

  pivot CssTopHeading = Heading ;

  pivot CssLeftColumn = LeftColumn ;

  pivot CssItems = Items ;

  pivot CssTotals = Totals ;

  pivot CssTable = Table ;

  HtmlTable simplePivot = pivot PivotTable( Product Sales Person Sale Amount );

  div Controls Add(simplePivot);

  

  上述代码包括两个实例化的pivot对象 第一个高级的pivot和第二是一个简单的pivot 你可以看到我已经为div添加了HtmlTable控件 我创建具有runat= server 属性的div 这样我可以在后台代码里面访问它 div只是帮助HtmlTable的定位

  使用默认样式的高级的数据透视表

   John Jane Sally Sarah Grand Totals Product Sale Amount Quantity Sale Amount Quantity Sale Amount Quantity Sale Amount Quantity Sale Amount Quantity Pens Pencils Notebooks Rulers Calculators Back Packs Totals

  使用自定义的CSS样式简单的数据透视表

  

  Sales Person

  Pens

  Pencils

  Notebooks

  Rulers

  Calculators

  Back Packs

  Grand Totals

  John

  

  

  

  

  

  

  

  Jane

  

  

  

  

  

  

  

  Sally

  

  

  

  

  

  

  

  Sarah

  

  

  

  

  

  

  

  Totals

  

  

  

  

  

  

  

cha138/Article/program/net/201311/13802

相关参考

知识大全 如何用excel中对应的数据透视表

如何用excel中对应的数据透视表定义数据透视表的数据源若要将工作表数据用作数据源,请单击包含此数据的单元格范围中的某个单元格。若要将MicrosoftExcel表中的数据用作数据源,请单击该Exce

知识大全 如何将excel表格中数据透视后的汇总一栏去掉呢

如何将excel表格中数据透视后的汇总一栏去掉呢?数据透视表中右击,数据透视表选项,汇总和筛选选项卡中,把显示行总计和显示列总计前面的勾取消,确定。EXCEL表格中数据透视表怎么使用数据透视表其实就是

知识大全 ASP.NET中数据库数据导入Excel并打印

ASP.NET中数据库数据导入Excel并打印  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  众

知识大全 Asp.Net输出数据到EXCEL表格中

Asp.Net输出数据到EXCEL表格中  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  其实利用

知识大全 ASP.NET导出数据到Excel的实现方法

ASP.NET导出数据到Excel的实现方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在做as

知识大全 SQL Server 生成数据透视表

SQLServer生成数据透视表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据透视表是分析

知识大全 asp.net管理mysql数据库的小工具.

   在中可以通过MySQLDatadll来操作mysql数据库写法跟操作SQL数据库类似下面是相关的例子   一打开mysql数据库&nb

知识大全 asp.net导入excel转为datatable

  前台代码  <asp:FileUploadrunat=serverID=fupFilesWidth=px/>excel表名<asp:TextBoxID=txtSheetrunat

知识大全 asp.net导出Excel方法总结

asp.net导出Excel方法总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 asp.net(C#)套用模板操作Excel

asp.net(C#)套用模板操作Excel  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当需