简体   繁体   English

如何将jqgrid过滤后的内容导出到excel?

[英]How to export the jqgrid's filtered contents to excel?

This 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).我想在 jqgrid 的寻呼机中显示“导出到 excel”按钮,它将导出当前数据集(基于当前过滤器)。

But in Grails.但在 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. JQGrid class 提供了 ExportToExcel 功能,可用于将网格内容导出到 excel。

You can use the JQGridState class in order to maintain the current state (after paging, filtering, sorting, etc) of the grid upon exporting.您可以使用 JQGridState class 以在导出时维护网格的当前 state(在分页、过滤、排序等之后)。 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.这样做最简单的方法实际上是将数据渲染到一个直的 HTML 表中,然后使用 content-type 告诉浏览器在 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.你总是可以使用更复杂的东西,比如 Apache POI,来生成一个真正的电子表格,但除非你需要公式,否则真的没有意义。

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.有一个 VBScript 示例,位于: http://support.microsoft.com/kb/271572 ,它具有足够的可读性,您应该不会有太多麻烦来适应 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.请注意,对于数据,包含表格的简单 HTML 响应似乎就足够了,我们在实践中不需要嵌入 Excel 特定的命名空间。

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.您需要的 MIME 类型在此处得到解答: 为 excel 文档设置 MIME 类型,接受的答案中的 header 向您展示了如何将数据传递到 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.即使此下载到实际包含 HTML 的 a.xls 文件,当您打开文件时,Excel 似乎仍然做正确的事情。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM