uploaded read net c# .net vb.net excel file-upload

read - excelpackage c#



Lea un archivo Excel cargado con FileUpload Control sin guardarlo en el servidor (4)

Esta es la forma de hacer esto en MVC usando ClosedXML.Excel. Sé que esta respuesta es demasiado tarde. Solo quería poner esta respuesta para todos los que llegan a esta página después del problema de Google. En Visual Studio, haga clic en el menú de herramientas y expanda NuGet Package Manager y luego ejecute la consola del administrador de paquetes. Escriba el siguiente comando:

Install-Package ClosedXML

El modelo:

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

El controlador:

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

Este enlace tiene muchos ejemplos que muestran diferentes formas de manejar diversas cosas de Excel.

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

La vista

@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" })) { <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> }

Necesita poder leer un archivo de Excel cargado con FileUploadControl en ASP.NET. La solución se hospedará en un servidor. No quiero almacenar el archivo de Excel en el servidor. Me gustaría convertir directamente el contenido de Excel en un conjunto de datos o una tabla de datos y utilizar.

A continuación se encuentran las dos soluciones que ya encontré pero que no funcionarían para mí.

  1. LINQTOEXCEL: este método funciona cuando tiene un archivo Excel en su máquina local y está ejecutando su código en la máquina local. En mi caso, el usuario está tratando de cargar un archivo Excel desde su máquina local usando una página web alojada en un servidor.

  2. ExcelDataReader - Actualmente estoy usando este, pero esta es una herramienta de terceros. No puedo mover esto a nuestro cliente. Además, si una intersección de fila / columna lleva una fórmula, entonces los datos de esa intersección / columna no se leen en el conjunto de datos.

La mayoría de las sugerencias que encontré en google y StackOverflow funcionan cuando Excel y la solución .NET están en la misma máquina. Pero en el mío, necesito que funcione cuando la solución está alojada en un servidor, y los usuarios están tratando de cargar Excel utilizando la página web alojada en su máquina local. Si tiene alguna otra sugerencia, ¿podría informarme?


Tal vez puedas echarle un vistazo a Koogra este es un lector de Excel de código abierto (solo no hay escritor). Creo que recibirás una transmisión del cliente. Entonces puedes hacer todas tus cosas como lo estás haciendo ahora Leer desde memorystream y escribir en Database.

Espero que esto ayude.


Puede usar la propiedad InputStream de HttpPostedFile para leer el archivo en la memoria.

Aquí hay un ejemplo que muestra cómo crear una DataTable del IO.Stream de un HttpPostedFile usando EPPlus :

protected void UploadButton_Click(Object sender, EventArgs e) { if (FileUpload1.HasFile && Path.GetExtension(FileUpload1.FileName) == ".xlsx") { using (var excel = new ExcelPackage(FileUpload1.PostedFile.InputStream)) { var tbl = new DataTable(); var ws = excel.Workbook.Worksheets.First(); var hasHeader = true; // adjust accordingly // add DataColumns to DataTable foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]) tbl.Columns.Add(hasHeader ? firstRowCell.Text : String.Format("Column {0}", firstRowCell.Start.Column)); // add DataRows to DataTable int startRow = hasHeader ? 2 : 1; for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) { var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; DataRow row = tbl.NewRow(); foreach (var cell in wsRow) row[cell.Start.Column - 1] = cell.Text; tbl.Rows.Add(row); } var msg = String.Format("DataTable successfully created from excel-file. Colum-count:{0} Row-count:{1}", tbl.Columns.Count, tbl.Rows.Count); UploadStatusLabel.Text = msg; } } else { UploadStatusLabel.Text = "You did not specify a file to upload."; } }

Aquí está la versión de VB.NET :

Sub UploadButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) If (FileUpload1.HasFile AndAlso IO.Path.GetExtension(FileUpload1.FileName) = ".xlsx") Then Using excel = New ExcelPackage(FileUpload1.PostedFile.InputStream) Dim tbl = New DataTable() Dim ws = excel.Workbook.Worksheets.First() Dim hasHeader = True '' change it if required '' '' create DataColumns '' For Each firstRowCell In ws.Cells(1, 1, 1, ws.Dimension.End.Column) tbl.Columns.Add(If(hasHeader, firstRowCell.Text, String.Format("Column {0}", firstRowCell.Start.Column))) Next '' add rows to DataTable '' Dim startRow = If(hasHeader, 2, 1) For rowNum = startRow To ws.Dimension.End.Row Dim wsRow = ws.Cells(rowNum, 1, rowNum, ws.Dimension.End.Column) Dim row = tbl.NewRow() For Each cell In wsRow row(cell.Start.Column - 1) = cell.Text Next tbl.Rows.Add(row) Next Dim msg = String.Format("DataTable successfully created from excel-file Colum-count:{0} Row-count:{1}", tbl.Columns.Count, tbl.Rows.Count) UploadStatusLabel.Text = msg End Using Else UploadStatusLabel.Text = "You did not specify an excel-file to upload." End If End Sub

En aras de la integridad, aquí está el aspx:

<div> <h4>Select a file to upload:</h4> <asp:FileUpload id="FileUpload1" runat="server"> </asp:FileUpload> <br /><br /> <asp:Button id="UploadButton" Text="Upload file" OnClick="UploadButton_Click" runat="server"> </asp:Button> <hr /> <asp:Label id="UploadStatusLabel" runat="server"> </asp:Label> </div>


//Best Way To read file direct from stream IExcelDataReader excelReader = null; //file.InputStream is the file stream stored in memeory by any ways like by upload file control or from database int excelFlag = 1; //this flag us used for execl file format .xls or .xlsx if (excelFlag == 1) { //1. Reading from a binary Excel file (''97-2003 format; *.xls) excelReader = ExcelReaderFactory.CreateBinaryReader(file.InputStream); } else if(excelFlag == 2) { //2. Reading from a OpenXml Excel file (2007 format; *.xlsx) excelReader = ExcelReaderFactory.CreateOpenXmlReader(file.InputStream); } if (excelReader != null) { //... //3. DataSet - The result of each spreadsheet will be created in the result.Tables ds = excelReader.AsDataSet(); //... ////4. DataSet - Create column names from first row //excelReader.IsFirstRowAsColumnNames = true; //DataSet result = excelReader.AsDataSet(); ////5. Data Reader methods //while (excelReader.Read()) //{ // //excelReader.GetInt32(0); //} //6. Free resources (IExcelDataReader is IDisposable) excelReader.Close(); }