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

如何用.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:01:21