使用代码把 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; }
示例截图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!