2011-09-01 36 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();