在 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峰会上正式发布