无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
相关产品推荐
相关产品推荐

