2012-09-14 11 views
20

ASP.NET में FileUploadControl का उपयोग करके अपलोड की गई एक्सेल फ़ाइल को पढ़ने में सक्षम होना चाहिए। समाधान सर्वर पर होस्ट किया जाएगा। मैं सर्वर पर एक्सेल फ़ाइल को स्टोर नहीं करना चाहता हूं। मैं एक्सेल सामग्री को किसी डेटासेट या डेटाटेबल में सीधे रूपांतरित करना और उपयोग करना चाहता हूं।फ़ाइल पर अपलोड किए बिना फ़ाइल अपलोड नियंत्रण का उपयोग करके अपलोड की गई एक्सेल फ़ाइल पढ़ें

नीचे दिए गए दो समाधान नीचे दिए गए हैं लेकिन मेरे लिए काम नहीं करेंगे।

  1. LINQTOEXCEL - इस विधि से काम करता है आप अपने स्थानीय मशीन पर excel फ़ाइल है और आप स्थानीय मशीन पर अपने कोड चल रहे हैं जब। मेरे मामले में, उपयोगकर्ता सर्वर पर होस्ट किए गए वेबपृष्ठ का उपयोग करके अपनी स्थानीय मशीन से एक्सेल फ़ाइल अपलोड करने का प्रयास कर रहा है।

  2. एक्सेलडाटा रीडर - मैं वर्तमान में इसका उपयोग कर रहा हूं, लेकिन यह एक तृतीय पक्ष टूल है। मैं इसे अपने ग्राहक को नहीं ले जा सकता। इसके अलावा यदि कोई पंक्ति/कॉलम छेड़छाड़ एक सूत्र ले जा रही है, तो उस पंक्ति/कॉलम छेड़छाड़ का डेटा डेटासेट में नहीं पढ़ा जा रहा है।

सुझाव के अधिकांश मैं गूगल और StackOverflow काम पर पाया जब दोनों एक्सेल और .NET समाधान एक ही मशीन पर कर रहे हैं। लेकिन मेरे में, जब सर्वर पर समाधान होस्ट किया जाता है, तो मुझे इसे काम करने की आवश्यकता होती है, और उपयोगकर्ता मेजबान वेबपृष्ठ का उपयोग करके अपनी स्थानीय मशीन पर एक्सेल अपलोड करने का प्रयास कर रहे हैं। यदि आपके पास कोई अन्य सुझाव है, तो क्या आप कृपया मुझे बता सकते हैं?

उत्तर

32

आप स्मृति में फ़ाइल को पढ़ने के लिए HttpPostedFile की InputStream संपत्ति का उपयोग कर सकते हैं।

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 

के लिए:

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 संस्करण है:

यहाँ एक उदाहरण से पता चलता है जो EPPlus का उपयोग कर एक HttpPostedFile की IO.Stream से एक DataTable बनाने का तरीका बताया पूर्णता के लिए, यहां एएसपीएक्स है:

<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

अरे टिम, त्वरित प्रतिक्रिया के लिए धन्यवाद। मेरा मानना ​​है कि यह आवश्यक होगा कि होस्टिंग सर्वर पर माइक्रोसॉफ्ट ऑफिस स्थापित किया जाए। यदि हां, तो क्या आप कृपया मुझे बता सकते हैं कि क्या कोई और काम है? यदि नहीं, तो कोई समस्या नहीं है। मैं इसका परीक्षण करूंगा और आपको बता दूंगा। – Chandra

+0

@ कंधरा: जैसा कि मैंने बताया है कि मैं ['EPPLus'] (http://epplus.codeplex.com/) का उपयोग कर रहा हूं जो [एलजीपीएल लाइसेंस] (http://epplus.codeplex.com/license) के तहत नि: शुल्क है। मैं इसे गर्मजोशी से अनुशंसा कर सकता हूं और मैं अकेला नहीं हूं। http://stackoverflow.com/a/2603625/284240 (स्वीकृत उत्तर जनवरी के बगल में) –

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद !! मैं देखता हूं कि यह ओपन सोर्स कोड है जो इसे हमारे उच्च प्रोफ़ाइल ग्राहक को फिर से धक्का देना मुश्किल होगा। क्या शुद्ध .NET कोड का उपयोग करके इसे कार्यान्वित करना संभव है? – Chandra

0

शायद आप Koogra पर एक नज़र डाल सकते हैं, यह एक ओपन सोर्स एक्सेल रीडर (केवल पढ़ने वाला कोई लेखक नहीं है) मुझे लगता है कि आपको क्लाइंट से स्ट्रीम वापस मिल जाएगी। फिर आप अपनी सारी चीजें कर सकते हैं जैसे कि आप अभी कर रहे हैं मेमोरीस्ट्रीम से पढ़ें और डेटाबेस पर लिखें।

मुझे उम्मीद है कि इससे मदद मिलती है।

2
//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

यह एमओवीसी में ClosedXML.Excel का उपयोग करके ऐसा करने का तरीका है। मुझे पता है कि यह जवाब बहुत देर हो चुकी है। मैं बस उन सभी लोगों के लिए यह जवाब देना चाहता था जो समस्या के बाद इस पृष्ठ पर उतरते हैं। विजुअल स्टूडियो में टूल्स मेनू पर क्लिक करें और NuGet पैकेज मैनेजर का विस्तार करें और फिर पैकेज मैनेजर कंसोल चलाएं।टाइप निम्न आदेश:

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> 
} 
संबंधित मुद्दे