DataTable数据行列转换,调用方法动态对数据进行行列转换,源码下载地址:源码https://download.csdn.net/download/jn40105/12849566
代码:
/// <summary>
/// DataTable行转列
/// </summary>
/// <param name="sourceDt">源DataTable</param>
/// <param name="rowName">需要装置的列</param>
/// <param name="dataColumn">数据列</param>
/// <param name="msg">返回消息</param>
/// <returns></returns>
public static DataTable RowToColumn(DataTable sourceDt, string rowName, string dataColumn, out string msg)
{
try
{
if (sourceDt == null)
{
msg = "数据源为空";
return null;
}
//获取指定列数据并去除重复项
List<string> colNames = sourceDt.AsEnumerable().Select(t => t.Field<string>(rowName)).Distinct<string>().ToList();
if (colNames == null || colNames.Count == 0)
{
msg = "找不到指定列";
return null;
}
List<string> sourceCols = new List<string>();
DataTable newDt = new DataTable();
foreach (DataColumn col in sourceDt.Columns)
{
if (col.ColumnName == rowName || col.ColumnName == dataColumn)//需要转列和数据列的跳过
continue;
DataColumn dtCol = new DataColumn();
dtCol.ColumnName = col.ColumnName;
dtCol.Caption = col.ColumnName;
dtCol.DataType = col.DataType;
newDt.Columns.Add(dtCol);
sourceCols.Add(dtCol.ColumnName);
}
//int colCount = newDt.Columns.Count;
//新增转列后的列名称
foreach (var col in colNames)
{
DataColumn dtCol = new DataColumn();
dtCol.ColumnName = col;
dtCol.Caption = col;
dtCol.DataType = sourceDt.Columns[dataColumn].DataType;
newDt.Columns.Add(dtCol);
}
//进行数据转换
foreach (DataRow row in sourceDt.Rows)
{
string selectStr = string.Empty;
foreach (var colName in sourceCols)
{
selectStr += (selectStr == "" ? "" : " AND ") + $" {colName} = '{Convert.ToString(row[colName])}'";
}
var newDtRow = newDt.Select(selectStr);
if (newDtRow.Length == 0)
{
var newRow = newDt.NewRow();
foreach (var colName in sourceCols)
{
newRow[colName] = row[colName];
}
//填充转置后的数据
newRow[Convert.ToString(row[rowName])] = row[dataColumn];
newDt.Rows.Add(newRow);
}
else
{
var dtRow = newDtRow[0];
dtRow[Convert.ToString(row[rowName])] = row[dataColumn];
}
}
msg = "";
return newDt;
}
catch (Exception ex)
{
msg = ex.Message;
return null;
}
}