wake-up-neo.com

Lesen Sie eine mit FileUpload Control hochgeladene Excel-Datei, ohne sie auf dem Server zu speichern

Sie müssen in der Lage sein, eine mit FileUploadControl in ASP.NET hochgeladene Excel-Datei zu lesen. Die Lösung wird auf einem Server gehostet. Ich möchte die Excel-Datei nicht auf dem Server speichern. Ich möchte den Excel-Inhalt direkt in einen Datensatz oder eine Datentabelle konvertieren und verwenden.

Hier sind die zwei Lösungen, die ich bereits gefunden habe, aber für mich nicht funktionieren würde.

  1. LINQTOEXCEL - Diese Methode funktioniert, wenn Sie eine Excel-Datei auf Ihrem lokalen Computer haben und Ihren Code auf dem lokalen Computer ausführen. In meinem Fall versucht der Benutzer, eine Excel-Datei von seinem lokalen Computer über eine auf einem Server gehostete Webseite hochzuladen. 

  2. ExcelDataReader - Ich verwende diesen zurzeit, aber dies ist ein Tool von Drittanbietern. Ich kann das nicht zu unserem Kunden verschieben. Wenn ein Zeilen-/Spaltenschnittpunkt eine Formel enthält, werden die Daten dieses Zeilen-/Spaltenschnittpunkts nicht in die Datenmenge eingelesen.

Die meisten Vorschläge, die ich bei Google und StackOverflow gefunden habe, funktionieren, wenn sich sowohl die Excel- als auch die .NET-Lösung auf demselben Computer befinden. Aber bei mir muss es funktionieren, wenn die Lösung auf einem Server gehostet wird und Benutzer versuchen, Excel mithilfe der gehosteten Webseite auf ihrem lokalen Computer hochzuladen .. Wenn Sie weitere Vorschläge haben, können Sie es mir bitte mitteilen ?

23
Chandra

Sie können die Eigenschaft InputStream von HttpPostedFile verwenden, um die Datei in den Speicher zu lesen.

Hier ein Beispiel, das zeigt, wie ein DataTable aus dem IO.Stream eines HttpPostedFile mit - EPPlus erstellt wird:

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.";
    }
}

Hier ist die VB.NET-Version:

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

Der Vollständigkeit halber hier der 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>
34
Rango
//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();
}
2
Nilesh Nikumbh

Vielleicht können Sie einen Blick auf Koogra werfen dies ist ein Open-Source-Excel-Reader (Readonly kein Writer). Ich denke, Sie werden einen Stream vom Client erhalten. Dann können Sie all Ihre Dinge tun, wie Sie es jetzt tun. Aus Memorystream lesen und in die Datenbank schreiben.

Ich hoffe das hilft.

0
Jordy van Eijk

So führen Sie das in MVC mithilfe von ClosedXML.Excel aus. Ich weiß, dass diese Antwort zu spät ist. Ich wollte diese Antwort nur für all diejenigen bereitstellen, die nach dem Problem mit dem Googeln auf dieser Seite landen. Klicken Sie in Visual Studio auf das Menü Tools, erweitern Sie NuGet Package Manager, und führen Sie dann die Package Manager-Konsole aus. Geben Sie den folgenden Befehl ein:

Install-Package ClosedXML

Das Model:

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

Der Controller:

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

Dieser Link enthält viele Beispiele, die verschiedene Methoden zum Umgang mit verschiedenen Excel-Elementen zeigen.

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

Die Aussicht

@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>
}
0
Shah Aadil