asp.net with c#

DataTable 가로 세로 변환

damian 2012. 1. 10. 10:28

※ 테이블 피봇 (세로 -> 가로)
 
 /// <summary>
 /// DataTable를 CrossTab 형태로 변환한는 Class
 /// </summary>
 public class DataTable2CrossTab : DataTable
 {
  #region Convert()
  public static DataTable Convert(DataTable Source, DataColumn[] RowColumns, DataColumn ColColumn, DataColumn DataColumn)
  {
   DataTable crossTab = null;
   DataColumn[] dynamiccolumns = null;
 
  #region UI Layer에서 MessageBox 처리없이, Exception을 처리하는 Block입니다.
   try
   {
    if (Source != null)
    {
     crossTab = new DataTable(String.Format("{0}_CrossTab", Source.TableName));
 
    // 1. CrossTab의 Rows의 값을 열을 구성한다.
     crossTab.Merge(Distinct(Source, RowColumns));
 
    // 2. CrossTab의 열을 구성할 Row를 만든다.
     DataTable temp = Distinct(Source, ColColumn);
     dynamiccolumns = new DataColumn[temp.Rows.Count];
     for (int i = 0; i < temp.Rows.Count; i++)
     {
      //crossTab.Columns.Add(temp.Rows[i][ColColumn.ColumnName].ToString(), ColColumn.DataType);
      crossTab.Columns.Add(temp.Rows[i][ColColumn.ColumnName].ToString(), DataColumn.DataType);
      dynamiccolumns[i] = new DataColumn(temp.Rows[i][ColColumn.ColumnName].ToString(), DataColumn.DataType);
     }
 
    // 3. 데이터를 채운다.
     foreach (DataRow dr in crossTab.Rows)
     {
      string filter = string.Empty;
 
     for (int i = 0; i < RowColumns.Length; i++)
      {
       if (i == 0)
       {
        if (dr[RowColumns[i].ColumnName].ToString().Length > 0)
        {
         filter += String.Format("{0} = '{1}'", RowColumns[i].ColumnName, dr[RowColumns[i].ColumnName].ToString());
        }
        else
        {
         filter += String.Format("{0} is null", RowColumns[i].ColumnName);
        }
       }
       else
       {
        if (dr[RowColumns[i].ColumnName].ToString().Length > 0)
        {
         filter += String.Format(" and {0} = '{1}'", RowColumns[i].ColumnName, dr[RowColumns[i].ColumnName].ToString());
        }
        else
        {
         filter += String.Format(" and {0} is null", RowColumns[i].ColumnName);
        }
       }
      }
 
     DataRow[] drs = Source.Select(filter);
 
     for (int i = 0; i < drs.Length; i++)
      {
       dr[drs[i][ColColumn].ToString()] = drs[i][DataColumn].ToString();
      }
     }
     crossTab.AcceptChanges();
    }
   }
   catch (Exception ex) // 프로그램에서 예상하지 못한 Exception을 처리합니다.
   {
    throw ex;
   }
   finally // 더 이상 사용하지 않는 자원을 해제합니다.
   {
   }
   #endregion
 
  return crossTab;
  }
  #endregion
}

※ 테이블 피봇 (가로 -> 세로)

  #region ConvertRow2Col()
  /// <summary>
  /// Row를 Column 으로 Column을 Row로 바꾸는 메소드
  /// </summary>
  /// <param name="Source">DataTable</param>
  /// <param name="StardardColumn">기준컬럼</param>
  /// <param name="DataType">데이터형</param>
  /// <returns></returns>
  public static DataTable ConvertRow2Col(DataTable Source, DataColumn StardardColumn, Type DataType)
  {
   DataTable dtNew = new DataTable();
 
  // 기준컬럼 만들기
   DataColumn dcCol = new DataColumn(StardardColumn.ColumnName, Type.GetType("System.String"));
   dtNew.Columns.Add(dcCol);
 
  // 기준컬럼에 해당하는 행을 컬럼으로 변환하기
   DataColumn dcTemp = null;
   foreach (DataRow row in Source.Rows)
   {
    if (StardardColumn.DataType == Type.GetType("System.DateTime"))
    {
     dcTemp = new DataColumn(row[StardardColumn].ToString().Substring(0, 10), DataType);
    }
    else
    {
     dcTemp = new DataColumn(row[StardardColumn].ToString(), DataType);
    }
    dtNew.Columns.Add(dcTemp);
   }
 
  // 기준 컬럼 Remove
   Source.Columns.Remove(StardardColumn);
 
  // 컬럼 정보를 행으로 변환
   foreach (DataColumn col in Source.Columns)
   {
    DataRow dr = dtNew.NewRow();
 
   dr[StardardColumn.ColumnName] = col.ColumnName;
 
   dtNew.Rows.Add(dr);
   }
 
  for (int i = 0; i < Source.Columns.Count; i++)
   {
    for (int j = 0; j < Source.Rows.Count; j++)
    {
     dtNew.Rows[i][j+1] = Source.Rows[j][i];
    }
   }
   dtNew.AcceptChanges();
 
  return dtNew;
  }
  #endregion

'asp.net with c#' 카테고리의 다른 글

c# 연산자  (0) 2012.02.01
DataTable에 PrimaryKey 설정  (0) 2012.01.10
DataTable Merge  (0) 2012.01.10
DataTable 중복된 값 제거  (0) 2012.01.10
컨트롤 캡쳐  (0) 2012.01.10