2011-09-01 32 views
0

嗨,是否有機會從gridview更改導出數據的標題名稱。下面是我的代碼,它的工作正常。我唯一的問題是我無法改變的頭名將Gridview數據導出到Excel - 更改標題名稱

我的代碼

Dim strFilename As String = Now.Date.Month.ToString + Now.Date.Day.ToString + Now.Hour.ToString + Now.Minute.ToString + Now.Second.ToString 

Response.AddHeader("content-disposition", "attachment;filename=" & strFilename & ".xls") 
Response.Clear() 
Response.Charset = "" 
Response.ContentType = "application/vnd.ms-excel" 

Dim stringWrite As System.IO.StringWriter = New System.IO.StringWriter() 
Dim htmlWrite As System.Web.UI.HtmlTextWriter = New System.Web.UI.HtmlTextWriter(stringWrite) 
Dim dg As System.Web.UI.WebControls.DataGrid = New System.Web.UI.WebControls.DataGrid() 

dg.DataSource = dt 
dg.DataBind() 
dg.RenderControl(htmlWrite) 
Response.Write(stringWrite.ToString()) 
Response.End() 

結果是

ID Fname 
1 aaa 
2 bbb 
2 ccc 

我想這樣

Employee ID First Name 
1   aaa 
2   bbb 
3   ccc 

回答

0

你沒有定義GridView上的任何列,以便自動生成它們,從而生成以下HTML(使用Excel標題):

<div> 
    <table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;"> 
     <tr> 
      <th scope="col">Employee ID</th><th scope="col">First Name</th> 
     </tr> 
     <tr> 
      <td>1</td> 
      <td>aaa</td> 
     </tr> 
     <tr> 
      <td>2</td> 
      <td>bbb</td> 
     </tr> 
     <tr> 
      <td>3</td> 
      <td>ccc</td> 
     </tr> 
    </table> 
</div> 

如果你添加一些列到GridView你可以達到你想要的輸出(不要忘了包括gv.AutoGenerateColumns = FALSE):

Response.AddHeader("content-disposition", "attachment;filename=tets.xls"); 
    Response.Clear(); 
    Response.Charset = ""; 
    Response.ContentType = "application/vnd.ms-excel"; 

    System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
    System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite); 
    System.Web.UI.WebControls.GridView gv = new System.Web.UI.WebControls.GridView(); 

    BoundField column; 

    column = new BoundField(); 
    column.DataField = "ID"; 
    column.HeaderText = "Employee ID"; 
    gv.Columns.Add(column); 

    column = new BoundField(); 
    column.DataField = "FName"; 
    column.HeaderText = "First Name"; 
    gv.Columns.Add(column); 

    gv.AutoGenerateColumns = false; 
    gv.DataSource = Data.BuildData(); 
    gv.DataBind(); 
    gv.RenderControl(htmlWrite); 
    Response.Write(stringWrite.ToString()); 
    Response.End(); 
+1

即時通訊使用gridview和我有一個列名 – spy

+0

好....我已經更新了我的答案是一個GridView。我正在處理您的代碼示例,如果它不反映您的問題,請更新它,以便我可以更好地爲您提供幫助。 –

+0

先生其不工作 - 即時通訊使用模板字段.. – spy

0

下面是我用一類導出一個從here中剔除的GridView。它可以處理模板列和圖像控件(改爲顯示替代文字)。

您可能想要查看PrepareControlForExport()如何處理某些控件。您還可能需要將更多控制器添加到PrepareControlForExport()中,因爲它並不完整。

public class ExportGridView 
{ 
    public static void Export(String fileName, GridView gridView) 
    { 
     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName)); 
     HttpContext.Current.Response.ContentType = "application/ms-excel"; 

     // Create a table to contain the grid 
     Table table = new Table(); 

     // include the gridline settings 
     table.GridLines = gridView.GridLines; 

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

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

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

     using (StringWriter stringWriter = new StringWriter()) 
     { 
      using (HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter)) 
      { 
       // render the table into the htmlwriter 
       table.RenderControl(htmlWriter); 

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

    private static void PrepareControlForExport(Control control) 
    { 
     for (int i = 0; i < control.Controls.Count; i++) 
     { 
      Control c = control.Controls[i]; 

      if (c is LinkButton) 
      { 
       control.Controls.Remove(c); 
       control.Controls.AddAt(i, new LiteralControl((c as LinkButton).Text)); 
      } 
      else if (c is ImageButton) 
      { 
       control.Controls.Remove(c); 
       control.Controls.AddAt(i, new LiteralControl((c as ImageButton).AlternateText)); 
      } 
      else if (c is HyperLink) 
      { 
       control.Controls.Remove(c); 
       control.Controls.AddAt(i, new LiteralControl((c as HyperLink).Text)); 
      } 
      else if (c is Image) 
      { 
       control.Controls.Remove(c); 
       control.Controls.AddAt(i, new LiteralControl((c as Image).AlternateText)); 
      } 
      else if (c is DropDownList) 
      { 
       control.Controls.Remove(c); 
       control.Controls.AddAt(i, new LiteralControl((c as DropDownList).SelectedItem.Text)); 
      } 
      else if (c is CheckBox) 
      { 
       control.Controls.Remove(c); 
       if ((c as CheckBox).Checked) 
       { 
        control.Controls.AddAt(i, new LiteralControl("True")); 
       } 
       else 
       { 
        control.Controls.AddAt(i, new LiteralControl("False")); 
       } 
      } 
      else if (c is HiddenField) 
      { 
       control.Controls.Remove(c); 
      } 

      if (c.HasControls()) 
      { 
       PrepareControlForExport(c); 
      } 
     } 
    } 
} 
0

這是我原來的DataGrid的答案只是爲了完整性的緣故...

你有沒有在你的DataGrid中定義的任何列,所以它已經自動生成它們,導致下面的HTML(與Excel中頭):

<table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;"> 
    <tr> 
     <td>ID</td><td>FName</td> 
    </tr> 
    <tr> 
     <td>1</td><td>aaa</td> 
    </tr> 
    <tr> 
     <td>2</td><td>bbb</td> 
    </tr> 
    <tr> 
     <td>3</td><td>ccc</td> 
    </tr> 
</table> 

如果你添加一些列到DataGrid,你可以達到你想要的輸出(不要忘了包括dg.AutoGenerateColumns = FALSE):

Response.AddHeader("content-disposition", "attachment;filename=tets.xls"); 
Response.Clear(); 
Response.Charset = ""; 
Response.ContentType = "application/vnd.ms-excel"; 

System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite); 
System.Web.UI.WebControls.DataGrid dg = new System.Web.UI.WebControls.DataGrid(); 

BoundColumn column; 

column = new BoundColumn(); 
column.DataField = "ID"; 
column.HeaderText = "Employee ID"; 
dg.Columns.Add(column); 

column = new BoundColumn(); 
column.DataField = "FName"; 
column.HeaderText = "First Name"; 
dg.Columns.Add(column); 

dg.AutoGenerateColumns = false; 
dg.DataSource = Data.BuildData(); 
dg.DataBind(); 
dg.RenderControl(htmlWrite); 
Response.Write(stringWrite.ToString()); 
Response.End();