2009-09-10 6 views
1

Quelle est la meilleure façon d'exporter un gridview dans une feuille de calcul Excel? This seems easyexporter des données gridview

sauf que ma grille n'a pas d'attribut d'exportation. Quel est le moyen le plus rapide de le faire?

+0

Cela devrait probablement être sur le super-utilisateur –

+1

Je ne suis pas d'accord, s'il veut le faire par programme. Ce que je pense est le cas. –

+0

oui brian. Je veux cela par programme. – Eric

Répondre

1

Dans une exportation vers Excel Écrivez ce code sur l'événement btnexporttoExcel Click.

string attachment = "attachment; filename=Export.xls"; 

    Response.ClearContent(); 

    Response.AddHeader("content-disposition", attachment); 

    Response.ContentType = "application/ms-excel"; 

    StringWriter sw = new StringWriter(); 

    HtmlTextWriter htw = new HtmlTextWriter(sw); 

    // Create a form to contain the grid 

    HtmlForm frm = new HtmlForm(); 

    gv.Parent.Controls.Add(frm); 

    frm.Attributes["runat"] = "server"; 

    frm.Controls.Add(gv); 

    frm.RenderControl(htw); 



    //GridView1.RenderControl(htw); 

    Response.Write(sw.ToString()); 

    Response.End(); 
0

This library pour .net a très bien fonctionné pour nos cas d'utilisation.

Cette bibliothèque vous permet de générer des classeurs Excel à l'aide de XML, elle est construite à 100% en C# et ne nécessite aucun fichier Excel pour générer les fichiers. Il expose un modèle objet simple pour générer les classeurs XML.

Il n'y a pas d'intégration intégrée avec un contrôle GridView, mais l'écriture d'un adaptateur générique est assez facile et serait réutilisable dans d'autres projets.

1

Il y a probablement quelque chose pour cela, mais si vous voulez le faire vous-même, vous pouvez simplement écrire du code qui parcourt la collection GridView.Rows, puis la collection GridViewRow.Cells à l'intérieur de cela.

Il devrait être assez facile de créer un fichier CSV à partir de là, et Excel pourrait le lire sans problème. Les fichiers CSV sont simplement des fichiers texte avec des valeurs entre guillemets, séparés par des virgules. Comme ceci:

"value", "value", "value" 
"value", "value", "value" 

Vous pouvez simplement ouvrir le Bloc-notes et en créer un à la main pour l'essayer.

-1
Private exportToExcel As Boolean = False 

Private Sub LoadInExcel() 
    Me.Response.ClearContent() 
    Me.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xls") 
    Me.Response.ContentType = "application/ms-excel" 
    Dim sw1 As New IO.StringWriter 
    Dim htw1 As HtmlTextWriter = New HtmlTextWriter(sw1) 
    GridView1.RenderControl(htw1) 
    Response.Write(sw1.ToString()) 
    Response.End() 
End Sub 

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control) 
    ' Confirms that an HtmlForm control is rendered for the specified ASP.NET 
    ' server control at run time. 
End Sub 

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
    If exportToExcel Then 
     LoadInExcel() 
    End If 

    MyBase.Render(writer) 
End Sub 

Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click 
    exportToExcel = True 
End Sub 

Vous devez installer Excel et référencer les bibliothèques Office Interop dans votre projet. Ajouter:

Importations Microsoft.Office.Core, Imports Microsoft.Office.Interop

La solution prend au-dessus du gridview et tire le code html hors de lui. Puis l'écrit pour exceller. Le html provenant de la grille inclura des attributs de style tels que le remplissage & couleur. Cela rendra également les en-têtes de colonnes triables ressemblant à des liens. Quand j'ai utilisé ceci, j'ai écrit un analyseur personnalisé pour enlever tous les styles indésirables pour ne me donner que les données brutes. Je vais vous laisser cette tâche car elle est spécifique à chaque grille.

Il est très important d'inclure le remplacement à VerifyRenderingInServerForm, même s'il n'y a pas de code à l'intérieur.

