如何将DataTable作为DataGrid的ItemsSource实现Excel导入展示
ClosedXML加载Excel到DataGrid解决方案
报错根因
Empty extension is not supported报错是由于你调用ImportExceltoDataTable时传入了占位符"..."作为文件路径,未使用OpenFileDialog选中的真实文件路径,ClosedXML无法识别无效的文件后缀触发报错。同时原有代码存在语法笔误、参数未生效等问题,一并修正如下:
1. 修正后按钮点击事件代码
OpenFileDialog of = new OpenFileDialog(); of.Filter = "Excel Files | *.xlsx"; of.Title = "导入Excel文件"; if (of.ShowDialog() == true) { // 传入选中的真实文件路径,第二个参数可指定工作表名,也可按需调整方法入参 dataGrid.ItemsSource = ImportExceltoDataTable(of.FileName, "Sheet1").DefaultView; }
2. 修正后Excel转DataTable方法
public static DataTable ImportExceltoDataTable(string filePath, string sheetName) { using (XLWorkbook wb = new XLWorkbook(filePath)) { // 若不需要指定工作表名,可直接保留取第一个工作表的逻辑,也可使用入参sheetName IXLWorksheet ws = wb.Worksheet(sheetName); DataTable dt = new DataTable(); bool firstRow = true; // 仅遍历有数据的行,跳过空行避免无效循环 foreach (IXLRow row in ws.RowsUsed()) { if (firstRow) { foreach (IXLCell cell in row.CellsUsed()) { dt.Columns.Add(cell.CachedValue.ToString()); } firstRow = false; } else { dt.Rows.Add(); int i = 0; foreach (IXLCell cell in row.CellsUsed()) { // 修正原有语法笔误:将]写成了} dt.Rows[dt.Rows.Count - 1][i] = cell.CachedValue.ToString(); i++; } } } return dt; } }
补充注意事项
- 请确保WPF的DataGrid控件已配置
AutoGenerateColumns="True"属性,可自动匹配DataTable的列生成表格结构 - 如果需要兼容.xls格式的旧版Excel文件,需额外安装NuGet包
ClosedXML.ExcelReader - 若Excel存在特殊格式、空值、合并单元格等场景,可按需扩展字段类型转换、空值处理逻辑
内容的提问来源于stack exchange,提问作者Ole M
相关产品推荐
相关产品推荐

