دریافت اطلاعات از بانک اطلاعاتی و ذخیره در فایل Excel در ASP.NET MVC

ذخیره اطلاعات در فایل Excel در ASP.NET MVC
ذخیره اطلاعات در فایل Excel در ASP.NET MVC

با سلامی دوباره خدمت تمامی همراهان مقالات آموزشی سایت میزفا ، با یکی از دیگر از مقالات آموزشی طراحی سایت با ASP.NET MVC در خدمت شما عزیزان هستیم. در این جلسه آموزشی به شما آموزش خواهیم داد که چگونه اطلاعاتی را از بانک اطلاعاتی دریافت کرده و سپس این اطلاعات را در یک فایل اکسل ذخیره نمایید پس تا پایان این مقاله آموزشی با ما همراه باشید.

نحوه گرفتن خروجی اکسل از اطلاعات دیتابیس در MVC

گام نخست : نصب کتابخانه NPOI
من برای گرفتن خروجی اکسل از اطلاعات دیتابیس از کتابخانه NPOI استفاده می‌کنم این کتابخانه می تواند هم فرمت xls. (اکسل 97-2003) و هم فرمت xlsx. (اکسل 2007+) را بخواند و بنویسید.

Package Manager Console
Package Manager Console

برای نصب NPOI، از طریق مسیر Tools -> NuGet Package Manager -> Package Manager Console وارد محیط Package Manager Console شده و سپس دستور زیر را در محیط کنسول کپی نمایید و سپس کلید Enter را بزنید تا این کتابخانه برای شما نصب شود:

Install-Package NPOI

فرآیند نصب ممکن است مدتی به طول بینجامد.

نصب کتابخانه NPOI
نصب کتابخانه NPOI

 

