使用代码把 DataTable 进行 【行转列】操作

示例代码

链接:https://pan.baidu.com/s/1a-6CoIjA_DGLGKpsGpMmDg
提取码:1xip

 

主要代码为

/// <summary>        
/// 行转列        
/// </summary>        
/// <param name="dataTable">需要进行行转列的表(数据源)</param>        
/// <param name="groupingColumn">需要进行行转列的字段(课程)</param>  
/// <param name="orderColumn">进行行转列排序的字段(姓名)</param>        
/// <param name="nameColumn">名称列(姓名)</param>        
/// <param name="dataColumn">数据列(分数)</param>        
/// <returns></returns>        
public DataTable CreateRCCTable(DataTable dataTable, string groupingColumn, string orderColumn, string nameColumn, string dataColumn)
{
    //取出不重复的需要转换的列的数据     
    dataTable.DefaultView.Sort = orderColumn;
    DataTable distinct_GroupingColumn = dataTable.DefaultView.ToTable(true, groupingColumn);
    //取出不重复的名称列            
    DataTable dictinct_NameColumn = dataTable.DefaultView.ToTable(true, nameColumn);
    //构建新表            
    DataTable table = new DataTable();
    #region 构建新表的列                                    
    //将名称列添加进新表            
    DataColumn newColumn = new DataColumn();
    newColumn.ColumnName = nameColumn;
    //添加列   所以要.Columns            
    table.Columns.Add(newColumn);
    //添加需要转换的列                        
    foreach (DataRow dr in distinct_GroupingColumn.Rows)
    {
        newColumn = new DataColumn();
        newColumn.ColumnName = dr[groupingColumn].ToString();
        table.Columns.Add(newColumn);
    }
    #endregion
    #region 向新表中添加数据            
    DataRow newRow;
    DataRow[] dnewRow;
    foreach (DataRow item in dictinct_NameColumn.Rows)
    {
        //添加一个新行                
        newRow = table.NewRow();
        //为此新行添加第一个行数据                
        newRow[nameColumn] = item[nameColumn].ToString();
        //为此新行添加列数据                
        foreach (DataRow r in distinct_GroupingColumn.Rows)
        {
            dnewRow = dataTable.Select(nameColumn + " ='" + item[nameColumn].ToString() + "' and " + groupingColumn + " ='" + r[groupingColumn].ToString() + "'");
            if (dnewRow.Length != 0)
            {
                //将数据与新建表进行连合                        
                newRow[r[groupingColumn].ToString()] = dnewRow[0][dataColumn];
            }
        }
        table.Rows.Add(newRow);
    }
    #endregion
    return table;
}

 

/// <summary>        
/// 行转列        
/// </summary>        
/// <param name="dataTable">需要进行行转列的表(数据源)</param>        
/// <param name="groupingColumn">需要进行行转列的字段(课程)</param>  
/// <param name="orderColumn">进行行转列排序的字段(姓名)</param>        
/// <param name="nameColumn">名称列(年级、姓名)</param>        
/// <param name="dataColumn">数据列(分数)</param>        
/// <returns></returns>   
public DataTable CreateRCCTable(DataTable dataTable, string groupingColumn, string orderColumn, string[] nameColumn, string dataColumn)
{
    //取出不重复的需要转换的列的数据     
    dataTable.DefaultView.Sort = orderColumn;
    DataTable distinct_GroupingColumn = dataTable.DefaultView.ToTable(true, groupingColumn);//取出不重复的名称列            
    DataTable dictinct_NameColumn = dataTable.DefaultView.ToTable(true, nameColumn);
    //构建新表            
    DataTable table = new DataTable();
    #region 构建新表的列                                    

    foreach (var nameColumnItem in nameColumn)
    {
        DataColumn newColumn = new DataColumn
        {
            ColumnName = nameColumnItem
        }; //将名称列添加进新表    
        table.Columns.Add(newColumn);//添加列   所以要.Columns           
    }
    //添加需要转换的列                        
    foreach (DataRow dr in distinct_GroupingColumn.Rows)
    {
        DataColumn newColumn = new DataColumn
        {
            ColumnName = dr[groupingColumn].ToString()
        };  //将名称列添加进新表  
        table.Columns.Add(newColumn);
    }
    #endregion
    #region 向新表中添加数据            
    DataRow newRow;
    DataRow[] dnewRow;
    foreach (DataRow item in dictinct_NameColumn.Rows)
    {
        //添加一个新行                
        newRow = table.NewRow();
        string ww = "1=1";
        foreach (var nameColumnItem in nameColumn)
        {
            //为此新行添加第一个行数据                
            newRow[nameColumnItem] = item[nameColumnItem].ToString();
            ww += " and " + nameColumnItem + " ='" + item[nameColumnItem].ToString() + "' ";
        }
        //为此新行添加列数据                
        foreach (DataRow r in distinct_GroupingColumn.Rows)
        {
            dnewRow = dataTable.Select(ww + " and " + groupingColumn + " ='" + r[groupingColumn].ToString() + "'");
            if (dnewRow.Length != 0)
            {
                //将数据与新建表进行连合                        
                newRow[r[groupingColumn].ToString()] = dnewRow[0][dataColumn];
            }
        }
        table.Rows.Add(newRow);
    }
    #endregion
    return table;
}

 

示例截图

 

posted @ 2021-09-01 19:57  小杨观世界  阅读(273)  评论(0编辑  收藏  举报