+0

j'aime où vous allez avec ceci. Cependant, je ne suis pas autorisé à importer microsoft.office.core – Eric

+0

où puis-je obtenir les fichiers Microsoft Office? – Eric

+0

@Eric - Vous pouvez les obtenir en installant Office sur la même machine. Cependant, il convient de noter que l'exécution de Office sur un serveur n'est généralement pas considérée comme une meilleure pratique. – rjzii

1

Je l'ai fait plusieurs fois. Excel a une version XML. Il se termine par l'extension .xml, mais vous pouvez simplement changer l'extension du fichier en .xls et le fichier au format XML s'ouvrira très bien dans Excel.

Le plus gros obstacle de cette approche est le format XML Excel. Je crée généralement un fichier Excel dans Excel dans le format approximatif que je désire. Je sauvegarde ensuite le fichier Excel au format XML et l'ouvre dans un éditeur de texte.

Je crée généralement un fichier de modèle à partir de cette page exemple Excel. Ensuite, lorsque j'exporte l'information dans Gridview, je dois seulement créer le xml pour la section qui contient les cellules que j'ai l'intention de remplir, je viens juste de rajouter, et ajouter le texte déjà dans le fichier modèle.Une fois que vous ouvrez le fichier Excel au format xml, vous calculerez le code XML nécessaire relativement facilement. La partie la plus difficile à comprendre est la façon dont les cellules référencent les options de formatage, qui sont en haut du fichier XML.

Bonne chance, faites-moi savoir si vous avez besoin de plus de précisions.

Edit: Vous aurez seulement besoin de créer le modèle Excel fichier une fois, juste pour avoir une idée de l'xml nécessaire que vous aurez besoin de générer. Une fois que vous avez généré le xml utilisez le code suivant pour l'envoyer à l'utilisateur:

string fileName = "ExportedFile.xls"; 
Response.Clear(); 
Response.Buffer = true; 
Response.ContentType = "text/xml"; 
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName); 
ExportToExcel(HttpContext.Current.Response.OutputStream, testUID); 
Response.End(); 



public static void ExportToExcel(Stream outputStream) 
{ 
    XmlTextWriter xmlSink = new XmlTextWriter(outputStream, Encoding.Default); 

    //ExcelHeaderString and ExcelStylesString are from the template 
    xmlSink.WriteRaw(ExcelHeaderString); 
    xmlSink.WriteRaw(ExcelStylesString); 

    //write your elements here 
    xmlSink.WriteElement("YourElements"); 

    //ExcelFooterString is from the template 
    xmlSink.WriteRaw(ExcelFooterString); 
} 
+0

mon problème avec ceci est que je devrais le faire à chaque machine non? Je devrais créer un fichier Excel sur chaque machine. Ceci est l'application sera utilisée à l'échelle de l'entreprise. – Eric

+0

Je pensais que vous programmeriez ceci dans le code qui contient le GridView. Je suis un peu confus par votre déclaration. Créez-vous une application Web ou une application de bureau? – Chris

+0

oui. c'est correct. Je vais essayer de programmer cela. Ceci est une application Web. Je peux être celui qui est confus. mais vous avez dit que vous devez normalement créer un fichier Excel dans Excel. Je devrais faire cela sur chaque ordinateur que cette application est utilisée correctement? – Eric

0

J'utilisé CarlosAg.ExcelXmlWriterlink.

Je bouclé à travers tous GridViewsHeaderCells, puis à travers toutes les lignes. La seule chose est que si vous autorisez la pagination et que vous avez plus d'une page, vous devez définir le PageSize à une valeur élevée (je définis à 10000000) puis DataBind le GridView à nouveau et faites votre travail. Ensuite, définissez l'ancienne valeur PageSize. Si quelqu'un connaît une meilleure solution, vous êtes le bienvenu.

EDIT: L'essai/catch est là parce que, pour une raison quelconque, il n'est pas possible de vérifier le type de contrôle, puis de le lancer vers Label ou LinkButton ==> control.GetType().