گام دوم : ایجاد دیتابیس با روش EF Codefirst
حال به روش EF Codefirst یک جدول به نام Students در دیتابیس برای ذخیره اطلاعات دانشجویان ایجاد می نماییم بدین منظور در پوشه Model یک class به نام Students ایجاد نموده و سپس در این کلاس فیلدهای جدول Students را تعریف می‌کنیم.
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace ExportInExcel.Models
{
    public class Students
    {
        [Key]
        public int ID { get; set; }
        public string ShNumber { get; set; }
        public string Name { get; set; }
        public string Family { get; set; }
        public string NationalNo { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
    }
}
ایجاد کلاس Context
حال برای ساخت دیتابیس به روش Code First باید یک کلاس Context به پروژه خود اضافه نمایید . برای این منظور بر روی پوشه Model راست کلیک کرده و گزینه Add و سپس گزینه Class را انتخاب نمایید حال یک نام برای کلاس context انتخاب کنید من نام ExportInExcelContext را برای کلاس Context انتخاب می‌کنم . کدهای زیر را درون کلاس Context کپی نمایید.
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace ExportInExcel.Models
{
    public class ExportInExcelContext : DbContext
    {
        public ExportInExcelContext() : base("name=DefaultConnection")
        {
        }

        public System.Data.Entity.DbSet<ExportInExcel.Models.Students> Students { get; set; }
    }
}
connectionStrings برای اتصال برنامه به بانک اطلاعاتی 
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(Local);Initial Catalog=StudentDB;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
گام سوم : ایجاد یک Controller
حال یک کنترلر خالی به پروژه ی خود اضافه نمایید من نام این کنترلر را Students قرار داده ام .
گام چهارم : ایجاد action method برای انتخاب فرمت فایل Excel
حال درون کنترلر Students یک اکشن متد به نام Index تعریف نمایید و سپس یک View برای این اکشن متد ایجاد کنید. در این View کابر نوع فرمت فایل اکسل را انتخاب می نماید.
کدهای Controller :
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using ExportInExcel.Models;

namespace ExportInExcel.Controllers
{
    public class StudentsController : Controller
    {
        private ExportInExcelContext db = new ExportInExcelContext();

        public ActionResult Index()
        {
            return View();
        } 
    }
}

کدهای View :

<div class="box">
    <p>لطفا فرمت فایل اکسل خود را انتخاب نمایید .</p>
    @using (Html.BeginForm("WriteExcelWithNPOI", "Students", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        <input type="radio" name="extension" value="xls" />  <span>فرمت xls. (اکسل 97-2003)</span> <br />
        <input type="radio" name="extension" value="xlsx" /> <span>فرمت xlsx. (اکسل 2007+)</span> <br>
        <input type="submit" class="btn btn-primary pull-left" value="ذخیره اطلاعات در فایل اکسل" />
        <p style="color:red;margin-top:20px;">@ViewBag.Alert</p>
    }
</div>
گام پنجم : ایجاد برای درج اطلاعات در فایل Excel
حال اکشن متد WriteExcelWithNPOI را برای ذخیره اطلاعات دانشجویان در فایل اکسل به کنترلر اضافه نمایید . این اکشن متد فرمت فایل Excel را به عنوان پارامتر ورودی دریافت می‌کند و سپس با توجه به فرمت انتخاب شده اطلاعات دانشجویان را از دیتابیس دریافت کرده و در یک فایل اکسل ذخیره می‌نماید.
اطلاعات دانشجویان با دستور LINQ از دیتابیس گرفته شده و در یک DataTable ریخته شده است.
کدهای اکشن متد WriteExcelWithNPOI
    public ActionResult WriteExcelWithNPOI(String extension)
        {

            IWorkbook workbook;
            var Students = (from n in db.Students select n).ToList();
            DataTable dt = new DataTable();

            dt.Columns.Add("ردیف", typeof(Int32));
            dt.Columns.Add("نام", typeof(string));
            dt.Columns.Add("نام خانوادگی", typeof(string));
            dt.Columns.Add("کدملی", typeof(string));
            dt.Columns.Add("شماره شناسنامه", typeof(string));
            dt.Columns.Add("سن", typeof(int));
            dt.Columns.Add("آدرس", typeof(string));
            dt.Columns.Add("ایمیل", typeof(string));

            foreach (var item in Students)
            {
                dt.Rows.Add(item.ID, item.Name, item.Family, item.NationalNo, item.ShNumber, item.Age, item.Address, item.Email);
            }


            if (extension == "xlsx")
            {
                workbook = new XSSFWorkbook();
            }

            else if (extension == "xls")
            {
                workbook = new HSSFWorkbook();
            }
            else {
                ViewBag.Alert = "فرمت فایل اکسل را انتخاب نکرده اید !!!";
                return View("Index");
            }

            ISheet sheet1 = workbook.CreateSheet("Sheet 1");

            //make a header row
            IRow row1 = sheet1.CreateRow(0);

            for (int j = 0; j < dt.Columns.Count; j++)
            {

                ICell cell = row1.CreateCell(j);
                String columnName = dt.Columns[j].ToString();
                cell.SetCellValue(columnName);
            }

            //loops through data
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow row = sheet1.CreateRow(i + 1);
                for (int j = 0; j < dt.Columns.Count; j++)
                {

                    ICell cell = row.CreateCell(j);
                    String columnName = dt.Columns[j].ToString();
                    cell.SetCellValue(dt.Rows[i][columnName].ToString());
                }
            }

            using (var exportData = new MemoryStream())
            {
                Response.Clear();
                workbook.Write(exportData);
                if (extension == "xlsx") //xlsx file format
                {
                    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "example.xlsx"));
                    Response.BinaryWrite(exportData.ToArray());
                }
                else if (extension == "xls")  //xls file format
                {
                    Response.ContentType = "application/vnd.ms-excel";
                    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "example.xls"));
                    Response.BinaryWrite(exportData.GetBuffer());
                }
                Response.End();
            }

            return View();
        }

رفرنس های زیر به به کنترلر Students اضافه نمایید :

using NPOI.SS.UserModel;
using System.IO;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;

به همین راحتی شما موفق شدید که اطلاعات خود را در فایل اکسل ذخیره نمایید در صورتی که در ارتباط با این مقاله و سایر مقالات آموزشی ASP.NET MVC سوالی دارید حتما در انجمن میزفا مطرح کنید.

فیلم آموزشی asp.net core 2

آرزو ابراهیمی
بیش از 6 سال است که زمینه طراحی و توسعه سایت فعالیت می‌کنم، طراح و برنامه نویس انواع سامانه‌های تخصصی پزشکی، مناقصات، فروشگاهی و … بودم و هستم و هدفم در سایت میزفا ارائه اطلاعات بروز و ناب در زمینه طراحی سایت است. تا از این طریق بتونم تجربیات و دانسته های خودم را با تمامی علاقمندان به مباحث طراحی سایت به اشتراک بزارم .

فیلم آموزشی asp.net core 2

20 نظر

