2010-03-04 5 views
4

J'ai un GridView que je veux exporter vers Excel. Lorsque j'utilise l'exemple de code que je trouve en ligne, il exporte le contenu vers Excel très bien, mais pour une raison quelconque, il efface également toutes les lignes de la grille en dehors de ma table exportée.Exporter GridView vers Excel sans perdre les lignes de la grille dans Excel

Pour votre utilisateur moyen, c'est assez facile à corriger, mais j'ai besoin que cette solution fonctionne pour tout le monde.

Alors, y a-t-il un moyen d'exporter les données dans un GridView dans un classeur Excel de sorte qu'il semble qu'il ait été simplement tapé dans Excel? J'ai collé le code que j'utilise ci-dessous, supposons qu'un GridView appelé toPrint existe et possède des données précises.

Response.Clear(); 
Response.AddHeader("content-disposition", "attachment; filename=" + name + "_Registration_Forms.xls"); 
Response.Charset = ""; 
Response.ContentType = "application/vnd.ms-excel"; 
Page.EnableViewState = false; 

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

toPrint.RenderControl(htmlWrite); 

Response.Write(stringWrite.ToString()); 
Response.End(); 

EDIT: trouvé une solution partielle. Si j'exporte en tant que liste délimitée par des virgules et que l'en-tête est un fichier CSV, il s'ouvre correctement et toutes les lignes de la grille (même celles en dehors des données exportées) s'affichent. Le seul problème avec ceci est bien sûr d'avoir à supprimer chaque virgule et caractère de nouvelle ligne de mes valeurs avant de les exporter.

+1

La méthode ci-dessus affiche une table au format HTML qui Excel fait 'brillamment' pour analyser et afficher dans presque la réplique exacte. Je ne suis pas sûr s'il y a une solution pour cela mais si le formatage n'est pas si important, la sortie CSV pourrait être une bonne alternative. –

+0

à ceux qui pourraient être intéressés, le commentaire de o.k.w est la façon dont je suis allé. Ce n'est pas parfait parce que je dois maintenant enlever les virgules du contenu que j'exporte, mais les utilisateurs finaux préfèrent cette approche. –

+0

vous pouvez essayer d'utiliser le caractère de tabulation au lieu de la virgule pour séparer les valeurs – mslliviu

Répondre

3

J'ai utilisé la fonction d'assistance ci-dessous dans le passé. Je viens de donner à l'utilisateur une case à cocher qu'il pourrait sélectionner pour inclure des lignes de grille ou non. Évidemment, vous pouvez changer cela pour toujours inclure les lignes de la grille.

namespace Helpers 
{ 
    public class GridViewExportUtil 
    { 
     public static void Export(string fileName, GridView gv, bool includeGridLines) 
     { 
      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(); 

      if (includeGridLines) 
      { 
       table.GridLines = gv.GridLines; 
      } 

       // 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); 
       } 
      } 
     } 
    } 
} 

Ceci est un exemple de la façon dont vous l'appelez:

GridViewExportUtil.Export("QueryResults.xls", GridView1, includeGridLines); 
+0

J'ai mis ce code à placer mais cela ne fonctionne pas. Maintenant rien n'exporte, la page se recharge juste comme l'événement de clic de bouton n'a pas de code dedans. –

+0

En outre, ce code gère afficher ou ne pas afficher les lignes de quadrillage dans la grille de valeurs en sortie pour exceller. Il ne fait rien pour le reste des cellules dans le classeur. –

+0

David Glass ... bel extrait. C'est un gardien! – s15199d

3

J'ai eu le même problème ne se lignes de la grille quand j'exportées vers Excel.

La façon dont je l'ai résolu était de mettre Gridlines="Both" à l'intérieur de la balise <datagrid>.

+0

cela laisse encore le reste des lignes de la grille dans Excel (en dehors des données) – rDroid

5

Le message suivant m'a donné la réponse. http://forums.asp.net/t/1074110.aspx Je vais résumer ce qu'il faut faire avec le code.

