You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:52:09