20 پاسخ

  1. سلام با تشکر از سایت خوبتون ببخشید با این که سوالم به اینجا زیاد مربوط نیست
    برای ساخت سبد خرید در mvc وقتی اطلاعات را چاپ کردیم( منظورم اطلاعات سبد خریده) حالا اگر بخواهیم اون اطلاعات در بانکمون ذخیره شود باید چیکار کنیم میشه راهنمایی کنید؟

    1. سلام وقتتون بخیر
      سوال شما خیلی کلی هست و نمیشه پاسخ داد باید کدشما و نیاز شما به صورت دقیق بررسی شود.
      موفق باشید.

  2. ممنون از توضیحات خوبتون.برای پیاده سازی این مسئله در .net core چه راهکاری ارائه میدید؟

    1. با سلام من باید به طور مرتب تعدادی فایل با فرمت اکسل را از دیتابیسی دانلود کنم. بعد فایلها را داخل پوشه ای بندازم تا با اجرای ماکروی خودم اطلاعات دسته بندی شوند برای اینکه بتوانم اطلاعات را به صورت خودکار و مستقیم از طریق برنامه اکسل از دیتابیس دریافت کنم چه راهی وجود دارد؟ ممنون می شوم راهنمایی کنید. اگه این کار بشه خیلی بهم کمک می کنه خیلی وقت توی وب گشتم راه حلی پیدا نکردم.

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

  3. توضیح ها تون عااااااااالی بود ، واقعا ممنون از شما
    خیلی راحت انجام دادم و جواب هم گرفتم

  4. سلام
    من این
    آموزش را با ای جکس پیاده سازی کردم اما در نهایت خروجی اکسل نمیدهد میتوانید راهنمایی کنید.

        [HttpPost]
            public JsonResult WriteExcelWithNPOI(String extension)
            {
                int Result = 0;
                IWorkbook workbook;
                var Students = (from n in db.tbUsersAddresses select n).ToList();
                DataTable dt = new DataTable();
                dt.Columns.Add("ردیف", typeof(Int32));
                dt.Columns.Add("نام", typeof(string));
                dt.Columns.Add("نام خانوادگی", typeof(string));
                dt.Columns.Add("نام آدرس", typeof(string));
                dt.Columns.Add("آدرس", typeof(string));
                dt.Columns.Add("شماره تماس", typeof(string));
                dt.Columns.Add("کد پستی", typeof(string));
    
                foreach (var item in Students)
                {
                    dt.Rows.Add(item.RowNo, item.FirstName, item.LastName, item.AddressName, item.Address, item.Phone, item.ZipCode);
                }
    
                if (extension == "xlsx")
                {
                    workbook = new XSSFWorkbook();
                }
    
                else if (extension == "xls")
                {
                    workbook = new HSSFWorkbook();
                }
                else
                {
                    Result = -1;
                    ViewBag.Alert = "فرمت فایل اکسل را انتخاب نکرده اید !!!";
                    return Json(Result, JsonRequestBehavior.AllowGet);
                }
    
                ISheet sheet1 = workbook.CreateSheet("Sheet 1");
    
                //make a header row
                IRow row1 = sheet1.CreateRow(0);
    
                for (int j = 0; j < dt.Columns.Count; j++)
                {
    
                    ICell cell = row1.CreateCell(j);
                    String columnName = dt.Columns[j].ToString();
                    cell.SetCellValue(columnName);
                }
    
                //loops through data
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    IRow row = sheet1.CreateRow(i + 1);
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
    
                        ICell cell = row.CreateCell(j);
                        String columnName = dt.Columns[j].ToString();
                        cell.SetCellValue(dt.Rows[i][columnName].ToString());
                    }
                }
    
                using (var exportData = new MemoryStream())
                {
                    Response.Clear();
                    workbook.Write(exportData);
                    if (extension == "xlsx") //xlsx file format
                    {
                        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                        Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "example.xlsx"));
                        Response.BinaryWrite(exportData.ToArray());
                    }
                    else if (extension == "xls")  //xls file format
                    {
                        Response.ContentType = "application/vnd.ms-excel";
                        Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "example.xls"));
                        Response.BinaryWrite(exportData.GetBuffer());
                    }
                    Response.End();
                }
                Result = 0;
                return Json(Result, JsonRequestBehavior.AllowGet);
            }
    
    
        function ExportExcell()
        {
            debugger;
            var _extention;
            if ($('#R1').is(':checked'))
            {
                _extention=document.getElementById("R1").value;
            }
            else if ($('#R2').is(':checked')) {
                _extention = document.getElementById("R2").value;
            }
            alert(_extention)
            jQuery.ajax({
                url: '/UserAddress/WriteExcelWithNPOI',
                data: { extension: _extention },
                type: 'Post',
                beforeSend: function () {
                }
                ,
                success: function (data) {
                    if (data == -1) {
                        $(".box").append("فرمت را انتخاب نمایید.")
                    }
                },
            })
    
        }
    
    
            
    1. با سلام … امکان داره مشکل از کدنویسی بخش ajax باشه ، متد اکشن WriteExcelWithNPOI رو خط به خط اجرا کنید و مطمئن بشید که وارد این متد میشه … کدهای بخش View رو هم ارسال کنید تا من کد شما رو بتونم دقیق تر بررسی کنم .

      1. با سلام
        بله وارد متد می شود و تمامی خط ها اجرا میشود اما در نهایت ذخیره نمیشود
        این کد های قسمت ویو می باشد.
        با تشکر از پاسخ گویی

        @{
            ViewBag.Title = "خروجی اکسل";
        }
        
        
        @*@using (Html.BeginForm("WriteExcelWithNPOI", "UserAddress", FormMethod.Post))
        {*@
            
                لطفا فرمت فایل اکسل خود را انتخاب نمایید .
                  فرمت xls. (اکسل 97-2003) 
                 فرمت xlsx. (اکسل 2007+) 
                
                @ViewBag.Alert
            
        @*}*@
        
        
            function ExportExcell()
            {
                debugger;
                var _extention;
                if ($('#R1').is(':checked'))
                {
                    _extention=document.getElementById("R1").value;
                }
                else if ($('#R2').is(':checked')) {
                    _extention = document.getElementById("R2").value;
                }
                alert(_extention)
                jQuery.ajax({
                    url: '/UserAddress/WriteExcelWithNPOI',
                    data: new FormData($('#ExportExcell')[0]),
                    type: 'Post',
                    contentType: false,
                    cache: false,
                    processData: false,
                    beforeSend: function () {
                    }
                    ,
                    success: function (data) {
                        if (data == -1) {
                            $(".box").append("فرمت را انتخاب نمایید.")
                        }
                    },
                })
        
            }
        1. سلام … اگر وارد تابع میشه و هیچ خطایی نمیده پس کد بخش ajax و کنترلر مشکلی نداره … متاسفانه کامنت قبلی شما حذف شده … کدهای بخش ویویی که فرستادید هم بعضی از کاراکترهاش پاک شده اگر مشکلتون هنوز برطرف نشده می تونید فایل کنترلر و ویو رو برام ارسال کنید تا من هم تست کنم .
          ایمیل من : aeo.ebrahimi@gmail.com

          1. با سلام ممنون از پاسخوگویی
            تا اونجایی که من سرچ کردم متوجه شدم به علت reponse کردن نمیتوان این کد را ایجکس کرد.

          2. سلام … خواهش میکنم من که کاری نکردم… موفق باشید .

  5. باسلام.
    ممنون از اموزش خوبتون
    یه سوال دارم

    اگه بخوایم موقع لود شدن سایت مثلا مشخصه name در کلاس student از دیتابیس واکشی بشه و روی سایت نمایش قرار داده بشه باید چی کار کنیم؟؟

    1. سلام … ممنون .
      خب شما با استفاده از Linq query می تونید اطلاعاتی که میخواهید رو واکشی کنید بریزید داخل ViewBag و سپس ViewBag را با علامت @ قبلش درون ویو قرار بدید تا مقدارش نمایش داده بشه.

  6. سلام
    من حدود ۶ ماه دوره آموزشی asp.net mvc را گذراندم
    دوره ها:
    Asp.netMvc مقدماتی
    Eshop فروشگاه اینترنتی
    Asp.netMvc پیشرفته
    از قالب آماده برای طراحی سایت استفاده کردم کلا با دیزاین سایت سر وکار ندارم
    من فقط به کد نویسی علاقه مندم
    اما اکثر جا ها می خوان که هم برنامه نویسی بلد باشی و هم دیزاینر خوبی هم باشی اما من فقط با html-css-javascript آشنایی در حدی که تو دانشگاه یاد گرفتم دارم و اصلا حوصله ندارم دیزاین سایت و طراحی کنم ولی mvc و خوب یاد گرفتم مثل همین چیزایی که تو سایتتون آموزش می دید
    میشه لطف کنید راهنماییم کنید که من باید چطوری باید فعالیتم و تو زمینه برنامه نویسی ادامه بدم
    ممنون میشم اگه کمکم کنید

    1. با سلام … دوره هایی که شما گذروندید دوره های بسیار خوبی هستند اما تا زمانی که شما یک پروژه رو خودتون از صفر تا صد شروع نکنید نمی تونید خودتون رو محک بزنید چون تجربه هایی که شما در حین انجام پروژه به دست میارید به هبچ عنوان با گذروندن هیچ دوره آموزشی به دست نمیاد پیشنهاد من اینه که حتما با طراحی یک سایت از تحلیل تا پیاده سازی و اجرا ، دانش خودتون رو محک یزنید .
      دیزاین توی طراحی سایت خیلی مهمه حتی می تونم به جرات بگم از کدنویسی سمت سرور مهم تره چون کاربر و مشتری شما تنها ظاهر سایتی که طراحی کردید رو می بینند و شما و سطح کارتون رو با دیدن ظاهر پروژتون قضاوت میکنند . ممکنه شما یک سایت رو با کدنویسی بسیار حرفه ای تحویل مشتری بدید ولی اگر ظاهر مناسبی نداشته باشه قطعا مشتری از پروژه ی شما استقبالی نمیکنه … در زمینه ی دیزاین خودتونو تقویت کنید سایت های مختلف و حرفه ای رو نگاه کنید و سعی کنید از طراحی شون برای پروژه هاتون ایده بگیرید…. پیشنهاد من به شما اینه که حتما کار با فریمورک بوت استرپ رو یاد بگیرید یادگیریش برای شما اصلا کار سختی نیست بوت استرپ هم فریمورک سبکی هست و هم کلاس هایی داره که شما کمک میکنه سایتتون رو ریسپانسیو کنید قطعا کلاس های آماده ی بوت استرپ برای شما که حوصله دیزاین رو ندارید بسیار مفیده و کارتون رو خیلی ساده میکنه ..

  7. سلام اموزش ها خیلی خوب و اسونه عالیه اما فصل بندی ها معلوم نیست. مشخص نیس درس بعدی چیه و قبلی چی بوده فهرست بندی نداره و این خیلی سخته ?

    1. سلام دوست عزیز
      مقالات MVC چون صرفا مقالات آموزشی هستند و پراکنده ، فصل بندی ندارن اما سایر آموزش ها از جمله آموزش HTML ، آموزش ASP.NET Core MVC و آموزش امنیت در MVC دارای فصل بندی هستند کافیه به اولین پست هر دوره آموزشی رجوع کنید …. باز هم سعی می کنم فصل بندی ها رو به صورت شفاف تر قرار بدم …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

