خواندن اطلاعات از فایل اکسل در ASP.NET MVC

خواندن داده از فایل اکسل

در این مقاله میبینیم که چگونه داده بدست آمده از اکسل را با استفاده از MVC نمایش بدهیم. مراحل خواندن داده از فایل اکسل در ادامه مطلب قرار داده شده است

باید به Microsoft Excel workbook متصل شویم و با استفاده از OLEDB.NET data provider ، داده را استخراج و سپس در View نمایش دهیم.

مراحل خواندن داده از فایل اکسل به همراه کد های مربوطه برایتان در ادامه مطلب قرار داده شده است. با من همراه باشید …

خواندن داده از فایل اکسل

ابتدا یک ImportExcel در کنترلر اصلی میسازیم که یک View برمیگرداند.

این متد یک View برای Get Request برمیگرداند.

حال یک متد دیگر به نام ImportExcel1 میسازیم و به آن خاصیت [HttpPost] میدهیم.

از آنجایی که در متد های MVC 2 نمیتوانیم متد هایی با نام مشابه داشته باشیم ، میتوانیم ۲ action را با استفاده از خاصیت نام Action فراخوانی کنیم.

پس اکنون ImportExcel1 را با [ActionName(“Importexcel”)] می آراییم. حال اگر یک get Request بسازیم ، ImportExcel فراخوانی میشود و برای Post Request ، ImportExcel1 فراخوانی میشود.

using System;  
using System.Collections.Generic;  
using System.Data;  
using System.Data.OleDb;  
using System.IO;  
using System.Linq;  
using System.Web;  
using System.Web.Mvc;  
using ExcelUpload.Models;  
  
namespace ExcelUpload.Controllers  
{  
    public class HomeController : Controller  
    {  
         
        public ActionResult ImportExcel()  
        {  
             
  
            return View();  
        }  
        [ActionName("Importexcel")]  
        [HttpPost]  
        public ActionResult Importexcel1()  
        {  
  
  
            if (Request.Files["FileUpload1"].ContentLength > 0)  
            {  
                string extension = System.IO.Path.GetExtension(Request.Files["FileUpload1"].FileName).ToLower();  
                string query = null;  
                string connString = "";  
                  
  
  
  
                string[] validFileTypes = { ".xls", ".xlsx", ".csv" };  
                  
                string path1 = string.Format("{0}/{1}", Server.MapPath("~/Content/Uploads"), Request.Files["FileUpload1"].FileName);  
                if (!Directory.Exists(path1))  
                {  
                    Directory.CreateDirectory(Server.MapPath("~/Content/Uploads"));  
                }  
                if (validFileTypes.Contains(extension))  
                {  
                    if (System.IO.File.Exists(path1))  
                    { System.IO.File.Delete(path1); }  
                    Request.Files["FileUpload1"].SaveAs(path1);  
                    if(extension==".csv")  
                    {  
                     DataTable dt=   Utility.ConvertCSVtoDataTable(path1);  
                     ViewBag.Data = dt;  
                    }  
                    //Connection String to Excel Workbook  
                   else if (extension.Trim() == ".xls")  
                    {  
                        connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path1 + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";  
                        DataTable dt = Utility.ConvertXSLXtoDataTable(path1,connString);  
                        ViewBag.Data = dt;  
                    }  
                    else if (extension.Trim() == ".xlsx")  
                    {  
                        connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path1 + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";  
                        DataTable dt = Utility.ConvertXSLXtoDataTable(path1, connString);  
                        ViewBag.Data = dt;  
                    }  
  
                }  
                else  
                {  
                    ViewBag.Error = "Please Upload Files in .xls, .xlsx or .csv format";  
  
                }  
                  
              }  
  
            return View();  
        }  
  
          
    }  
}  

حال در اینجا یک کلاس static که شامل ۲ متد ConvertCSVtoDataTable و ConvertXSLXtoDataTable میباشد را ایجاد میکنیم.

در زیر کد مربوط به کلاس آورده شده است :

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Data.SqlClient;  
using System.IO;  
using System.Linq;  
using System.Web;  
using System.Data.OleDb;  
  
