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

如何在Windows Community Toolkit DataGrid中显示Excel数据及优化数据结构?

解决DataGrid绑定Excel数据的ObservableCollection数据结构问题

不用手写20+字段的结构体,给你三个实用方案:

方案1:用ExpandoObject动态生成行数据

ExpandoObject可以动态添加属性,完美适配Excel不确定或较多的列数,不需要提前定义实体类。

示例代码:

var excelRows = new ObservableCollection<ExpandoObject>();

// 假设已读取Excel的列名列表(columns)和每行数据(rows)
foreach (var rowData in rows)
{
    var dynamicRow = new ExpandoObject() as IDictionary<string, object>;
    for (int i = 0; i < columns.Count; i++)
    {
        // 列名作为属性名,单元格值作为属性值
        dynamicRow[columns[i]] = rowData[i];
    }
    excelRows.Add(dynamicRow);
}

// 绑定到DataGrid并自动生成列
dataGrid.ItemsSource = excelRows;
dataGrid.AutoGenerateColumns = true;

方案2:直接绑定DataTable

大多数Excel读取库(如EPPlus、NPOI)都能直接将Excel内容读取为DataTable,而WPF DataGrid可以直接绑定DataTable.DefaultView,省去集合转换的步骤。

示例代码(用EPPlus读取):

using (var excelPackage = new ExcelPackage(new FileInfo("your_file.xlsx")))
{
    var worksheet = excelPackage.Workbook.Worksheets[0];
    DataTable dataTable = new DataTable();

    // 加载表头
    for (int col = 1; col <= worksheet.Dimension.End.Column; col++)
    {
        dataTable.Columns.Add(worksheet.Cells[1, col].Text);
    }

    // 加载行数据
    for (int row = 2; row <= worksheet.Dimension.End.Row; row++)
    {
        DataRow newRow = dataTable.NewRow();
        for (int col = 1; col <= worksheet.Dimension.End.Column; col++)
        {
            newRow[col - 1] = worksheet.Cells[row, col].Text;
        }
        dataTable.Rows.Add(newRow);
    }

    // 绑定到DataGrid
    dataGrid.ItemsSource = dataTable.DefaultView;
}

方案3:自动生成实体类

如果需要类型安全的结构,不用手动写20+字段,可以用工具自动生成实体类:

  1. 把Excel表头导出为JSON格式(比如把表头行复制到在线JSON生成工具)
  2. 用Visual Studio的「粘贴特殊」→「将JSON粘贴为类」,或者QuickType等工具生成C#类
  3. 用ObservableCollection<生成的类>存储行数据

示例代码:

// 自动生成的实体类
public class ExcelRow
{
    public string CustomerName { get; set; }
    public string PhoneNumber { get; set; }
    public decimal OrderAmount { get; set; }
    // ... 自动生成的其他字段
}

var excelRows = new ObservableCollection<ExcelRow>();
// 读取Excel每行数据,映射到ExcelRow实例后添加到集合
dataGrid.ItemsSource = excelRows;

方案对比

  • ExpandoObject:灵活无约束,适合临时或列数多变的场景,但无类型校验
  • DataTable:快速便捷,和Excel读取流程无缝衔接,适合快速开发
  • 自动生成实体类:类型安全,便于后续业务逻辑扩展,适合长期维护的项目

内容的提问来源于stack exchange,提问作者samgido

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:06:23