我想使用WebGrid将自由格式的本机查询输出发送到excel

Lyl*_*yle 8 export-to-excel c#-4.0

首先,我需要解释我的问题,我有一个原生查询应用程序,其中某人键入"选择....这个和那个",输出当前显示在分页的网格中,我被要求添加一个按钮,将数据直接从无类型数据流导出到Excel.我发现的当前代码使用网格,但仍然没有提示我出于某种原因下载.xls文件.

     [Authorize(Roles = "Portal administrator")]
    public void ExportExcel(NativeQueryVM model, int? page, string sort)
    {
        List<Dictionary<string, object>> result = null;
        String vartimedate = DateTime.Now.ToString("yyyy-dd-M--HH-mm-ss");
        try
        {
            var user = Membership.GetUser();
            var grid = new System.Web.UI.WebControls.GridView();
            if (page == null && sort == null)
            {
                if (model.QueryText.ToUpper().StartsWith("SELECT"))
                {
                    UserQueryInput queryinput = new UserQueryInput();
                    queryinput.DatabaseId = model.selectedDatabase;
                    queryinput.QueryText = model.QueryText;
                    result = lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey, user.UserName, queryinput, "Set");
                    model.QueryResultData = result;
                    ViewBag.SubmitType = "Select";
                    CreateDynamicResult(model.QueryResultData);
                    if (model == null || model.QueryResultData.Count == 0)
                    {
                        ViewBag.ResultMessage = "No Results Found";
                    }
                    else
                    {

                        WebGrid wd = new WebGrid(source: ViewBag.DynamicResult, canPage: false, canSort: false );

                        string griddata = wd.GetHtml().ToString();
                        string attachment = "attachment; filename=NativeQuery" + vartimedate + ".xls";
                        Response.ClearContent();
                        Response.AddHeader("content-disposition", attachment);
                        Response.ContentType = "application/excel";
                        StringWriter sw = new StringWriter();
                        HtmlTextWriter htw = new HtmlTextWriter(sw);
                        Response.Write(griddata);
                        Response.End(); 
                    }
                }

            }
            else
            { //This part should come when page or sort is not null for Select. Should not be executed other than SELECT
                result = lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey, user.UserName, null, "Get");
                model.QueryResultData = result;
                ViewBag.SubmitType = "Select";
                CreateDynamicResult(model.QueryResultData);
                if (model == null || model.QueryResultData.Count == 0)
                {
                    ViewBag.ResultMessage = "No Results Found";
                }
                else
                {

                }
            }

        }
        catch (Exception ex)
        {
            logger.Log(new LogMessage()
           .ForMethod("SubmitQuery")
           .WithContext(Environment.MachineName)
           .WithException(ex)
           .WithDescription("An error occurred while submiting query to get result"));
        }
    }
Run Code Online (Sandbox Code Playgroud)

Lyl*_*yle 0

大家好,回答了这个问题,我发现答案和问题位于我输入问题的代码之外。Jquery 正在拦截我的文件流的输出,另一方面,如果按钮是使用 runat=server 创建的,则模型超出范围,解决方案的主要部分涉及将模型保存到会话并将其拉回。

感谢大家的帮助...