开发者

How to export the jqgrid's filtered contents to excel?

开发者 https://www.devze.com 2023-03-19 10:16 出处:网络
Thi开发者_C百科s is exactly what I want. I want to show \"export to excel\" button in the pager of jqgrid, that will export the current set of data (based on the current filter).

Thi开发者_C百科s is exactly what I want. I want to show "export to excel" button in the pager of jqgrid, that will export the current set of data (based on the current filter).

But in Grails. Kindly suggest how to achieve it.

I was trying to do this way.


The JQGrid class provides the ExportToExcel funciton which you can use to export the grid contents to excel.

You can use the JQGridState class in order to maintain the current state (after paging, filtering, sorting, etc) of the grid upon exporting. You can also specify if you want to export the current page only, all the whole datasource.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using JQGridMVCExamples.Models;
    using Trirand.Web.Mvc;

    namespace JQGridMVCExamples.Controllers.Grid
{
public partial class GridController : Controller
{
    // This is the default action for the View. Use it to setup your grid Model.
    public ActionResult FunctionalityExportExcel()
    {
        // Get the model (setup) of the grid defined in the /Models folder.
        var gridModel = new OrdersJqGridModel();
        var ordersGrid = gridModel.OrdersGrid;

        // Setting the DataUrl to an action (method) in the controller is required.
        // This action will return the data needed by the grid
        ordersGrid.DataUrl = Url.Action("ExcelGridDataRequested");

        // customize the default Orders grid model with custom settings
        // NOTE: you need to call this method in the action that fetches the data as well,
        // so that the models match
        SetExportGrid(ordersGrid);

        // Pass the custmomized grid model to the View
        return View(gridModel);
    }

    // This method is called when the grid requests data        
    public JsonResult ExcelGridDataRequested()
    {
        // Get both the grid Model and the data Model
        // The data model in our case is an autogenerated linq2sql database based on Northwind.
        var gridModel = new OrdersJqGridModel();
        var northWindModel = new NorthwindDataContext();

        // customize the default Orders grid model with our custom settings
        SetExportGrid(gridModel.OrdersGrid);

        // Save the current grid state in Session
        // We will later need it for Excel Export
        JQGridState gridState = gridModel.OrdersGrid.GetState();
        Session["gridState"] = gridState;

        // return the result of the DataBind method, passing the datasource as a parameter
        // jqGrid for ASP.NET MVC automatically takes care of paging, sorting, filtering/searching, etc

        return gridModel.OrdersGrid.DataBind(northWindModel.Orders);
    }

    public JsonResult ExcelExport_AutoCompleteShipName(string term)
    {
        var northWindModel = new NorthwindDataContext();
        JQAutoComplete autoComplete = new JQAutoComplete();

        autoComplete.DataField = "ShipName";
        autoComplete.AutoCompleteMode = AutoCompleteMode.BeginsWith;
        autoComplete.DataSource = from o in northWindModel.Orders
                                  select o;
        return autoComplete.DataBind();
    }

    private void SetExportGrid(JQGrid ordersGrid)
    {
        // show the search toolbar
        ordersGrid.ToolBarSettings.ShowSearchToolBar = true;
        ordersGrid.ToolBarSettings.ShowSearchButton = true;

        var orderDateColumn = ordersGrid.Columns.Find(c => c.DataField == "OrderDate");
        orderDateColumn.DataFormatString = "{0:yyyy/MM/dd}";
        orderDateColumn.SearchType = SearchType.DatePicker;
        orderDateColumn.DataType = typeof(DateTime);
        orderDateColumn.SearchControlID = "DatePicker";
        orderDateColumn.SearchToolBarOperation = SearchOperation.IsEqualTo;

        var shipNameColumn = ordersGrid.Columns.Find(c => c.DataField == "ShipName");
        shipNameColumn.SearchType = SearchType.AutoComplete;
        shipNameColumn.DataType = typeof(string);
        shipNameColumn.SearchControlID = "AutoComplete";
        shipNameColumn.SearchToolBarOperation = SearchOperation.Contains;

        var orderIDColumns = ordersGrid.Columns.Find(c => c.DataField == "OrderID");
        orderIDColumns.Searchable = true;
        orderIDColumns.DataType = typeof(int);
        orderIDColumns.SearchToolBarOperation = SearchOperation.IsEqualTo;

        SetCustomerIDSearchDropDown(ordersGrid);
        SetFreightSearchDropDown(ordersGrid);
    }

