عنوان:

‫تهیه خروجی PDF و اکسل از حاصل جستجوی پویای jqGrid به کمک PDF Report


نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۰۴/۱۶ ۸:۵
آدرس: www.dntips.ir
پیشنیازها
- صفحه بندی و مرتب سازی خودکار اطلاعات به کمک jqGrid در ASP.NET MVC
- فعال سازی و پردازش جستجوی پویای jqGrid در ASP.NET MVC
- سفارشی سازی عناصر صفحات پویای افزودن و ویرایش رکوردهای jqGrid در ASP.NET MVC
- آشنایی با کتابخانه‌ی PDF Report


اضافه کردن دکمه‌ی خروجی به jqGrid

برای تهیه خروجی از jqGrid نیاز است بدانیم، اکنون در چه صفحه‌ای از اطلاعات قرار داریم؟ بر روی چه ستونی، مرتب سازی صورت گرفته‌است؟ بر روی کدام فیلدها با چه مقادیری جستجو انجام شده‌است؟ تا ... بتوانیم بر این مبنا، منبع داده‌ی موجود را فیلتر کرده و لیست نهایی را تبدیل به گزارش کنیم. گزارشی که دقیقا با اطلاعاتی که کاربر در صفحه مشاهده می‌کند، تطابق داشته باشد.
خوشبختانه تمام این سؤالات توسط متد توکار excelExport در سمت سرور قابل دریافت است:
@section Scripts
{
    <script type="text/javascript">
    $(document).ready(function () {
        $('#list').jqGrid({
            caption: "آزمایش ششم",
                 // مانند قبل
            }).navGrid(
                 // مانند قبل
                    }).jqGrid('navButtonAdd', '#pager', {
                        caption: "", buttonicon: "ui-icon-print", title: "خروجی پی دی اف",
                        onClickButton: function () {
                            $("#list").jqGrid('excelExport', { url: '@Url.Action("GetProducts", "Home")' });
                        }
                    });
        });
    </script>
}

در اینجا توسط متد navButtonAdd یک دکمه‌ی جدید را اضافه کرده‌ایم که کلیک بر روی آن سبب فراخوانی متد excelExport و ارسال اطلاعات گزارش به url تنظیم شده‌است. باید دقت داشت که این اطلاعات از طریق Http Get به سرور ارسال می‌شوند و دقیقا اجزای آن همان اجزای جستجوی پویای jqGrid است:
public ActionResult GetProducts(string sidx, string sord, int page, int rows,
                                             bool _search, string searchField, string searchString,
                                             string searchOper, string filters, string oper)
با این تفاوت که یک oper نیز به مجموعه‌ی پارامترهای ارسالی به سرور اضافه شده‌است. این oper در اینجا با excel مقدار دهی می‌شود.
البته چون تعداد این پارامترها بیش از اندازه شده‌است، بهتر است آن‌ها را تبدیل به یک کلاس کرد:
namespace jqGrid06.Models
{
    public class JqGridRequest
    {
        public string sidx { set; get; }
        public string sord { set; get; }
        public int page { set; get; }
        public int rows { set; get; }
        public bool _search { set; get; }
        public string searchField { set; get; }
        public string searchString { set; get; }
        public string searchOper { set; get; }
        public string filters { set; get; }
        public string oper { set; get; }
    }
}
و متد جستجوی پویا را به نحو ذیل بازنویسی نمود:
        public ActionResult GetProducts(JqGridRequest request)
        {
            var list = ProductDataSource.LatestProducts;

            var pageIndex = request.page - 1;
            var pageSize = request.rows;
            var totalRecords = list.Count;
            var totalPages = (int)Math.Ceiling(totalRecords / (float)pageSize);

            var productsQuery = list.AsQueryable();

            productsQuery = new JqGridSearch().ApplyFilter(productsQuery, request, this.Request.Form);
            productsQuery = productsQuery.OrderBy(request.sidx + " " + request.sord);

            if (string.IsNullOrWhiteSpace(request.oper))
            {
                productsQuery = productsQuery
                                    .Skip(pageIndex * pageSize)
                                    .Take(pageSize);
            }
            else if (request.oper == "excel")
            {
                productsQuery = productsQuery
                                    .Skip(pageIndex * pageSize);
            }

            var productsList = productsQuery.ToList();

            if (!string.IsNullOrWhiteSpace(request.oper) && request.oper == "excel")
            {
                new ProductsPdfReport().CreatePdfReport(productsList);
            }

            var productsData = new JqGridData
            {
                Total = totalPages,
                Page = request.page,
                Records = totalRecords,
                Rows = (productsList.Select(product => new JqGridRowData
                {
                    Id = product.Id,
                    RowCells = new List<string>
                    {
                        product.Id.ToString(CultureInfo.InvariantCulture),
                        product.Name,
                        product.AddDate.ToPersianDate(),
                        product.Price.ToString(CultureInfo.InvariantCulture)
                    }
                })).ToArray()
            };

            return Json(productsData, JsonRequestBehavior.AllowGet);
        }

