PDA

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



95Amirreza
شنبه 19 دی 1394, 11:52 صبح
در این مقاله خواهیم دید که چگونه اطلاعات بدست آمده از اکسل را با استفاده از ASP.NET MVC نمایش بدهیم. باید به Microsoft Excel workbook متصل شویم و با استفاده از OLEDB.NET data provider ، داده را استخراج و سپس در View نمایش دهیم. مراحل خواندن داده از فایل اکسل به همراه کد های مربوطه برایتان در ادامه مطلب قرار داده شده است. با من همراه باشید …
خواندن داده از فایل اکسل

ابتدا یک ImportExcel در کنترلر اصلی میسازیم که یک View برمیگرداند. این متد یک View برای Get Request (http://www.w3schools.com/tags/ref_httpmethods.asp) برمیگرداند. حال یک متد دیگر به نام 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]><!-->
<style type="text/css">


/* Generic Styling, for Desktops/Laptops */
table {
width: 100%;
border-collapse: collapse;
}
/* Zebra striping */
tr:nth-of-type(odd) {
background: #eee;
}
th {
background: #333;
color: white;
font-weight: bold;
}
td, th {
padding: 6px;
border: 1px solid #ccc;
text-align: left;
}
/*
Max width before this PARTICULAR table gets nasty
This query will take effect for any screen smaller than 760px
and also iPads specifically.
*/
@@media only screen and (max-width: 760px),
(min-device-width: 768px) and (max-device-width: 1024px) {

/* Force table to not be like tables anymore */
table, thead, tbody, th, td, tr {
display: block;
}

/* Hide table headers (but not display: none;, for accessibility) */
thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}

tr { border: 1px solid #ccc; }

td {
/* Behave like a "row" */
border: none;
border-bottom: 1px solid #eee;
position: relative;
padding-left: 50%;
}

td:before {
/* Now like a table header */
position: absolute;
/* Top/left values mimic padding */
top: 6px;
left: 6px;
width: 45%;
padding-right: 10px;
white-space: nowrap;
}

/*
Label the data
*/
td:before {
content: attr(data-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>


موفق باشید :چشمک: