Datatable行轉列

c#轉換類____行列轉換,新增行(基於DataTable)

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OracleClient;


/// <summary>
/// trans 的摘要說明
/// author: jorans xu
/// </summary>
public class trans//轉換類
{
public trans()
{
   //
   // TODO: 在此處添加構造函數邏輯
   //
}

    /// <summary>
    /// DataTable 行轉成列
    /// </summary>
    /// <param name="DataTableSource">數據源</param>
    /// <param name="groupbyDataMeber">按哪些字段轉成列</param>
    /// <param name="needTransDataMenber">需要轉的列</param>
    /// <param name="data">需要轉的列對應的值</param>
    /// <param name="defaultvalue">當對應的列沒有值時,使用該值</param>
    /// <returns></returns>
    public DataTable transRowToCol(DataTable DataTableSource,string groupbyDataMeber,string needTransDataMenber,string data,string defaultvalue)
    {
        DataTable dtSource = new DataTable();
        //建立一個副本。
        dtSource = DataTableSource.Copy();
        DataTable dt = new DataTable();
        bool flag = true;
        //這是datatable中groupby的字段
        string[] group=groupbyDataMeber.Split(',');
        int count = group.Length;
        //移到另外一個datatable,添加列名
        for (int i = 0; i < group.Length; i++)
        {
            DataColumn dc = new DataColumn();
            dc.ColumnName = group[i].ToString();
            dt.Columns.Add(dc);
        }
        //這是動態添加列名,因爲我們不知道要轉換的列的值到底有多少。
        //轉換的列的值就是作爲新的datatable的列名
        for (int j = 0; j < dtSource.Rows.Count; j++)
        {
            string colValue = dtSource.Rows[j][needTransDataMenber].ToString();
            for (int k = dt.Columns.Count - 1; k >= 0; k--)
            {
                if(colValue==dt.Columns[k].ColumnName)//已經存在,則不需要再新增列名
                {
                    break;
                }
                if (k == 0)//遍歷完所有列,如果沒有找到,則新增列名
                {
                    DataColumn dc = new DataColumn();
                    dc.ColumnName = colValue;
                    dt.Columns.Add(dc);
                }
            }     
        }
        //以下是新增數據行
        for (int i = 0; i < dtSource.Rows.Count;i++ )
        {
            DataRow dr = dt.NewRow();
            //直接把值移到新的datatable,這些是group by的列
            for (int k = 0; k < count;k++ )
            {
                dr[group[k]]=dtSource.Rows[i][group[k]].ToString();
            }
            for(int j=count;j<dt.Columns.Count;j++)
            {
                if (dtSource.Rows[i][needTransDataMenber].ToString() == dt.Columns[j].ColumnName)
                {
                    dr[dt.Columns[j].ColumnName] = dtSource.Rows[i][data].ToString();
                }
                else
                {
                    dr[dt.Columns[j].ColumnName] = defaultvalue;//在對應的列下沒有值時,給默認值
                }
            }
            dt.Rows.Add(dr);//添加了一行
            //以下是向原datatable繼續遍歷。如果有相同的groupby的字段則可以修改列值了
            //因爲groupby的字段可能不只一個,故使用標誌位flag
            for (int l = i + 1; l < dtSource.Rows.Count; l++)
            {
                for (int m = 0; m < count; m++)
                {
                    if (dtSource.Rows[l][group[m]].ToString() != dt.Rows[dt.Rows.Count - 1][group[m]].ToString())
                    {
                        flag = false;
                        break;
                    }
                    else
                    {
                        flag = true;
                    }
                }
                if (flag == true)
                {
                    for (int j = count; j < dt.Columns.Count; j++)
                    {
                        if (dtSource.Rows[l][needTransDataMenber].ToString() == dt.Columns[j].ColumnName)
                        {
                            dt.Rows[dt.Rows.Count-1][j] = dtSource.Rows[l][data].ToString();
                            dtSource.Rows.RemoveAt(l);//刪除一行
                            l--;
                            break;
                        }
                    }
                }
            }
        }
        return dt;
    }
    /// <summary>
    /// DataTable 列轉成行
    /// </summary>
    /// <param name="DataTableSource">數據源</param>
    /// <param name="groupbyDataMeber">按哪些字段轉成列</param>
    /// <param name="needTransCols">需要轉的列</param>
    /// <param name="beColName">需要轉的這些列的列名</param>
    /// <param name="valueColName">值對應的列名</param>
    /// <returns></returns>
    public DataTable transColToRow(DataTable DataTableSource,string groupbyDataMeber, string needTransCols, string beColName, string valueColName)
    {
        DataTable dts = DataTableSource;
        DataTable dt = new DataTable();
        string[] group=groupbyDataMeber.Split(',');
        string[] colname=needTransCols.Split(',');
        //create dt columnname
        for (int i = 0; i < group.Length + 2;i++ )
        {
            if (i < group.Length)
            {
                DataColumn dc = new DataColumn();
                dc.ColumnName = group[i];
                dt.Columns.Add(dc);
            }
            else
            {
                dt.Columns.Add(beColName, System.Type.GetType("System.String"));
                dt.Columns.Add(valueColName, System.Type.GetType("System.String"));
                break;
            }
        }
        for (int i = 0; i < dts.Rows.Count;i++ )
        {
            for (int j = 0; j < colname.Length;j++ )
            {
                DataRow dr = dt.NewRow();
                for (int k = 0; k < group.Length; k++)
                {
                    dr[group[k]] = dts.Rows[i][group[k]].ToString();
                }
                dr[beColName] = colname[j];
                dr[valueColName] = dts.Rows[i][colname[j]].ToString();
                dt.Rows.Add(dr);
            }
        }
        return dt;
    }
    /// <summary>
    /// DataTable 新增一行
    /// </summary>
    /// <param name="dtSource">數據源</param>
    /// <param name="rowsValue">列值</param>
    /// <returns></returns>
    public DataTable addNewRow(DataTable dtSource,string rowsValue)
    {
        string[] values = rowsValue.Split(',');
        DataRow dr = dtSource.NewRow();
        for (int i = 0; i < values.Length; i++)
        {
            if (i < dtSource.Columns.Count)
            {
                dr[i] = values[i];
            }
        }
        dtSource.Rows.Add(dr);
        return dtSource;
    }
    /// <summary>
    /// DataTable 指定行號新增一行
    /// </summary>
    /// <param name="dtSource">數據源</param>
    /// <param name="rowsValue">列值</param>
    /// <param name="index">插入行的位置</param>
    /// <returns></returns>
    public DataTable addNewRow(DataTable dtSource, string rowsValue,int index)
    {
        string[] values = rowsValue.Split(',');
        DataRow dr = dtSource.NewRow();
        for (int i = 0; i < values.Length; i++)
        {
            if (i < dtSource.Columns.Count)
            {
                dr[i] = values[i];
            }
        }
        dtSource.Rows.InsertAt(dr,index);
        return dtSource;
    }
    /// <summary>
    /// GridView合併行,groupbyDataMeberIndex字段的數據必須有序
    /// </summary>
    /// <param name="dtSource">GridView</param>
    /// <param name="groupbyDataMeber">group by 哪些字段的index</param>
    /// <returns></returns>
    public GridView mergeRows(GridView dtSource, string groupbyDataMeberIndex)
    {
        string[] group = groupbyDataMeberIndex.Split(',');
        bool flag=false;
        for (int j = 0; j < group.Length; j++)
        {
            int index = int.Parse(group[j]);
            for (int i = 0; i < dtSource.Rows.Count; i++)
            {
                for (int k = i + 1; k < dtSource.Rows.Count; k++)
                {
                    string test1 = dtSource.Rows[i].Cells[index].Text.ToString();
                    string test2 = dtSource.Rows[k].Cells[index].Text.ToString();
                    if (dtSource.Rows[i].Cells[index].Text.ToString() == dtSource.Rows[k].Cells[index].Text.ToString())
                    {
                        flag = true;
                    }
                    else
                    {
                        flag = false;
                    }
                    if (flag == false)
                    {
                        if (k > i + 1)//多行一樣,可合併
                        {
                            dtSource.Rows[i].Cells[index].RowSpan = k - i;
                            for (int m = i + 1; m < i + k - i; m++)
                            {
                                dtSource.Rows[m].Cells[index].Visible = false;
                            }
                        }
                        i = k - 1;//next 應爲k,因爲i還要進行i++,所以先k-1
                        break;
                    }
                    if (flag = true && k == dtSource.Rows.Count - 1)
                    {
                        dtSource.Rows[i].Cells[index].RowSpan = k - i + 1;
                        for (int m = i + 1; m < i + (k - i + 1); m++)
                        {
                            dtSource.Rows[m].Cells[index].Visible = false;
                            string test = dtSource.Rows[m].Cells[index].Text;
                        }
                        i = k;
                        break;
                    }
                }
            }
        }
        return dtSource;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章