在 asp.net core 1.0 上读取一个 excel 文件

Posted

技术标签:

【中文标题】在 asp.net core 1.0 上读取一个 excel 文件【英文标题】:Read an excel file on asp.net core 1.0 【发布时间】:2017-03-26 06:31:16 【问题描述】:

您好,我正在尝试在我的 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();
    

【问题讨论】:

【参考方案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 文件的库更好.

几个链接:

EPPlus.Core:https://github.com/VahidN/EPPlus.Core 带有这个具体示例的 HowTo: https://www.codeproject.com/Articles/1217036/Console-Logging-and-Reading-Excel-Files-with-NET-C

希望对你有帮助

胡安

【讨论】:

【参考方案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;
                
            
    

【讨论】:

是的,这需要$995/dev/yr license ... imma pass

以上是关于在 asp.net core 1.0 上读取一个 excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布

读取解决方案数据文件 ASP.Net Core

在 ASP.NET Core 中读取环境变量

在 ASP.NET Core 1.0 上处理大文件上传

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

ASP.NET 5 改名 ASP.NET Core 1.0