Voici mon code.

public static Workbook CreateWorkbook(GridView gridView) 
    { 
     int pageSize = gridView.PageSize; 
     gridView.PageSize = 10000000; 
     gridView.DataBind(); 

     Workbook workbook = new Workbook(); 
     Worksheet sheet = workbook.Worksheets.Add("Export"); 

     WorksheetStyle style = workbook.Styles.Add("headerStyle"); 
     style.Font.Bold = true; 
     style = workbook.Styles.Add("defaultStyle"); 
     style.Alignment.WrapText = true; 
     style = workbook.Styles.Add("infoStyle"); 
     style.Font.Color = "Red"; 
     style.Font.Bold = true; 

     sheet.Table.Rows.Add(new WorksheetRow()); 

     WorksheetRow headerRow = new WorksheetRow(); 
     foreach (DataControlFieldHeaderCell cell in gridView.HeaderRow.Cells) 
     { 
      if (!string.IsNullOrEmpty(cell.Text)) 
       headerRow.Cells.Add(cell.Text, DataType.String, "headerStyle"); 
      else 
       foreach (Control control in cell.Controls) 
       { 
        LinkButton linkButton = new LinkButton(); 
        try 
        { 
         linkButton = (LinkButton)control; 
        } 
        catch { } 

        if (!string.IsNullOrEmpty(linkButton.Text)) 
         headerRow.Cells.Add(linkButton.Text, DataType.String, "headerStyle"); 
        else 
        { 
         Label label = new Label(); 
         try 
         { 
          label = (Label)control; 
         } 
         catch { } 
         if (!string.IsNullOrEmpty(label.Text)) 
          headerRow.Cells.Add(label.Text, DataType.String, "headerStyle"); 
        } 
       } 
     } 

     sheet.Table.Rows.Add(headerRow); 

     foreach (GridViewRow row in gridView.Rows) 
     { 
      WorksheetRow wrow = new WorksheetRow(); 
      foreach (TableCell cell in row.Cells) 
      { 
       foreach (Control control in cell.Controls) 
       { 
        if (control.GetType() == typeof(Label)) 
        { 
         wrow.Cells.Add(((Label)control).Text, DataType.String, "defaultStyle"); 
        } 
       } 
      } 
      sheet.Table.Rows.Add(wrow); 
     } 

     gridView.PageSize = pageSize; 

     return workbook; 
    } 
0

Cette méthode passe directement au format Excel sans nécessiter l'installation de XML sur le serveur ou en utilisant XML.

 Protected Sub ExportToExcel() 

     Dim gv1 As GridView = FindControlRecursive(objPlaceHolder, "GridView1") 
     If Not gv1 Is Nothing Then 
      Response.ClearHeaders() 
      Response.ClearContent() 

      ' Set the content type to Excel 
      Response.ContentType = "application/vnd.ms-excel" 

      ' make it open the save as dialog 
      Response.AddHeader("content-disposition", "attachment; filename=ExcelExport.xls") 

      'Turn off the view state 
      Me.EnableViewState = False 

      'Remove the charset from the Content-Type header 
      Response.Charset = String.Empty 

      Dim myTextWriter As New System.IO.StringWriter 
      Dim myHtmlTextWriter As New System.Web.UI.HtmlTextWriter(myTextWriter) 
      Dim frm As HtmlForm = New HtmlForm() 
      Controls.Add(frm) 
      frm.Controls.Add(gv1) 

      'Get the HTML for the control 
      frm.RenderControl(myHtmlTextWriter) 

      'Write the HTML to the browser 
      Response.Write(myTextWriter.ToString()) 
      'End the response 
      Response.End() 
     End If 
    End Sub 

Private Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control 
    If root.ID = id Then 
     Return root 
    End If 
    Dim c As Control 
    For Each c In root.Controls 
     Dim t As Control = FindControlRecursive(c, id) 
     If Not t Is Nothing Then 
      Return t 
     End If 
    Next 
    Return Nothing 
End Function