2010-11-18 107 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。