如何读取Excel文件并在MVC中的网格中填充其数据,而无需将Excel文件存储在任何位置?

我想通过浏览button控件上传Excel文件。我不需要保存它。 然后,单击button时,如何读取Excel中的数据并将其显示在网格视图中。 我需要使用MVC来完成这个任务。

请帮忙。

谢谢,Nayan

这是我修改的答案:

1)从Microsoft下载OpenXML SDK

2)创build一个空白的MVC 5项目,并将其命名为“MVCImportExcel”

3)通过浏览SDK lib子目录添加对DocumentFormat.OpenXML的引用

4)添加对WindowsBase的引用

5)创build一个名为“MyViewModel”的新模型

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using System.ComponentModel.DataAnnotations; namespace MVCImportExcel.Models { public class MyViewModel { [Required] public HttpPostedFileBase MyExcelFile { get; set; } public string MSExcelTable { get; set; } } } 

6)创build一个名为“HomeController”的新控制器

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MVCImportExcel.Models; using System.Data; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System.IO; namespace MVCImportExcel.Controllers { public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { var model = new MyViewModel(); return View(model); } [HttpPost] public ActionResult Index(MyViewModel model) { if (!ModelState.IsValid) { return View(model); } DataTable dt = GetDataTableFromSpreadsheet(model.MyExcelFile.InputStream,false); string strContent = "<p>Thanks for uploading the file</p>" + ConvertDataTableToHTMLTable(dt); model.MSExcelTable = strContent; return View(model); } public static DataTable GetDataTableFromSpreadsheet(Stream MyExcelStream, bool ReadOnly) { DataTable dt = new DataTable(); using (SpreadsheetDocument sDoc = SpreadsheetDocument.Open(MyExcelStream, ReadOnly)) { WorkbookPart workbookPart = sDoc.WorkbookPart; IEnumerable<Sheet> sheets = sDoc.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>(); string relationshipId = sheets.First().Id.Value; WorksheetPart worksheetPart = (WorksheetPart)sDoc.WorkbookPart.GetPartById(relationshipId); Worksheet workSheet = worksheetPart.Worksheet; SheetData sheetData = workSheet.GetFirstChild<SheetData>(); IEnumerable<Row> rows = sheetData.Descendants<Row>(); foreach (Cell cell in rows.ElementAt(0)) { dt.Columns.Add(GetCellValue(sDoc, cell)); } foreach (Row row in rows) //this will also include your header row... { DataRow tempRow = dt.NewRow(); for (int i = 0; i < row.Descendants<Cell>().Count(); i++) { tempRow[i] = GetCellValue(sDoc, row.Descendants<Cell>().ElementAt(i)); } dt.Rows.Add(tempRow); } } dt.Rows.RemoveAt(0); return dt; } public static string GetCellValue(SpreadsheetDocument document, Cell cell) { SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart; string value = cell.CellValue.InnerXml; if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) { return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText; } else { return value; } } public static string ConvertDataTableToHTMLTable(DataTable dt) { string ret = ""; ret = "<table id=" + (char)34 + "tblExcel" + (char)34 + ">"; ret+= "<tr>"; foreach (DataColumn col in dt.Columns) { ret += "<td class=" + (char)34 + "tdColumnHeader" + (char)34 + ">" + col.ColumnName + "</td>"; } ret+= "</tr>"; foreach (DataRow row in dt.Rows) { ret+="<tr>"; for (int i = 0;i < dt.Columns.Count;i++) { ret+= "<td class=" + (char)34 + "tdCellData" + (char)34 + ">" + row[i].ToString() + "</td>"; } ret+= "</tr>"; } ret+= "</table>"; return ret; } } } 

7)在Home下创build一个新视图,并将其命名为“Index”

 @model MVCImportExcel.Models.MyViewModel @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title></title> <style type="text/css"> #tblExcel { width: 1000px; border: none; background-color: #000000; } .tdColumnHeader { padding: 2px 2px 2px 2px; text-align: center; font-family: Verdana; font-size: 12px; font-weight: bold; background-color: cornflowerblue; color: #FFFFFF; } .tdCellData { padding: 2px 2px 2px 2px; font-family: Verdana; font-size: 12px; background-color: aqua; color: #000000; } </style> </head> <body> @using (Html.BeginForm(null,null,FormMethod.Post,new { enctype = "multipart/form-data" })) { <div> @Html.LabelFor(x => x.MyExcelFile) @Html.TextBoxFor(x => x.MyExcelFile, new { type = "file" }) @Html.ValidationMessageFor(x => x.MyExcelFile) </div> <button type="submit">Upload</button> <br /><br /> @Html.Raw(Model.MSExcelTable) } </body> </html> 

就像我在评论中所说的那样,这只适用于XLSX文件。 希望这可以帮助你或其他人在路上。

:) 大卫

我知道这个答案为时已晚。 我只是想把这个答案给所有在Google上search这个网页后出现的问题。 这是如何使用ClosedXML.Excel的方法在Visual Studio中,单击工具菜单并展开NuGet Package Manager,然后运行Package manager console.Type以下命令:

 Install-Package ClosedXML 

该模型:

 namespace ExcelUploadFileDemo.Models { public class UploadFile { [Required] public HttpPostedFileBase ExcelFile { get; set; } } } 

控制器:

 namespace ExcelUploadFileDemo.Controllers { public class HomeController : Controller { public ActionResult Index() { UploadFile UploadFile = new UploadFile(); return View(UploadFile); } [HttpPost] public ActionResult Index(UploadFile UploadFile) { if (ModelState.IsValid) { if (UploadFile.ExcelFile.ContentLength > 0) { if (UploadFile.ExcelFile.FileName.EndsWith(".xlsx") || UploadFile.ExcelFile.FileName.EndsWith(".xls")) { XLWorkbook Workbook; Try//incase if the file is corrupt { Workbook = new XLWorkbook(UploadFile.ExcelFile.InputStream); } catch (Exception ex) { ModelState.AddModelError(String.Empty, $"Check your file. {ex.Message}"); return View(); } IXLWorksheet WorkSheet = null; Try//incase if the sheet you are looking for is not found { WorkSheet = Workbook.Worksheet("sheet1"); } catch { ModelState.AddModelError(String.Empty, "sheet not found!"); return View(); } WorkSheet.FirstRow().Delete();//if you want to remove ist row foreach (var row in WorkSheet.RowsUsed()) { //do something here row.Cell(1).Value.ToString();//Get ist cell. 1 represent column number } } else { ModelState.AddModelError(String.Empty, "Only .xlsx and .xls files are allowed"); return View(); } } else { ModelState.AddModelError(String.Empty, "Not a valid file"); return View(); } } return View(); } } } 

这个链接有很多例子,展示了处理各种excel的不同方式。

https://github.com/ClosedXML/ClosedXML/tree/9ac4d868a313f308b82e94617b9cc2d28baeb1c3/ClosedXML

风景

 @model ExcelUploadFileDemo.Models.UploadFile @{ ViewBag.Title = "Upload Excel File"; } <h2>Upload an Excel File</h2> @using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken(); <div class="form-horizontal"> @Html.ValidationSummary("", new { @class = "text-danger" }); <div class="form-group"> @Html.LabelFor(model => model.ExcelFile, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.TextBoxFor(model => model.ExcelFile, new { type = "file", @class = "form-control" }) @Html.ValidationMessageFor(model => model.ExcelFile, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type = "submit" value="Submit" class="btn btn-default" /> </div> </div> </div> }