Read an excel file on asp.net core 1.0

25,638

Solution 1

Open the package manager console in Visual Studio and type:

PM> Install-Package EPPlus.Core

Writing files is then as simple as:

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(); 
    }
}

More examples here: http://www.talkingdotnet.com/import-export-xlsx-asp-net-core/

Solution 2

In .NET Core OleDb and DataTables are gone. This makes it harder for some projects to port themselves to netcore.

If you're reading OpenXml Excel files (xlsx), the unofficial Epplus.Core can help you.

But for the older 97-2003 formats (xls) we couldn't find a solution yet.

I would hope either NPOI or ExcelDataReader would get a core version later this year, but i don't see much activity on that direction.

Solution 3

As stated in some comments and answers, there is an unnoficial EPPlus port to .Net Core (I've checked right now and it supports Core 1.0, 1.1 and 2.0)...

This code demonstrates how to do it

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);
}

Note: today I used at work and I created a dictionary mathing column numbers with column names to access directly to each column, given the name, row by row and the performance was better than using some other libraries aimed to read csv files.

Few links:

I hope it helps,

Juan

Solution 4

Add the following package:

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

Method to read excel file:

 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;
                }
            }
    }
Share:
25,638
Admin
Author by

Admin

Updated on February 13, 2021

Comments

  • Admin
    Admin over 3 years

    Hello I`m trying to upload and read an excel file on my asp.net project but all the documentation I find is for ASP MVC 5. My goal is to read the excel sheet and pass the values to an list of objects.

    This is my controller, it works for upload the file to my 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();
        }