تهیه خروجی اکسل در Asp.Net MVC
جهت دریافت خروجی اکسل از داده ها در یک برنامه Asp.Net MVC روش های متفاوتی وجود دارد و البته کتابخانه های رایگان زیادی نیز وجود دارد که این کار را برای ما تسهیل میکنند.
جهت دریافت خروجی روشی که معمولاً به کار می رود این است که داده های خروجی را در یک View نمایش می دهیم و آنگاه از آن View که در حال نمایش است یک خروجی اکسل تهیه میکنیم
اما اگر یک لیست جنریک (Generic List) داشته باشیم و بخواهیم با ساده ترین راه ممکن در کمترین زمان ممکن بدون این که آن را در View نمایش دهیم و همچنین از کتابخانه ها هم استفاده نکنیم باید به چه صورت عمل کنیم؟
یکی از روش ها همان روشی است که در Asp.Net وب فرم نیز استفاده می شد.
به این صورت که شئی از نوع GridView ایجاد میکنیم و سپس داده های مورد نظرمان را که در قالب یک جنریک لیست هستند را به آن GridView انتساب میدهیم.
در این مثال به خوبی مشاهده میکنید که چگونه از اشیائی که به عنوان کنترل در Asp.net وب فرم استفاده می شدند، می توان در MVC هم استفاده کرد.
ابتدا یک پروژه جدید در 5 MVC ایجاد کنید.
سپس یک مدل فرضی هم که شامل 10 نام به همراه شماره تلفن آنها می باشد را نیز ایجاد کنید. قصد داریم از این ده عدد نام یک خروجی در قالب فایل اکسل تهیه کنیم:
پس کلاسی با نام Userdata ایجاد میکنیم که property های آن مشابه زیر باشد یعنی نام و شماره تلفن:
public class Userdata
{
public int Id { get; set; }
public string Name { get; set; }
public string Number { get; set; }
}
و در یک کلاس فرضی دیگر تصور میکنیم لیستی از کاربران را از دیتابیس میخواند و بازگشت می دهد. نام این کلاس را UserDataService می گذاریم که به صورت زیر است:
public static class UserDataService
{
//داده های فرضی
public static IEnumerable<Userdata> userdata = new List<Userdata>() {
new Userdata{Id=1,Name="Arad",Number="121231"},
new Userdata{Id=2,Name="Erfan",Number="234234"},
new Userdata{Id=3,Name="Maryam",Number="234234"},
new Userdata{Id=4,Name="Ali",Number="234234"},
new Userdata{Id=5,Name="Majed",Number="5345345"},
new Userdata{Id=6,Name="Pejman",Number="345345"},
new Userdata{Id=7,Name="Shahriyar",Number="345345"},
new Userdata{Id=8,Name="Mehdi",Number="34531"},
new Userdata{Id=9,Name="Amin",Number="4445"},
new Userdata{Id=10,Name="Marjan",Number="5435345"},
};
public static IEnumerable<Userdata> GetAllUserData()
{
return userdata;
}
}
اکنون در اکشن مورد نظرمان این لیست را واکشی می کنیم و در قالب خروجی اکسل آن را بازگشت میدهیم تا با صدا زدن آن اکشن فایل خروجی ایجاد شود و پنجره Save در مرورگر کاربر باز شود تا بتواند فایل را ذخیره کند.
public ActionResult ExportToExcel()
{
string filename = "UserDetail";
List<Userdata> userlist = UserDataService.GetAllUserData().ToList();
GridView gv = new GridView();
gv.DataSource = userlist;
gv.DataBind();
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=" + filename + ".xls");
Response.ContentType = "application/ms-excel";
Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
Response.Charset = "";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gv.RenderControl(htw);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
return View("index");
}
دقت کنید که فضای نام System.Web.UI و System.Web.UI.WebControls و System.IO و همچنین فضای نام مدل ها را که در این پروژه shirazsun_excelExport.Models است را باید به کنترلر خود اضافه کنید.
اکنون کار ما با کنترلر و مدل ها به پایان رسیده پس به سراغ View می رویم.
باید دکمه ای در صفحه وجود داشته باشد تا با کلیک روی آن فایل ایجاد شود در واقع با کلیک روی آن دکمه اکشن ExportToExcel اجرا شود.
بنابراین یک دکمه را در یک فرم قرار میدهیم که با کلیک روی آن عملیات مورد نظر مان انجام خواهد شد.
@using (Html.BeginForm("ExportToExcel", "Home"))
{
<input type="submit" id="submit" value="دریافت خروجی" />
}
فایل پروژه را می توانید در پایین همین صفحه (فایل های ضمیمه) دانلود کنید دقت کنید که برای اجرای پروژه نیاز به نرم افزار Visual Studio 2015 دارید.
قبل از اجرای پروژه یک بار آن را Build کنید تا به طور اتوماتیک فایل های مورد نیاز آن توسط restore package manager دانلود و تامین گردد.
پیروز و سربلند باشید.
مانی فهندژ
با سلام
برای build کردن پروژه باید چیکار کنم من فایل رو اجرا کردم با ویژوال 2015 ولی وقتی F5 رو زدم با خطا مواجه می شه
مدیر وب سایت
سلام. احتمالا هنگام اجرای پروژه به اینترنت متصل نبوده اید و فایل های پیش نیاز توسط package manager دانلود نشده است...
مانی فهندژ
ممنون درست شد مشکل از همین بود
Saman
سپاس
فروشگاه ساز
بسیار مفید و آموزنده. با تشکر
حسین
سلام . چه جوری میشه نام فارسی برای هنگامی که به اکسل میره برای هدر ستون ها گذاشت ؟
منال
سلام.وقت بخیر.پروژه رو اجرا کردم .بدون خطا اجرا شد اما اصلا بعد از زدن دکمه اتفاقی نمی افتاد .چرا???