namespace ExcelUpload.Models  
{  
    public static class Utility  
    {  
        public static DataTable ConvertCSVtoDataTable(string strFilePath)  
        {  
            DataTable dt = new DataTable();  
            using (StreamReader sr = new StreamReader(strFilePath))  
            {  
                string[] headers = sr.ReadLine().Split(',');  
                foreach (string header in headers)  
                {  
                    dt.Columns.Add(header);  
                }  
  
                while (!sr.EndOfStream)  
                {  
                    string[] rows = sr.ReadLine().Split(',');  
                    if (rows.Length > 1)  
                    {  
                        DataRow dr = dt.NewRow();  
                        for (int i = 0; i < headers.Length; i++)  
                        {  
                            dr[i] = rows[i].Trim();  
                        }  
                        dt.Rows.Add(dr);  
                    }  
                }  
  
            }  
  
  
            return dt;  
        }  
  
        public static DataTable ConvertXSLXtoDataTable(string strFilePath,string connString)  
        {  
            OleDbConnection oledbConn = new OleDbConnection(connString);  
            DataTable dt=new DataTable();  
            try  
            {  
                 
                oledbConn.Open();  
                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", oledbConn);  
                OleDbDataAdapter oleda = new OleDbDataAdapter();  
                oleda.SelectCommand = cmd;  
                DataSet ds = new DataSet();  
                oleda.Fill(ds);  
  
                dt= ds.Tables[0];  
                 
            }  
            catch  
            {  
            }  
            finally  
            {  
                  
                oledbConn.Close();  
            }  
  
            return dt;  
  
        }  
        }  
}  

اکنون یک View میسازیم که شامل کنترل File Upload و یک Button باشد.

زمانی که یک Request برای ImporExcel کنترلر اصلی ایجاد میشود ، ما file Upload و button را نمایش میدهیم.

زمانی که یک فایل را انتخاب کنیم و بر روی دکمه کلیک کنیم ، یک Post Request به کنترلر اصلی ارسال میشود و متد ImportExcel1 فراخوانی میشود. در زیر کد مربوط به Razor View برای هر دو درخواست آورده شده است :

@using System.Data;  
@{  
    ViewBag.Title = "ImportExcel";  
    Layout = "~/Views/Shared/_Layout.cshtml";  
}  
  


<h2>ImportExcel</h2>


  
    <!--[if !IE]><!-->  