حداکثر حجم فایل برای آپلود: 1 مگابایت. فایل‌های مجاز برای آپلود: عکس, ویس, ویدیو, ورد یا پی دی اف, فایل متنی, زیپ. شما می‌تونید برای بهتر پرسیدن سوالتون، عکس یا ویس یا حتی فیلم در بخش نظرات میزفا آپلود کنید. برای ضبط ویس می‌تونید از خود واتس آپ استفاده کنید و بعد اینجا آپلود کنید و برای ارسال عکس هم کافی هست اسکرین شات بگیرید. Drop file here

با موفقیت ثبت شد، میزفا از شما برای عضویت در خبرنامه هفتگی تشکر میکند.

عضویت در خبرنامه هفتگی برای دریافت:

  • فیلم و مقاله رایگان سئو
  • آموزش‌های UX ، GA و GTM
  • مقاله های تخصصی ASP.NET Core
  • اطلاع رسانی از محصولات
فیلم آموزشی asp.net core 2
ترک میزفا خوب نیست!
معرفی جامع‌ترین ابزار سئو در ایران
بالای ۱۰ هزار عضو
PHZpZGVvIHdpZHRoPSI2MDAiIGhlaWdodD0iMzUwIiBwb3N0ZXI9Imh0dHBzOi8vbWl6ZmEuY29tL2Jsb2cvd3AtY29udGVudC91cGxvYWRzLzIwMjMvMDUvcG9zdGVyLW1pemZhLXRvb2xzLXZpZGVvLW1pbi5wbmciIGNvbnRyb2xzIHByZWxvYWQ9Im5vbmUiPiANCiAgIDxzb3VyY2Ugc3JjPSJodHRwczovL21pemZhLmNvbS9ibG9nL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIzLzA1L21pemZhX3Rvb2xzXzcyMHAubXA0IiB0eXBlPSJ2aWRlby9tcDQiPg0KPC92aWRlbz4=