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

无Excel安装时用C#读取XLSM文件并绑定至DataGridView的问题

读取XLSM文件并绑定到DataGridView的完整实现方案

看起来你已经用ClosedXML迈出了读取XLSM文件的第一步,不过还缺把数据绑定到DataGridView的关键环节,我来帮你完善整个流程:

1. 先确认依赖安装

你的代码用到了XLWorkbook,这是ClosedXML库的类,所以首先要确保已经安装了对应的NuGet包:

  • 打开NuGet包管理器,搜索ClosedXML并安装;
  • 或者用Package Manager控制台执行:Install-Package ClosedXML

2. 修正并补充完整代码

我先帮你修正现有代码的小问题,再补充数据读取、绑定到DataGridView的核心逻辑:

// 先定义你的数据实体类(根据Excel列结构调整属性)
public class MyList
{
    public string ItemName { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    // 更多属性对应Excel中的列
}

private void LoadXlsmDataToGrid()
{
    // 替换成你的XLSM文件路径(绝对路径/相对路径都可以)
    var filename = "your_target_file.xlsm";
    XLWorkbook workbook = null;

    try
    {
        workbook = new XLWorkbook(filename);
    }
    catch (Exception ex)
    {
        // 显示具体错误信息,方便排查
        labelResult.Text = $"文件打开失败: {ex.Message}";
        return;
    }

    IXLWorksheet targetSheet = null;
    // 尝试获取名为"Cell"的工作表
    bool sheetFound = workbook.Worksheets.TryGetWorksheet("Cell", out targetSheet);
    if (!sheetFound)
    {
        labelResult.Text = "找不到名为'Cell'的工作表,请检查表名拼写";
        workbook.Dispose(); // 记得释放资源
        return;
    }

    List<MyList> dataList = new List<MyList>();
    // 跳过表头行(假设Excel第一行是表头),读取实际数据行
    foreach (var row in targetSheet.RowsUsed().Skip(1))
    {
        var dataItem = new MyList();
        // 根据单元格位置赋值,注意类型匹配
        dataItem.ItemName = row.Cell(1).GetValue<string>();
        
        // 处理数值类型时用TryParse避免转换异常
        if (int.TryParse(row.Cell(2).GetValue<string>(), out int qty))
        {
            dataItem.Quantity = qty;
        }
        else
        {
            dataItem.Quantity = 0; // 或者设置你需要的默认值
        }

        if (decimal.TryParse(row.Cell(3).GetValue<string>(), out decimal price))
        {
            dataItem.Price = price;
        }
        else
        {
            dataItem.Price = 0m;
        }

        dataList.Add(dataItem);
    }

    // 绑定数据到DataGridView
    dataGridView1.DataSource = dataList;
    // 自动调整列宽优化显示
    dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

    labelResult.Text = $"成功加载{dataList.Count}条数据";
    workbook.Dispose(); // 释放工作簿资源
}

3. 几个关键注意事项

  • 资源安全释放:更推荐用using语句包裹XLWorkbook,这样不用手动调用Dispose(),会自动释放资源:
    using (var workbook = new XLWorkbook(filename))
    {
        // 读取工作表、数据的逻辑都放在这里
    }
    
  • 表头自定义:如果想让DataGridView的列名和Excel表头一致,可以添加这段代码:
    var headerRow = targetSheet.Row(1);
    for (int i = 0; i < dataGridView1.Columns.Count; i++)
    {
        dataGridView1.Columns[i].HeaderText = headerRow.Cell(i + 1).GetValue<string>();
    }
    
  • 文件路径问题:如果用相对路径,要确认程序的工作目录是否正确,避免找不到文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:22:23