如何在C#中对DataGridView行进行分组并转换表格格式
C# 实现表格分组合并(修改/生成表格)
核心思路是先对原始数据按主类别分组,再通过合并单元格或填充空值的方式实现分组展示,以下分两种常见场景给出实现方案:
一、先定义数据模型(通用)
不管用哪种UI框架,先把原始数据映射为实体类,方便后续分组处理:
public class TableItem { public string MainCategory { get; set; } // 对应原始表格第一列 public string SubCategory { get; set; } // 第二列 public string ItemName { get; set; } // 第三列 public decimal Price { get; set; } // 第四列 }
二、数据分组预处理(核心逻辑)
用LINQ按主类别分组,这是所有实现的基础:
// 假设你已经从现有表格读取到原始数据列表 List<TableItem> originalData = GetOriginalTableData(); // 按主类别分组并排序 var groupedData = originalData .GroupBy(item => item.MainCategory) .OrderBy(group => group.Key) .ToList();
三、WinForms DataGridView 修改现有表格
如果是在WinForms里修改现有DataGridView的显示格式,直接操作行和单元格合并:
// 清空原有内容 dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); // 添加列 dataGridView1.Columns.AddRange(new DataGridViewColumn[] { new DataGridViewTextBoxColumn { Name = "MainCategory", HeaderText = "主类别" }, new DataGridViewTextBoxColumn { Name = "SubCategory", HeaderText = "子类别" }, new DataGridViewTextBoxColumn { Name = "ItemName", HeaderText = "项目名称" }, new DataGridViewTextBoxColumn { Name = "Price", HeaderText = "价格" } }); // 写入分组后的数据并合并单元格 foreach (var group in groupedData) { // 添加组内第一行 int firstRowIdx = dataGridView1.Rows.Add(group.Key, group.First().SubCategory, group.First().ItemName, group.First().Price); // 添加组内剩余行(主类别列留空) foreach (var item in group.Skip(1)) { dataGridView1.Rows.Add("", item.SubCategory, item.ItemName, item.Price); } // 合并当前组的主类别单元格 dataGridView1.Rows[firstRowIdx].Cells["MainCategory"].RowSpan = group.Count(); // 合并单元格居中显示(可选) dataGridView1.Rows[firstRowIdx].Cells["MainCategory"].Style.Alignment = DataGridViewContentAlignment.MiddleCenter; } // 优化显示(可选) dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; dataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
四、生成新的Excel分组表格(用EPPlus)
如果要基于原始数据生成新的Excel表格,推荐用EPPlus库(需先安装NuGet包:Install-Package EPPlus):
using OfficeOpenXml; using OfficeOpenXml.Style; using System.IO; // 设置EPPlus非商用许可证 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("分组表格"); // 写入表头 worksheet.Cells["A1:D1"].Value = new string[] { "主类别", "子类别", "项目名称", "价格" }; // 表头样式优化(可选) var headerStyle = worksheet.Cells["A1:D1"].Style; headerStyle.Font.Bold = true; headerStyle.Fill.PatternType = ExcelFillStyle.Solid; headerStyle.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray); int currentRow = 2; foreach (var group in groupedData) { // 写入组第一行 worksheet.Cells[currentRow, 1].Value = group.Key; worksheet.Cells[currentRow, 2].Value = group.First().SubCategory; worksheet.Cells[currentRow, 3].Value = group.First().ItemName; worksheet.Cells[currentRow, 4].Value = group.First().Price; // 合并主类别单元格 worksheet.Cells[currentRow, 1, currentRow + group.Count() - 1, 1].Merge = true; // 合并单元格垂直居中 worksheet.Cells[currentRow, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center; // 写入组剩余行 foreach (var item in group.Skip(1)) { currentRow++; worksheet.Cells[currentRow, 2].Value = item.SubCategory; worksheet.Cells[currentRow, 3].Value = item.ItemName; worksheet.Cells[currentRow, 4].Value = item.Price; } currentRow++; } // 自动调整列宽 worksheet.Cells.AutoFitColumns(); // 保存文件 package.SaveAs(new FileInfo(@"D:\分组表格.xlsx")); }
内容的提问来源于stack exchange,提问作者Saul
相关产品推荐
相关产品推荐