System.IO.StringWriter dvWriter = new System.IO.StringWriter(); 
System.Web.UI.HtmlTextWriter OutputGenerator = new System.Web.UI.HtmlTextWriter(dvWriter); 

      //To put in the excel gridlines 
      dvWriter.Write(@"<html xmlns:x=""urn:schemas-microsoft-com:office:excel"">"); 
      dvWriter.Write(@"<head> 
           <xml> 
           <x:ExcelWorkbook> 
            <x:ExcelWorksheets> 
             <x:ExcelWorksheet> 
              <x:WorksheetOptions> 
              <x:Panes></x:Panes> 
              <x:Print><x:Gridlines /></x:Print> 
              </x:WorksheetOptions> 
             </x:ExcelWorksheet> 
             </x:ExcelWorksheets> 
            </x:ExcelWorkbook> 
            </xml> 
           </head>"); 
//*******Put your Table Body here ******* 
0

VB

Public Overrides Sub VerifyRenderingInServerForm(control As Control) 
    'base.VerifyRenderingInServerForm(control); 
'This remains empty 
End Sub 

Protected Sub btnExcel_Click(sender As Object, e As ImageClickEventArgs) Handles btnExcel.Click 

    Response.Clear() 
    Response.AddHeader("content-disposition", "attachment;filename=FileName.xls") 
    Response.Charset = "" 
    Response.Cache.SetCacheability(HttpCacheability.NoCache) 
    Response.ContentType = "application/vnd.ms-excel" 

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

    htmlWrite.Write("<html xmlns:o=""urn:schemas-microsoft-com:office:office"" ") 
    htmlWrite.Write("xmlns:x=""urn:schemas-microsoft-com:office:excel"" ") 
    htmlWrite.Write("xmlns=""http://www.w3.org/TR/REC-html40""> ") 
    htmlWrite.Write("<head> ") 
    htmlWrite.Write("<!--[if gte mso 9]><xml> ") 
    htmlWrite.Write("<x:ExcelWorkbook> ") 
    htmlWrite.Write("<x:ExcelWorksheets> ") 
    htmlWrite.Write("<x:ExcelWorksheet> ") 
    htmlWrite.Write("<x:Name>Sheet1</x:Name> ") 
    htmlWrite.Write("<x:WorksheetOptions> ") 
    htmlWrite.Write("<x:Selected/> ") 
    htmlWrite.Write("<x:ProtectContents>False</x:ProtectContents> ") 
    htmlWrite.Write("<x:ProtectObjects>False</x:ProtectObjects> ") 
    htmlWrite.Write("<x:ProtectScenarios>False</x:ProtectScenarios> ") 
    htmlWrite.Write("</x:WorksheetOptions> ") 
    htmlWrite.Write("</x:ExcelWorksheet> ") 
    htmlWrite.Write("</x:ExcelWorksheets> ") 
    htmlWrite.Write("</x:ExcelWorkbook> ") 
    htmlWrite.Write("</xml><![endif]--> ") 
    htmlWrite.Write("</head>") 
    htmlWrite.WriteLine("") 

    gridView.HeaderStyle.Reset() 
    gridView.FooterStyle.Reset() 
    gridView.AlternatingRowStyle.Reset() 
    gridView.RowStyle.Reset() 

    gridView.BackColor = Color.Transparent 
    gridView.GridLines = GridLines.None 
    gridView.RenderControl(htmlWrite) 

    Response.Write(stringWrite.ToString()) 
    Response.[End]() 
End Sub 

C#

public override void VerifyRenderingInServerForm(Control control) 
{ 
    //base.VerifyRenderingInServerForm(control); 
    //This remains empty 
} 


protected void btnExcel_Click(object sender, ImageClickEventArgs e) 
{ 
    Response.Clear(); 
    Response.AddHeader("content-disposition", "attachment;filename=FileName.xls"); 
    Response.Charset = ""; 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.ContentType = "application/vnd.ms-excel"; 
    System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 

    htmlWrite.Write("<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" "); 
    htmlWrite.Write("xmlns:x=\"urn:schemas-microsoft-com:office:excel\" "); 
    htmlWrite.Write("xmlns=\"http://www.w3.org/TR/REC-html40\"> "); 
    htmlWrite.Write("<head> "); 
    htmlWrite.Write("<!--[if gte mso 9]><xml> "); 
    htmlWrite.Write("<x:ExcelWorkbook> "); 
    htmlWrite.Write("<x:ExcelWorksheets> "); 
    htmlWrite.Write("<x:ExcelWorksheet> "); 
    htmlWrite.Write("<x:Name>Sheet1</x:Name> "); 
    htmlWrite.Write("<x:WorksheetOptions> "); 
    htmlWrite.Write("<x:Selected/> "); 
    htmlWrite.Write("<x:ProtectContents>False</x:ProtectContents> "); 
    htmlWrite.Write("<x:ProtectObjects>False</x:ProtectObjects> "); 
    htmlWrite.Write("<x:ProtectScenarios>False</x:ProtectScenarios> "); 
    htmlWrite.Write("</x:WorksheetOptions> "); 
    htmlWrite.Write("</x:ExcelWorksheet> "); 
    htmlWrite.Write("</x:ExcelWorksheets> "); 
    htmlWrite.Write("</x:ExcelWorkbook> "); 
    htmlWrite.Write("</xml><![endif]--> "); 
    htmlWrite.Write("</head>"); 
    htmlWrite.WriteLine(""); 

    gridView.HeaderStyle.Reset(); 
    gridView.FooterStyle.Reset(); 
    gridView.AlternatingRowStyle.Reset(); 
    gridView.RowStyle.Reset(); 

    gridView.BackColor = Color.Transparent; 
    gridView.GridLines = GridLines.None; 
    gridView.RenderControl(htmlWrite); 

    Response.Write(stringWrite.ToString()); 
    Response.End(); 

} 
Questions connexes