توضیحات:
اکثر قسمت‌های این متد با متدی که در مطلب «فعال سازی و پردازش جستجوی پویای jqGrid در ASP.NET MVC» مشاهده کردید یکی است؛ برای مثال order by آن با استفاده از کتابخانه‌ی Dynamic LINQ به صورت پویا عمل می‌کند و متد ApplyFilter، کار تهیه where پویا را انجام می‌دهد.
فقط در اینجا بررسی و پردازش پارامتر oper نیز اضافه شده‌است. اگر این پارامتر مقدار دهی شده باشد، یعنی نیاز است کل اطلاعات را واکشی کرد؛ زیرا می‌خواهیم گزارش گیری کنیم و نه اینکه صرفا اطلاعات یک صفحه را به کاربر بازگشت دهیم. همچنین در اینجا List نهایی فیلتر شده به یک گزارش Pdf Report ارسال می‌شود. این گزارش چون نهایتا اطلاعات را در مرورگر کاربر Flush می‌کند، کار به اجرای سایر قسمت‌ها نخواهد رسید و همینجا گزارش نهایی تهیه می‌شود.



کدهای کامل این مثال را از اینجا می‌توانید دریافت کنید
jqGrid06.7z
 

نظرات

  • مهمان در ۱۳۹۳/۰۴/۱۷ ۹:۳۸
    با سلام  من هنگام اجرای پروژه  با خطای  زیر  روربرو  میشم
    Could not load file or assembly 'System.Web.Mvc, Version=4.0.0.0, Culture=neutral, 
    PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
    • وحید نصیری در ۱۳۹۳/۰۴/۱۷ ۹:۵۴
      - ابتدا به اینترنت وصل شوید.
      - سپس در خط فرمان پاورشل نیوگت دستور زیر را اجرا کنید:
      PM> update-package -reinstall
      به این صورت بسته‌های MVC 5 آن به صورت صحیح به پروژه اضافه می‌شوند.
      • مهمان در ۱۳۹۳/۰۴/۱۷ ۱۷:۵۷
        متاسفانه با تایپ  فرمان   بالا پیغام  زیر  صادر  می‌گردد

        Update-Package : A parameter cannot be found that matches parameter name 'reinstall'.
        At line:1 char:26
        + update-package -reinstall <<<< 
            + CategoryInfo          : InvalidArgument: (:) [Update-Package], ParameterBindingException
            + FullyQualifiedErrorId : NamedParameterNotFound,NuGet.PowerShell.Commands.UpdatePackageCommand
        • وحید نصیری در ۱۳۹۳/۰۴/۱۷ ۱۹:۰
          دریافت آخرین نگارش نیوگت از اینجا ^ و ^

  • مهمان در ۱۳۹۳/۰۴/۱۸ ۱۱:۴۶
    با سلام و ادب

    در پروژه   خروجی Excel  بوسیله EPPlus  موجود  نبود میشه راهنمایی کنید
    • وحید نصیری در ۱۳۹۳/۰۴/۱۸ ۱۱:۵۲
      اگر به تصویر آخر دقت کنید، خروجی اکسل کتابخانه‌ی Pdf Report در قسمت پیوست‌های فایل PDF تولیدی قرار می‌گیرد.
  • داوود در ۱۳۹۳/۰۴/۲۷ ۱۵:۲۷
    با سلام 
    به نظر فابل zip این مطلب دچار مشکل است بعد از دانلود نتوانستم آن را اکسترکت کنم
    درضمن پسوند عجیبی دارد (jqGrid06.7z )
    ممنون
    • وحید نصیری در ۱۳۹۳/۰۴/۲۷ ۱۷:۱۵
      از برنامه‌ی 7zip یا winrar استفاده کنید.
  • مهمان در ۱۳۹۳/۰۵/۱۴ ۱۵:۷
    یه مشکلی که این گرید با راست به چپ دارد نمایش اشتباه تعداد رکورد‌ها هنگامی که از هزار بیشتر می‌شود

    تصویر بالا تعداد هزار و پانصد می‌باشد .
    • وحید نصیری در ۱۳۹۳/۰۵/۱۴ ۱۵:۵۱
      پیش فرض‌های آن قابل سفارشی سازی است:
      $.jgrid.formatter.integer.thousandsSeparator = ',';
      $.jgrid.formatter.number.thousandsSeparator = ',';
      $.jgrid.formatter.currency.thousandsSeparator = ',';
      این سطرها را پیش از تعریف گرید قرار دهید.
  • علی پناهیان در ۱۳۹۴/۰۵/۰۸ ۱۷:۵۴
    باسلام و تشکر؛ میخواستم بدونم کتابخونه ذیل قابلیت  گرفتن گزارش جداگانه بصورت pdf یا Excel رو داره؟
    و همچنین تو گزارش گیری از گربد با فیلدهای زیاد  قابلیت گزارش گیری بصورت landscape وجود داره؟