如何用.NET ExcelReaderFactory读取HTML表单上传的Excel指定工作表
使用ExcelReaderFactory读取上传的Excel文件(指定第二个工作表)
步骤1:安装必要的NuGet包
首先需要安装ExcelDataReader和ExcelDataReader.DataSet两个NuGet包,可在包管理器控制台执行以下命令:
Install-Package ExcelDataReader Install-Package ExcelDataReader.DataSet
也可以通过Visual Studio的NuGet包管理器搜索并安装。
步骤2:修改控制器代码(实现Excel读取逻辑)
你无需必须将文件保存到磁盘后再读取,直接使用上传文件的流读取更高效。以下是补充完整后的控制器代码,包含读取第二个工作表的核心逻辑:
using ExcelDataReader; using System.Data; [Authorize] [HttpPost] public IActionResult DataMigration(IFormFile data) { try { // 验证上传文件有效性 if (data == null || data.Length <= 0) { throw new Exception("请选择有效的Excel文件"); } // 注册编码提供器,解决旧版.xls文件读取的编码问题 System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); // 直接使用上传文件的流读取,跳过磁盘保存步骤(若需保留文件可保留原有保存逻辑) using var stream = data.OpenReadStream(); using var reader = ExcelReaderFactory.CreateReader(stream); // 配置读取规则:使用Excel第一行作为DataTable列名 var readConfig = new ExcelDataSetConfiguration { ConfigureDataTable = _ => new ExcelDataTableConfiguration { UseHeaderRow = true } }; // 将Excel内容转换为DataSet,包含所有工作表 var excelDataSet = reader.AsDataSet(readConfig); // 获取第二个工作表(集合索引从0开始,第二个表对应索引1) DataTable secondWorksheet = excelDataSet.Tables[1]; // 示例:遍历工作表数据 foreach (DataRow row in secondWorksheet.Rows) { // 通过列名或索引读取单元格值 var columnValueByName = row["你的列名"]; var columnValueByIndex = row[0]; // 此处添加数据处理逻辑... } // 若需要从保存的文件读取,替换流为文件流即可: // using var stream = new FileStream(filePath, FileMode.Open); } catch (Exception e) { Console.WriteLine(e.Message); // 可添加错误提示逻辑,如ViewBag.Error = "读取失败:" + e.Message; } return View(); }
关键说明
- 编码注册:必须注册
CodePagesEncodingProvider,否则读取旧版.xls文件时会出现编码错误。 - 工作表索引:DataSet的Tables集合是从0开始索引的,因此第二个工作表对应索引
1;若知道工作表名称,也可通过名称获取:excelDataSet.Tables["工作表名称"]。 - 流读取优化:直接使用
data.OpenReadStream()避免磁盘IO操作,提升性能;若需保留上传文件,可保留原有文件保存逻辑,读取时改用文件流即可。 - 表头配置:
UseHeaderRow = true会将Excel第一行设为DataTable的列名,方便后续通过列名读取数据。
内容的提问来源于stack exchange,提问作者Jdslk
相关产品推荐
相关产品推荐

