Загрузка и чтение из файла Excel в asp.net core 2

Ранее в Asp.Net MVC была эта сторонняя библиотека, которая легко позволяла загружать и читать файлы Excel, называемые Excel Data Reader. Нам не нужно было иметь файл на локальном диске, и это было здорово, потому что мое приложение должно работать в Azure.

Однако сейчас мы переносим эту функциональность на ядро ​​asp.net 2, и из результатов поиска видно, что это невозможно. Кто-нибудь знает библиотеки, которые позволили бы мне сделать это? Обратите внимание, я не ищу решения, которые читают с диска. Я хочу загрузить файл Excel и прочитать данные из потока напрямую.

1 ответ

Я мог читать файл Excel в "Asp .Net Core" по этому коду.

Импорт и экспорт данных с помощью EPPlus.Core.

    [HttpPost]
    public IActionResult ReadExcelFileAsync(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return Content("File Not Selected");

        string fileExtension = Path.GetExtension(file.FileName);

        if (fileExtension == ".xls" || fileExtension == ".xlsx")
        {
            var rootFolder = @"D:\Files";
            var fileName = file.FileName;
            var filePath = Path.Combine(rootFolder, fileName);
            var fileLocation = new FileInfo(filePath);

          using (var fileStream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(fileStream);
            }

            if (file.Length <= 0)
                return BadRequest(GlobalValidationMessage.FileNotFound);  

          using (ExcelPackage package = new ExcelPackage(fileLocation))
          {
          ExcelWorksheet workSheet = package.Workbook.Worksheets["Table1"];
          //var workSheet = package.Workbook.Worksheets.First();
          int totalRows = workSheet.Dimension.Rows;

          var DataList = new List<Customers>();

          for (int i = 2; i <= totalRows; i++)
           {
                  DataList.Add(new Customers
                    {
                   CustomerName = workSheet.Cells[i, 1].Value.ToString(),
                   CustomerEmail = workSheet.Cells[i, 2].Value.ToString(),
                   CustomerCountry = workSheet.Cells[i, 3].Value.ToString()
                   });
           }

                _db.Customers.AddRange(customerList);
                _db.SaveChanges();
            }
        }

        return Ok();
}

Я попробовал этот код ниже (без использования библиотек) для ASP.NET Core, и он сработал:

public ActionResult OnPostUpload(List<IFormFile> files)
    {
        try
        {
            var file = files.FirstOrDefault();
            var inputstream = file.OpenReadStream();

            XSSFWorkbook workbook = new XSSFWorkbook(stream);

            var FIRST_ROW_NUMBER = {{firstRowWithValue}};

            ISheet sheet = workbook.GetSheetAt(0);
            // Example: var firstCellRow = (int)sheet.GetRow(0).GetCell(0).NumericCellValue;

            for (int rowIdx = 2; rowIdx <= sheet.LastRowNum; rowIdx++)
               {
                  IRow currentRow = sheet.GetRow(rowIdx);

                  if (currentRow == null || currentRow.Cells == null || currentRow.Cells.Count() < FIRST_ROW_NUMBER) break;

                  var df = new DataFormatter();                

                  for (int cellNumber = {{firstCellWithValue}}; cellNumber < {{lastCellWithValue}}; cellNumber++)
                      {
                         //business logic & saving data to DB                        
                      }               
                }
        }
        catch(Exception ex)
        {
            throw new FileFormatException($"Error on file processing - {ex.Message}");
        }
    }

Если мы говорим о Razor Pages, вот простой образец, который я сегодня протестировал..

Окружающая среда: .NET Core 3.1, VS 2019

Простой класс

public class UserModel
{
    public string Name { get; set; }
    public string City { get; set; }
}

Index.cshtml.cs

usings..
using ExcelDataReader;

public void OnPost(IFormFile file)
    {
        List<UserModel> users = new List<UserModel>();
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        using (var stream = new MemoryStream())
        {
            file.CopyTo(stream);
            stream.Position = 0;
            using (var reader = ExcelReaderFactory.CreateReader(stream))
            {
                while (reader.Read()) //Each row of the file
                {
                    users.Add(new UserModel { Name = reader.GetValue(0).ToString(), City = reader.GetValue(1).ToString()});
                }
            }
        }
        //users // you got the values here
}

Отметить в просмотре

<form id="form1" method="post" enctype="multipart/form-data">
<div class="text-center">

    <input type="file" id="file1" name="file" />

</div>
<script>
    document.getElementById('file1').onchange = function () {
       document.getElementById('form1').submit();
     };
        </script>

Вам потребуется пакет Nuget ExcelDataReader, я использовал3.6.0 версия

рабочий код github

Последние версии ExcelDataReader поддерживают netstandard2.0, поэтому работают с ASP.NET Core 2. Он также нацелен на netstandard1.3, поэтому работает и с ASP.NET Core 1.x.

(не уверен, что вы искали, что сказал, что это невозможно, но это явно не так)

Сначала загрузите файл Excel и прочтите запись файла Excel с помощью asp.net core 3.1.

using System;
using Microsoft.AspNetCore.Mvc;
using ExcelFileRead.Models;
using Microsoft.AspNetCore.Hosting;
using System.IO;
using OfficeOpenXml;
using System.Linq;

namespace ExcelFileRead.Controllers
 {
 public class HomeController : Controller
  {

    private readonly IHostingEnvironment _hostingEnvironment;
    public HomeController(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }
    public ActionResult File()
    {
        FileUploadViewModel model = new FileUploadViewModel();
        return View(model);
    }
    [HttpPost]
    public ActionResult File(FileUploadViewModel model)
    {
        string rootFolder = _hostingEnvironment.WebRootPath;
        string fileName = Guid.NewGuid().ToString() + model.XlsFile.FileName;
        FileInfo file = new FileInfo(Path.Combine(rootFolder, fileName));
        using (var stream = new MemoryStream())
        {
            model.XlsFile.CopyToAsync(stream);
            using (var package = new ExcelPackage(stream))
            {
                package.SaveAs(file);
            }
        }

        using (ExcelPackage package = new ExcelPackage(file))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.FirstOrDefault();
            if (worksheet == null)
            {

                //return or alert message here
            }
            else
            {

                var rowCount = worksheet.Dimension.Rows;
                for (int row = 2; row <= rowCount; row++)
                {
                    model.StaffInfoViewModel.StaffList.Add(new StaffInfoViewModel
                    {
                        FirstName = (worksheet.Cells[row, 1].Value ?? string.Empty).ToString().Trim(),
                        LastName = (worksheet.Cells[row, 2].Value ?? string.Empty).ToString().Trim(),
                        Email = (worksheet.Cells[row, 3].Value ?? string.Empty).ToString().Trim(),
                    });
                }
                
            }
        }
        return View(model);
    }

  }
}

Подробности (шаг за шагом)

https://findandsolve.com/articles/how-to-read-column-value-from-excel-in-aspnet-core-or-best-way-to-read-write-excel-file-in-dotnet-core

Другие вопросы по тегам