2010-11-18 208 views
4

我已经从HTML表中检索数据,然后通过网页方式发送到服务器上的客户端下面的代码:导出HTML表到Excel

function dtExportToCSV(dataTable) { 
    var elements = dtDataToJSON(dataTable); 
    var headers = dtHeadersToJSON(tableSelector); 

    jQuery.ajax({ 
     type: "POST", 
     url: "Report.aspx/exportToCSV", 
     data: "{'elements': " + elements + ", 'headers': " + JSON.stringify(headers) + "}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 

     success: function(msg) { 
      if (msg.d) { 
      } else { 
      } 
     }, 

     error: function(xhr, ajaxOptions, thrownError) { 
      alert(xhr.statusText); 
     } 
    }); 
} 

然后我用的是以下代码在服务器端,将检索到的数据导出到CSV文件。

/// <summary> 
/// 
/// </summary> 
/// <param name="elements"></param> 
/// <param name="headers"></param> 
[WebMethod(EnableSession=true)] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public static bool exportToCSV(List<object> elements, List<string> headers) 
{ 
    try 
    { 
     string attachmentType = "attachment; filename=ShortageReport.csv"; 

     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.ClearHeaders(); 
     HttpContext.Current.Response.ClearContent(); 
     HttpContext.Current.Response.AddHeader("content-disposition", attachmentType); 
     HttpContext.Current.Response.ContentType = "text/csv"; 
     HttpContext.Current.Response.AddHeader("Pragma", "public"); 

     writeHeadersInfo(headers); 

     HttpContext.Current.Response.End(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 

    return false; 
} 

但我得到这个expcetion:无法因为代码优化或本机框上调用堆栈的顶部,以评估表达。

有没有人知道如何处理这个问题?

任何帮助将不胜感激! 在此先感谢!

〜埃德尔醌

+0

异常来自哪条线? – Ender 2010-12-03 22:03:36

回答

1

我做了什么莱昂建议作为答案,但相反,我用通用处理程序。

1.-从客户端检索数据,建立JSON &将数据发送到服务器(主页):

function dtExportToCSV(dataTable) { 
     var elements = dtDataToJSON(dataTable); 
     var headers = dtHeadersToJSON(tableSelector); 

     jQuery.ajax({ 
      type: "POST", 
      url: "ashx/Export.ashx", 
      data: "{'elements': " + elements + ", 'headers': " + headers + "}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 

      success: function(msg) { 
       window.open("Export.aspx", "Export CSV", "width=120,height=300"); 
      }, 

      error: function(xhr, ajaxOptions, thrownError) { 
       alert(xhr); 
      } 
     }); 

     return false; 
    } 

2.-初始化数据经由间交换会话变量(如StringBuilder的) aspx页面(主页):

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Session["ExportCSV"] == null) 
     { 
      Session["ExportCSV"] = new StringBuilder(); 
     } 

     if (!IsPostBack) 
     { 

     } 

    } 

3.-构建CSV(通用处理器):

public class Export : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     object json = null; 
     byte[] input = null; 

     JavaScriptSerializer javascriptSerializer = null; 
     StringBuilder sb = null; 

     List<object> elementList = null; 
     List<string> headerList = null; 

     try 
     { 
      input = readToEnd(context.Request.InputStream); 
      sb = new StringBuilder(); 
      javascriptSerializer = new JavaScriptSerializer(); 

      foreach (byte chr in input) 
      { 
       sb.Append((char)chr); 
      } 

      json = javascriptSerializer.DeserializeObject(sb.ToString()); 

      elementList = new List<object>(); 
      headerList = new List<string>(); 

      var dictionary = json.toType(new Dictionary<string, object>()); 
      foreach (KeyValuePair<string, object> keyValuePair in dictionary) 
      { 
       switch (keyValuePair.Key) 
       { 
        case "elements": 
        case "ELEMENTS": 
         { 
          object[] elements = (object[])keyValuePair.Value; 
          foreach (object element in elements) 
          { 
           elementList.Add(element); 
          } 
          break; 
         } 

        case "headers": 
        case "HEADERS": 
         { 
          object[] headers = (object[])keyValuePair.Value; 
          foreach (object header in headers) 
          { 
           headerList.Add((string)header); 
          } 

          break; 
         } 
       } 
      } 

      ((StringBuilder) context.Session["ExportCSV"]).Append(writeBodyInfo(elementList, headerList)); 
      ((StringBuilder) context.Session["ExportCSV"]).Append(writeHeadersInfo(headerList)); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      throw; 
     } 
    } 
} 

4.-显示了保存文件对话框(Export.aspx):

public partial class Export : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      exportToCSV(); 
     } 
    } 

    private void exportToCSV() 
    { 
     Context.Response.Clear(); 
     Context.Response.ClearContent(); 
     Context.Response.ClearHeaders(); 

     Context.Response.AddHeader("Content-Disposition", "attachment;filename=ShortageReport.csv"); 
     Context.Response.ContentType = "text/csv"; 

     char[] separator = Environment.NewLine.ToCharArray(); 
     string csv = ((StringBuilder)Session["ExportCSV"]).ToString(); 

     foreach (string line in csv.Split(separator)) 
     { 
      Context.Response.Write(line); 
     } 

     Context.Response.Flush(); 
     Context.Response.End(); 
    } 
} 

任何改善,建议?

〜EderQuiñones

1
/// <summary> 
    /// 
    /// </summary> 
    /// <param name="elements"></param> 
    /// <param name="headers"></param> 
    [WebMethod(EnableSession=true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public static bool exportToCSV(List<object> elements, List<string> headers) 
    { 
     try 
     { 
      string attachmentType = "attachment; filename=Shortage Report.csv"; 

      HttpContext.Current.Response.Clear(); 
      HttpContext.Current.Response.ClearContent(); 
      HttpContext.Current.Response.ClearHeaders(); 

      HttpContext.Current.Response.AddHeader("Content-Disposition", attachmentType); 
      HttpContext.Current.Response.ContentType = "text/csv"; 

      writeHeadersInfo(headers); 
      writeBodyInfo(headers, elements); 

      HttpContext.Current.ApplicationInstance.CompleteRequest(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

     return true; 
    } 

但它不显示的保存文件对话框...

1

不完全是AJAX,但我已经通过建立一个独立的ASPX页面之前完成这个功能,这生成CSV文件(就像您在exportToCSV()中已经做的那样)。

在客户端页面上,使用JS我会加载这个ASPX页面在一个动态注入的iframe中,样式为style="display:none"

您还可以在页面上包含iframe,并根据需要使用JS来加载您的“导出”页面。

编辑: 你可以做一个PageMethod调用发送表到服务器,生成CSV并将其存储在Session []中。然后在返回页面时,加载上面提到的“导出”页面以检索存储在会话中的CSV。