Read an Excel file uploaded using FileUpload Control without saving it on the server

后端 未结 4 1662
陌清茗
陌清茗 2020-12-23 14:47

Need to be able to read an Excel file uploaded using FileUploadControl in ASP.NET. The solution will be hosted on a server. I do not want to store the Excel file on the serv

相关标签:
4条回答
  • 2020-12-23 15:06

    This is how to do this in MVC using ClosedXML.Excel. I do know this answer is too late. I just wanted to put this answer for all those who land on this page after googling problem. In Visual Studio click on tools menu and expand NuGet Package Manager and then run Package manager console.Type the following command:

    Install-Package ClosedXML
    

    The Model:

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

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

    This link has many examples showing different ways of handling diverse stuff of excel.

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

    The View

    @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 讨论(0)
  • 2020-12-23 15:19

    Maybe you can take a look at Koogra this is an Open Source excel reader (readonly no writer) I think you will get a stream back from the client. Then you can do all your things like you're doing now Read from memorystream and write to Database.

    I hope this helps.

    0 讨论(0)
  • 2020-12-23 15:29
    //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();
    }
    
    0 讨论(0)
  • 2020-12-23 15:32

    You can use the InputStream property of the HttpPostedFile to read the file into memory.

    Here's an example which shows how to create a DataTable from the IO.Stream of a HttpPostedFile using 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.";
        }
    }
    

    Here's the 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
    

    For the sake of completeness, here's the 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>
    
    0 讨论(0)
提交回复
热议问题