    private void SetCustomerIDSearchDropDown(JQGrid ordersGrid)
    {
        // setup the grid search criteria for the columns
        JQGridColumn customersColumn = ordersGrid.Columns.Find(c => c.DataField == "CustomerID");
        customersColumn.Searchable = true;

        // DataType must be set in order to use searching
        customersColumn.DataType = typeof(string);
        customersColumn.SearchToolBarOperation = SearchOperation.IsEqualTo;
        customersColumn.SearchType = SearchType.DropDown;

        // Populate the search dropdown only on initial request, in order to optimize performance
        if (ordersGrid.AjaxCallBackMode == AjaxCallBackMode.RequestData)
        {
            var northWindModel = new NorthwindDataContext();
            var searchList = from customers in northWindModel.Customers
                             select new SelectListItem
                             {
                                 Text = customers.CustomerID,
                                 Value = customers.CustomerID
                             };

            customersColumn.SearchList = searchList.ToList();
            customersColumn.SearchList.Insert(0, new SelectListItem { Text = "All", Value = "" });
        }
    }

    private void SetFreightSearchDropDown(JQGrid ordersGrid)
    {
        // setup the grid search criteria for the columns
        JQGridColumn freightColumn = ordersGrid.Columns.Find(c => c.DataField == "Freight");
        freightColumn.Searchable = true;

        // DataType must be set in order to use searching
        freightColumn.DataType = typeof(decimal);
        freightColumn.SearchToolBarOperation = SearchOperation.IsGreaterOrEqualTo;
        freightColumn.SearchType = SearchType.DropDown;

        // Populate the search dropdown only on initial request, in order to optimize performance
        if (ordersGrid.AjaxCallBackMode == AjaxCallBackMode.RequestData)
        {
            List searchList = new List();
            searchList.Add(new SelectListItem { Text = "> 10", Value = "10" });
            searchList.Add(new SelectListItem { Text = "> 30", Value = "30" });
            searchList.Add(new SelectListItem { Text = "> 50", Value = "50" });
            searchList.Add(new SelectListItem { Text = "> 100", Value = "100" });

            freightColumn.SearchList = searchList.ToList();
            freightColumn.SearchList.Insert(0, new SelectListItem { Text = "All", Value = "" });
        }
    }

    public ActionResult ExportToExcel(string exportType)
    {

        var gridModel = new OrdersJqGridModel();
        var northWindModel = new NorthwindDataContext();
        var grid = gridModel.OrdersGrid;

        // Get the last grid state the we saved before in Session in the DataRequested action
        JQGridState gridState = Session["GridState"] as JQGridState;

        // Need to set grid options again
        SetExportGrid(grid);

        if (String.IsNullOrEmpty(exportType))
            exportType = "1";

        switch (exportType)
        {
            case "1":
                grid.ExportToExcel(northWindModel.Orders);
                break;
            case "2":
                gridState.CurrentPageOnly = false;
                grid.ExportToExcel(northWindModel.Orders, gridState);
                break;
            case "3":
                gridState.CurrentPageOnly = true;
                grid.ExportToExcel(northWindModel.Orders, gridState);
                break;
        }


        return View();
    }
}
}


The easiest way of doing this is actually to render the data to a straight HTML table, and then use the content-type to tell the browser to open it in Excel. You could always use more complex stuff, like Apache POI, to generate a real spreadsheet, but unless you need formulae, there is really no point.

So the simple way to do this is simply to use a view without complex layout. There's a VBScript example at: http://support.microsoft.com/kb/271572, which is readable enough that you shouldn't have much trouble adapting it to Grails/GSP. Note that for the data, a simple HTML response with a table in it seems to be enough, the embedded Excel-specific namespace stuff we never needed in practice.

The MIME type you need is answered here: Setting mime type for excel document, and the header in the accepted answer shows you how to pass the data into Excel. The content-disposition to an attachment is probably what you need to get the data as a download.

Even though this downloads to a .xls file which actually contains HTML, Excel still appears to do the right thing when you open the file.

0

精彩评论

暂无评论...
验证码 换一张
取 消