<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cstyle%20type%3D%22text%2Fcss%22%3E%20%20%0A%20%20%0A%20%20%0A%20%20%2F*%20Generic%20Styling%2C%20for%20Desktops%2FLaptops%20*%2F%20%20%0Atable%20%7B%20%20%0A%20%20width%3A%20100%25%3B%20%20%0A%20%20border-collapse%3A%20collapse%3B%20%20%0A%7D%20%20%0A%2F*%20Zebra%20striping%20*%2F%20%20%0Atr%3Anth-of-type(odd)%20%7B%20%20%0A%20%20background%3A%20%23eee%3B%20%20%0A%7D%20%20%0Ath%20%7B%20%20%0A%20%20background%3A%20%23333%3B%20%20%0A%20%20color%3A%20white%3B%20%20%0A%20%20font-weight%3A%20bold%3B%20%20%0A%7D%20%20%0Atd%2C%20th%20%7B%20%20%0A%20%20padding%3A%206px%3B%20%20%0A%20%20border%3A%201px%20solid%20%23ccc%3B%20%20%0A%20%20text-align%3A%20left%3B%20%20%0A%7D%20%20%0A%2F*%20%0AMax%20width%20before%20this%20PARTICULAR%20table%20gets%20nasty%20%0AThis%20query%20will%20take%20effect%20for%20any%20screen%20smaller%20than%20760px%20%0Aand%20also%20iPads%20specifically.%20%0A*%2F%20%20%0A%40%40media%20only%20screen%20and%20(max-width%3A%20760px)%2C%20%20%0A(min-device-width%3A%20768px)%20and%20(max-device-width%3A%201024px)%20%20%7B%20%20%0A%20%20%0A%20%2F*%20Force%20table%20to%20not%20be%20like%20tables%20anymore%20*%2F%20%20%0A%20table%2C%20thead%2C%20tbody%2C%20th%2C%20td%2C%20tr%20%7B%20%20%0A%20%20display%3A%20block%3B%20%20%0A%20%7D%20%20%0A%20%20%0A%20%2F*%20Hide%20table%20headers%20(but%20not%20display%3A%20none%3B%2C%20for%20accessibility)%20*%2F%20%20%0A%20thead%20tr%20%7B%20%20%0A%20%20position%3A%20absolute%3B%20%20%0A%20%20top%3A%20-9999px%3B%20%20%0A%20%20left%3A%20-9999px%3B%20%20%0A%20%7D%20%20%0A%20%20%0A%20tr%20%7B%20border%3A%201px%20solid%20%23ccc%3B%20%7D%20%20%0A%20%20%0A%20td%20%7B%20%20%0A%20%20%2F*%20Behave%20%20like%20a%20%22row%22%20*%2F%20%20%0A%20%20border%3A%20none%3B%20%20%0A%20%20border-bottom%3A%201px%20solid%20%23eee%3B%20%20%0A%20%20position%3A%20relative%3B%20%20%0A%20%20padding-left%3A%2050%25%3B%20%20%0A%20%7D%20%20%0A%20%20%0A%20td%3Abefore%20%7B%20%20%0A%20%20%2F*%20Now%20like%20a%20table%20header%20*%2F%20%20%0A%20%20position%3A%20absolute%3B%20%20%0A%20%20%2F*%20Top%2Fleft%20values%20mimic%20padding%20*%2F%20%20%0A%20%20top%3A%206px%3B%20%20%0A%20%20left%3A%206px%3B%20%20%0A%20%20width%3A%2045%25%3B%20%20%0A%20%20padding-right%3A%2010px%3B%20%20%0A%20%20white-space%3A%20nowrap%3B%20%20%0A%20%7D%20%20%0A%20%20%0A%20%2F*%20%0A%20Label%20the%20data%20%0A%20*%2F%20%20%0A%20%20%20%20%20%20%20%20td%3Abefore%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20content%3A%20attr(data-title)%3B%20%20%0A%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%0A%7D%20%20%0A%3C%2Fstyle%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="style" title="style" />

     
<!--<![endif]-->  
@using (Html.BeginForm("ImportExcel","Home",FormMethod.Post,new { enctype = "multipart/form-data" } ))  
  
{  
    

<table>  
        

<tr>

<td>Excel file</td>


<td><input type="file" id="FileUpload1" name="FileUpload1" /></td>

</tr>

   

<tr>

<td></td>


<td><input type="submit" id="Submit" name="Submit" value="Submit" /></td>

</tr>


  
    </table>


  
}  
  


<div>
  
    

<table id="">  
          
            @if (ViewBag.Data != null)  
            {  
            

<thead>
  
  
                @foreach (DataColumn column in (ViewBag.Data as System.Data.DataTable).Columns)  
                {  
                

<th>@column.ColumnName.ToUpper()</th>



                }  
       </thead>


  
                if ((ViewBag.Data as System.Data.DataTable).Rows.Count > 0)  
                {  
                    foreach (DataRow dr in (ViewBag.Data as System.Data.DataTable).Rows)  
                    {  
   

<tr>  
  
                   @foreach (DataColumn column in (ViewBag.Data as System.Data.DataTable).Columns)  
                   {  
                    

<td data-title='@column.ColumnName'>  
                          
                        @dr[column].ToString()   
                    </td>


  
                   }  
  
                </tr>



                    }  
  
                }  
                else  
                {  
                    int count = (ViewBag.Data as System.Data.DataTable).Columns.Count;  
                    

<tr>  
                      

<td colspan='@count' style="color:red;" >  
  
                               No Data Found.  
                            </td>


                    </tr>


                }  
  
            }  
            else  
            {  
                if (ViewBag.Error != null)  
                {  
                    

<tr>  
                    

<td style = "color:red;" >  
  
       @(ViewBag.Error != null ? ViewBag.Error.ToString() : "")  
                            </td >  
 
  
                    </tr >  
                    }  
                }  
            </table>


</div>

  

موفق باشید !

داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

جشنواره فروش ویژه عید تا عید با تخفیف های باورنکردنی در ام اس پی سافتبزن بریم
+