2010-11-21 15 views
1

グリッドビューの行をエクスポートしてシートをExcelにエクスポートするタスクがありました。私はキャッシュしていましたが、このクラスはグリッドビューから現在のページのみをエクスポートします。グリッドビューの行。シートをExcelにエクスポートするグリッドビューの行

クラス:

using System; 
using System.Data; 
using System.Configuration; 
using System.IO; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 

/// <summary> 
/// 
/// </summary> 
public class GridViewExportUtil 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="fileName"></param> 
    /// <param name="gv"></param> 
    public static void Export(string fileName, GridView gv) 
    { 
     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.AddHeader(
      "content-disposition", string.Format("attachment; filename={0}", fileName)); 
     HttpContext.Current.Response.ContentType = "application/ms-excel"; 

    using (StringWriter sw = new StringWriter()) 
    { 
     using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
     { 
      // Create a form to contain the grid 
      Table table = new Table(); 

      // add the header row to the table 
      if (gv.HeaderRow != null) 
      { 
       GridViewExportUtil.PrepareControlForExport(gv.HeaderRow); 
       table.Rows.Add(gv.HeaderRow); 
      } 

      // add each of the data rows to the table 
      foreach (GridViewRow row in gv.Rows) 
      { 
       GridViewExportUtil.PrepareControlForExport(row); 
       table.Rows.Add(row); 
      } 

      // add the footer row to the table 
      if (gv.FooterRow != null) 
      { 
       GridViewExportUtil.PrepareControlForExport(gv.FooterRow); 
       table.Rows.Add(gv.FooterRow); 
      } 

      // render the table into the htmlwriter 
      table.RenderControl(htw); 

      // render the htmlwriter into the response 
      HttpContext.Current.Response.Write(sw.ToString()); 
      HttpContext.Current.Response.End(); 
     } 
    } 
} 

/// <summary> 
/// Replace any of the contained controls with literals 
/// </summary> 
/// <param name="control"></param> 
private static void PrepareControlForExport(Control control) 
{ 
    for (int i = 0; i < control.Controls.Count; i++) 
    { 
     Control current = control.Controls[i]; 
     if (current is LinkButton) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text)); 
     } 
     else if (current is ImageButton) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText)); 
     } 
     else if (current is HyperLink) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text)); 
     } 
     else if (current is DropDownList) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text)); 
     } 
     else if (current is CheckBox) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False")); 
     } 

     if (current.HasControls()) 
     { 
      GridViewExportUtil.PrepareControlForExport(current); 
     } 
    } 
} 
} 

CS:

protected void imgbtn_export_Click(object sender, ImageClickEventArgs e) 
    { 
     GridViewExportUtil.Export("Problems.xls", this.GridView1); 
    } 
+0

[1]:http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html Matt Bersethは、明確な方法で説明しました。 – MAC

+0

私があなたに送ったリンクのコードはすべて実行しましたが、コードにグリッド線をつけませんでしたか? – Myworld

答えて

1

あなたのGridViewのは、それがバインドされているデータソースになっていないデータに特別な何かを適用されますか?そうでなければ、グリッドビューがバインドされている同じデータセットから直接エクスポートすることをお勧めします。これにより、ページネーションを処理する必要がなくなります。

0

私は推測する必要があるので、ページの完全なソースを提供していませんが、あなたの質問の文言に基づいて、GridViewコントロール内でページングを有効にしていて、 .Rowsコレクションは現在のページになります。

0

エクスポートする直前にgridviewのページング機能をfalseにして、すべての行がオンデマンドで呼び出されるようにします。

関連する問題