programing

서버에 저장하지 않고 FileUpload Control을 사용하여 업로드된 Excel 파일을 읽습니다.

minimums 2023. 4. 13. 20:42
반응형

서버에 저장하지 않고 FileUpload Control을 사용하여 업로드된 Excel 파일을 읽습니다.

ASP의 FileUploadControl을 사용하여 업로드된 Excel 파일을 읽을 수 있어야 합니다.NET. 솔루션은 서버에서 호스트됩니다.엑셀 파일을 서버에 저장하고 싶지 않습니다.엑셀 콘텐츠를 데이터셋이나 데이터 테이블로 직접 변환하여 활용하고 싶습니다.

아래는 이미 찾았지만 나에게는 효과가 없을 것 같은 두 가지 해결책입니다.

  1. LINQTOEXCEL - 이 메서드는 로컬머신에 Excel 파일이 있고 로컬머신에서 코드를 실행하고 있을 때 사용할 수 있습니다.제 경우 사용자가 서버에서 호스팅되는 웹 페이지를 사용하여 로컬 머신에서 엑셀 파일을 업로드하려고 합니다.

  2. Excel Data Reader - 현재 사용하고 있습니다만, 서드파티 툴입니다.저는 이것을 고객에게 옮길 수 없습니다.또한 행/열 교차로가 공식을 전달하는 경우 해당 행/열 교차로의 데이터가 데이터 집합으로 읽히지 않습니다.

구글과 StackOverflow에서 찾은 제안의 대부분은 Excel과 가 모두 동작합니다.NET 솔루션은 같은 머신상에 있습니다.다만, 저는 솔루션이 서버상에서 호스트 되고 있는 경우, 유저가 로컬 머신상에서 호스트 되고 있는 Web 페이지를 사용해 엑셀을 업 로드하려고 하고 있는 경우에, 이 기능이 필요합니다.다른 의견이 있으시면 알려주시겠습니까?

의 속성을 사용할 수 있습니다.HttpPostedFile파일을 메모리에 읽습니다.

다음 예시는 다음 예시를 보여 줍니다.DataTable에서IO.StreamHttpPostedFile사용:

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

여기 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

완성도를 높이기 위해 다음과 같은 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();
}

MVC에서 ClosedXML을 사용하여 이를 수행하는 방법은 다음과 같습니다.엑셀. 이 답변이 너무 늦었다는 건 알아요.구글링 문제 후 이 페이지에 접속하는 모든 분들을 위해 이 답을 넣고 싶었습니다.Visual Studio에서 도구 메뉴를 클릭하고 NuGet Package Manager를 확장한 다음 Package Manager 콘솔을 실행합니다.다음 명령을 입력합니다.

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

이 링크에는 다양한 엑셀 처리 방법을 보여주는 예가 많이 있습니다.

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



    <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>
}

Koogra를 봐주세요.이것은 오픈 소스 엑셀 리더(읽기 전용)입니다.클라이언트로부터 스트림을 받을 수 있을 거라고 생각합니다.그러면 지금처럼 모든 작업을 수행할 수 있습니다. 메모리 스트림에서 읽고 데이터베이스에 쓰십시오.

이게 도움이 됐으면 좋겠어요.

언급URL : https://stackoverflow.com/questions/12420310/read-an-excel-file-uploaded-using-fileupload-control-without-saving-it-on-the-se

반응형