Question

Quel est le meilleur moyen d’exporter une grille dans une feuille de calcul Excel? Cela semble facile

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

Était-ce utile?

La solution

Dans une exportation vers Excel Écrivez ce code dans 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();

Autres conseils

Il existe 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.

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 ne sont que 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.

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 parfaitement dans Excel.

Le plus gros obstacle de cette approche est le format XML Excel. Je crée habituellement 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 les informations dans Gridview, il me suffit de créer le code XML pour la section contenant les cellules que je prévois de peupler. Je ajoute simplement le texte et l'ajout au texte déjà présent dans le fichier de modèle.

Une fois que vous avez ouvert le fichier Excel formaté au format XML, vous déterminez assez facilement le code XML nécessaire. La partie la plus difficile à comprendre est la manière dont les cellules font référence aux options de formatage, qui se trouvent en haut du fichier XML.

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

Modifier: Vous n'aurez besoin de créer qu'une seule fois le fichier modèle Excel, pour avoir une idée du code xml que vous devez générer. Une fois que vous avez généré le fichier 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);
}

Cette bibliothèque 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 pas l'installation d'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 écrire un adaptateur générique est assez simple et serait réutilisable dans d'autres projets.

Cette méthode passe directement au format Excel sans que XML soit installé 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

J'ai utilisé CarlosAg.ExcelXmlWriter link .

J'ai parcouru tous les GridViews HeaderCells , puis toutes les lignes. La seule chose à faire est que, si vous autorisez la pagination et que vous avez plusieurs pages, vous devez définir une valeur élevée pour PageSize (je l'ai définie sur 10000000), puis DataBind le GridView encore et fais ton travail. Définissez ensuite l'ancienne valeur PageSize. Si quelqu'un connaît une meilleure solution, vous êtes le bienvenu.

EDIT: La commande try / catch est présente car, pour une raison quelconque, il n’est pas possible de vérifier le type de contrôle, puis de la convertir en libellé 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;
    }
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 avoir installé Excel et référencer les bibliothèques Office Interop de votre projet. Ajouter:

Importe Microsoft.Office.Core, Importe Microsoft.Office.Interop

La solution ci-dessus utilise gridview et en extrait le code HTML. Ensuite, il écrit pour exceller. Le code HTML provenant de la grille inclura des attributs de style tels que padding & amp; Couleur. Cela fera également en sorte que les en-têtes de colonnes triables ressemblent à des liens. Lorsque j’ai utilisé cela, j’ai écrit un analyseur personnalisé pour effacer tout le style indésirable afin de ne me donner que les données brutes. Je vous laisse cette tâche, car elle est spécifique à chaque grille.

Il est très important d'inclure le remplacement à VerifyRenderingInServerForm, même s'il ne contient aucun code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top