【问题标题】:Read an excel file on asp.net core 1.0在 asp.net core 1.0 上读取一个 excel 文件
【发布时间】:2025-12-31 11:55:07
【问题描述】:

您好,我正在尝试在我的 asp.net 项目中上传和读取一个 excel 文件,但我找到的所有文档都是针对 ASP MVC 5 的。 我的目标是阅读 excel 表并将值传递给对象列表。

这是我的控制器,它可以将文件上传到我的 wwwroot/uploads

public class HomeController : Controller
{
    private IHostingEnvironment _environment;

    public HomeController(IHostingEnvironment environment)
    {
        _environment = environment;
    }

    public IActionResult index()
    {
        return View();
    }



    [HttpPost]
    public async Task<IActionResult> Index(ICollection<IFormFile> files)
    {
        var uploads = Path.Combine(_environment.WebRootPath, "uploads");
        foreach (var file in files)
        {
            if (file.Length > 0)
            {
                using (var fileStream = new FileStream(Path.Combine(uploads,    file.FileName), FileMode.Create))
                {
                    await file.CopyToAsync(fileStream);
                }
            }
        }
        return View();
    }

【问题讨论】:

    标签: c# excel import asp.net-core-1.0


    【解决方案1】:

    在大多数情况下,在读取 Excel 文件时使用 ASP.NET 4 还是 ASP.NET Core 并不重要。你只需要找到一个允许这样做的库。建议使用 NuGet 将此类库添加到您的项目中。

    在此处查看如何安装 NuGet 包的说明:https://docs.nuget.org/ndocs/guides/install-nuget

    我可以推荐使用的一个库是 EPPlus (https://www.nuget.org/packages/EPPlus)。

    当您完成文件上传并将 Excel 文件存储在某处后,您只需使用 EPPlus 打开它即可阅读。简单示例如下:

    var package = new ExcelPackage(new FileInfo("sample.xlsx"));
    
    ExcelWorksheet workSheet = package.Workbook.Worksheets[0];
    
    for (int i = workSheet.Dimension.Start.Column; i <= workSheet.Dimension.End.Column; i++)
    {
        for (int j = workSheet.Dimension.Start.Row; j <= workSheet.Dimension.End.Row; j++)
        {
            object cellValue = workSheet.Cells[i, j].Value;
        }
    }
    

    【讨论】:

    • .NET Core 不支持 EPPlus,但有一个名为 EPPlus.core 的 EPPlus 库的非官方端口,可用于读写 excel。看到这个link
    • 我想说这很重要,尤其是当您尝试读取 xls 或受密码保护的 Excel 文件时。大多数包使用已在 Core 中未实现的已弃用的数据结构,例如数据表或 ole 连接提供程序。受密码保护的文件也需要 Office com 库来进行读/写操作。
    【解决方案2】:

    在 .NET Core OleDb 和 DataTables 中消失了。这使得一些项目更难将自己移植到 netcore。

    如果您正在阅读 OpenXml Excel 文件 (xlsx),非官方的 Epplus.Core 可以为您提供帮助。

    但对于较旧的 97-2003 格式 (xls),我们还没有找到解决方案。

    我希望 NPOI 或 ExcelDataReader 都能在今年晚些时候获得核心版本,但我看不到在这个方向上有太多活动。

    【讨论】:

      【解决方案3】:

      在 Visual Studio 中打开 package manager console 并输入:

      PM> Install-Package EPPlus.Core
      

      然后编写文件就这么简单:

      public void WriteExcel(string fileName)
      {
      
      
          FileInfo file = new FileInfo(fileName);
          /// overwrite old file
          if (file.Exists)
          {
              file.Delete();
              file = new FileInfo(fileName);
          }
          using (ExcelPackage package = new ExcelPackage(file))
          {
              // add a new worksheet to the empty workbook
              ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Employee");
              worksheet.Cells["A1"].Value = "HELLO WORLD!!!";
              package.Save(); 
          }
      }
      

      更多示例:http://www.talkingdotnet.com/import-export-xlsx-asp-net-core/

      【讨论】:

        【解决方案4】:

        正如一些 cmets 和答案中所述,.Net Core 有一个非官方的 EPPlus 端口(我现在已经检查过,它支持 Core 1.0、1.1 和 2.0)...

        这段代码演示了如何做到这一点

        var filePath = @"D:/test.xlsx";
        FileInfo file = new FileInfo(filePath);
        
        using (ExcelPackage package = new ExcelPackage(file))
        {       
            ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
            int rowCount = worksheet.Dimension.Rows;
            int ColCount = worksheet.Dimension.Columns;
        
            var rawText = string.Empty;
            for (int row = 1; row <= rowCount; row++)
            {
                for (int col = 1; col <= ColCount; col++)
                {   
                    // This is just for demo purposes
                    rawText += worksheet.Cells[row, col].Value.ToString() + "\t";    
                }
                rawText+="\r\n";
            }
            _logger.LogInformation(rawText);
        }
        

        注意:今天我在工作中使用,我创建了一个字典,计算列号和列名,可以直接访问每一列,给定名称,逐行访问,性能比使用其他一些旨在读取 csv 文件的库更好.

        几个链接:

        希望对你有帮助

        胡安

        【讨论】:

          【解决方案5】:

          添加以下包:

          Install-Package Syncfusion.XlsIO.Net.Core -Version 17.2.0.49
          

          excel文件读取方法:

           private DataTable ConvertExcelToDataTable(string path)
              {
                      using (Stream inputStream = File.OpenRead(path))
                      {
                          using (ExcelEngine excelEngine = new ExcelEngine())
                          {
                              IApplication application = excelEngine.Excel;
                              IWorkbook workbook = application.Workbooks.Open(inputStream);
                              IWorksheet worksheet = workbook.Worksheets[0];
          
                              DataTable dataTable = worksheet.ExportDataTable(worksheet.UsedRange, ExcelExportDataTableOptions.ColumnNames);
                              return dataTable;
                          }
                      }
              }
          

          【讨论】: