IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Exporter un gridview dans une feuille excel


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 70
    Par défaut Exporter un gridview dans une feuille excel
    Bonjour,

    Je cherche à exporter un grid view dans une document excel.
    J'ai suivi le tuto sur le site mais je me retrouve avec une erreur dont je ne comprend pas l'origine.
    Control 'gvwExistingRight' of type 'GridView' must be placed inside a form tag with runat=server.
    Il place l'erreur sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gvwExistingRight.RenderControl(oHtmlTextWriter);
    Or voici ma page aspx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <form id="form1" runat="server">
     
    <asp:GridView ID="gvwExistingRight" runat="server" AutoGenerateColumns="False" AllowPaging="False"
    DataKeyNames="VAL" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None"
    BorderWidth="0px" ShowFooter="True" CellPadding="4" ForeColor="Black" GridLines="Horizontal"
    OnRowEditing="gvwExistingRight_RowEditing" OnRowCancelingEdit="gvwExistingRight_RowCancelingEdit"
    OnRowDeleting="gvwExistingRight_Delete" OnRowUpdating="gvwExistingRight_RowUpdating"
    OnRowDataBound="gvwExistingRight_RowDataBound" Width="100%">
    <RowStyle Font-Names="Arial" Font-Size="XX-Small" />
    <Columns>
    	<asp:TemplateField HeaderText="Domain" SortExpression="Domain">
    		<ItemTemplate>
    			<asp:Label ID="lblDomain" runat="server" Text='<%#Eval("DOM") %>'></asp:Label>
    		</ItemTemplate>
    	</asp:TemplateField>
     
    	[...] // Je vous fais grace des 13 colonnes
     
    	<asp:TemplateField HeaderText="Edit" ShowHeader="False">
    		<EditItemTemplate>
    			<asp:LinkButton ID="lbn1" runat="server" CausesValidation="True" CommandName="Update"
    				Text="Update"></asp:LinkButton>
    			<asp:LinkButton ID="lbn2" runat="server" CausesValidation="False" CommandName="Cancel"
    				Text="Cancel"></asp:LinkButton>
    		</EditItemTemplate>
    		<ItemTemplate>
    			<asp:LinkButton ID="lbn1" runat="server" CausesValidation="False" CommandName="Edit"
    				Text="Edit"></asp:LinkButton>
    		</ItemTemplate>
    	</asp:TemplateField>
    	<asp:CommandField HeaderText="Delete" ShowDeleteButton="True" ShowHeader="True" />
    </Columns>
    <PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="left" />
    <SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
    <EditRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#CCCCCC" Font-Bold="True" HorizontalAlign="left" Font-Names="Arial"
    	Font-Size="X-Small" ForeColor="White" />
    <RowStyle Font-Names="Arial" Font-Size="XX-Small" HorizontalAlign="left" />
    <AlternatingRowStyle BackColor="#F2F2F2" />
    </asp:GridView>
    <br />
    <asp:ImageButton ID="ibnGridViewToExcel" runat="server" Height="24px" 
    ImageUrl="~/images/BUTTON/icone-excel.jpg" OnCommand="ibnGridViewToExcel_Click" 
    Text="Export to Excel" Width="24px" />
    </form>
    Mon gridview est alimenté par une fonction dans le codebehind.
    Voici le code pour l'export:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     protected void ibnGridViewToExcel_Click(object sender, System.EventArgs e)
            {
                //export to excel
     
                //On appelle de verifColonne avec le nom du DataGrid concerné en paramètre
                ClearControls(gvwExistingRight);
                //On efface les éventuelles données déjà dans la mémoire tampon
                Response.Clear();
                //On place tout ce qui est destiné au client dans la mémoire tampon
                Response.Buffer= true;
                //On définit le type d'informations renvoyée, ici des données au format Excel
                Response.ContentType = "application/vnd.ms-excel";
                //On efface le jeux de caractères actuellement défini
                Response.Charset = "";
                //On instancie deux objets qui vont nous permettre de récupérer les données du DataGrid : 
    		        //le StringWriter et l'HtmlTextWriter
                EnableViewState = false;
                StringWriter oStringWriter = new StringWriter();
                HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter);
                // On extrait le contenu du DataGrid dans l'HtmlTextWriter
                gvwExistingRight.RenderControl(oHtmlTextWriter);
                //On copie le contenu extrait dans la mémoire tampon
                Response.Write(oStringWriter.ToString());
                //On ferme "le flux" de données et envoie les données au client
                Response.End();
            }
     
     
            private void ClearControls(Control control)
            {
                //On récupère le nombre de controles enfants composant le DataGrid
                for (int i=control.Controls.Count -1; i>=0; i--)
                {
                    ClearControls(control.Controls[i]);
                }
                //Si la cellule ne contient pas du texte simple 
                if (!(control is TableCell))
                {
                    //Si le controle concerné à une prorpiété "Selected Item" alors...
                        //Remarque : Seul les controles offrant des choix multiples ont une propriété "SelectedItem"
                    if (control.GetType().GetProperty("SelectedItem") != null)
                    {
                        LiteralControl literal = new LiteralControl();
                        control.Parent.Controls.Add(literal);
                        try
                        {
                            //La cellule prend alors pour valeur le texte correspondant à la propriété "SelectedItem"
                            literal.Text = (string)control.GetType().GetProperty("SelectedItem").GetValue(control, null);
                        }
                        catch
                        {
                            //On récupère l'exception en cas de problème
     
                        }
                        //Le controle concerné est retiré
                        control.Parent.Controls.Remove(control);
                    }
                else 
                    //Si le controle concerné n'a pas de propriété "SelectedItem" alors on récupère le 
                    //texte (s'il y en a un) de sa propriété "Text"
     
                    if (control.GetType().GetProperty("Text") != null)
                    {
                        LiteralControl literal = new LiteralControl();
                        control.Parent.Controls.Add(literal);
                        //On attribue le texte de la propriété "Text" à la cellule concernée
                        literal.Text = (string)control.GetType().GetProperty("Text").GetValue(control,null);
                        control.Parent.Controls.Remove(control);
                    }
                }
                return;
            }
    J'ai remis les commentaires du tuto pour aller plus vite à la lecture !!
    Voilà, si vous avez une idée ... à votre bon coeur messieurs dames !!

    Merci à vous !!

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 70
    Par défaut
    Ok,
    Vous pouvez laisser tomber j'ai trouvé !!
    Pour info, il faut rajouter ceci dans le codebehind
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            public override void VerifyRenderingInServerForm(Control control)
            {
            }
    Et hop plus d'erreur !!

    Merci à vous !!

  3. #3
    Membre éclairé Avatar de SonnyFab
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 498
    Par défaut
    Salut moi j'ai fais un grid view plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     <form id="from1" method="post" runat="server">
      <asp:Button ID="btn" runat="server" Text="Exporter vers Excel" Visible="true" OnClick="ibnGridViewToExcel_Click"></asp:Button>
     
      <br/><br/>
     
      <asp:GridView ID="GVClients" runat="server" AutoGenerateColumns="true"  DataSourceID="SqlClients">
     
    </asp:GridView>
     
       <asp:SqlDataSource id="SqlClients"
              runat="server"
              ConnectionString="user id=sa;password=toto;
               database=MSIDB;server=blabla;"
    		    SelectCommand="SELECT mob FROM IT_ALLCOMMUNAUTERS where client='ART'"/>
          </asp:SqlDataSource>
     
      </form>
    Et j'utilise le code c# ci dessus, mais à ma grande surprise le format de la feuille excel n'est pas en text!!

    Comme j'ai des mobiles qui commence par 0, tous les premeirs chiffres alors sont homis!!!

    Pouvez vous m'aidez s'il vous plait

    Merci

  4. #4
    Membre éclairé Avatar de SonnyFab
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 498
    Par défaut
    J'ai vérifier le type des valeurs dans ma base.
    Comme j'ai sql les valeurs sont en varchar.

    Donc le problème du format vient du code mais je comprends pas pourquoi
    les cellules ne sont pas en format texte.

    Pourtant ce code à l'air bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    private void ClearControls(Control control)
            {
                //On récupère le nombre de controles enfants composant le DataGrid
                for (int i=control.Controls.Count -1; i>=0; i--)
                {
                    ClearControls(control.Controls[i]);
                }
                //Si la cellule ne contient pas du texte simple 
                if (!(control is TableCell))
                {
                    //Si le controle concerné à une prorpiété "Selected Item" alors...
                        //Remarque : Seul les controles offrant des choix multiples ont une propriété "SelectedItem"
                    if (control.GetType().GetProperty("SelectedItem") != null)
                    {
                        LiteralControl literal = new LiteralControl();
                        control.Parent.Controls.Add(literal);
                        try
                        {
                            //La cellule prend alors pour valeur le texte correspondant à la propriété "SelectedItem"
                            literal.Text = (string)control.GetType().GetProperty("SelectedItem").GetValue(control, null);
                        }
                        catch
                        {
                            //On récupère l'exception en cas de problème
     
                        }
                        //Le controle concerné est retiré
                        control.Parent.Controls.Remove(control);
                    }
                else 
                    //Si le controle concerné n'a pas de propriété "SelectedItem" alors on récupère le 
                    //texte (s'il y en a un) de sa propriété "Text"
     
                    if (control.GetType().GetProperty("Text") != null)
                    {
                        LiteralControl literal = new LiteralControl();
                        control.Parent.Controls.Add(literal);
                        //On attribue le texte de la propriété "Text" à la cellule concernée
                        literal.Text = (string)control.GetType().GetProperty("Text").GetValue(control,null);
                        control.Parent.Controls.Remove(control);
                    }
                }
                return;
            }
    Je suis préneur de toute idée qui peut m'aider

    Merci

  5. #5
    Membre éclairé Avatar de SonnyFab
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 498
    Par défaut Problème de format de cellules
    Resalut,
    une fois Nicolas Esprit m'avait demandé d'utiliser le css pour changer le format, c'est vrai j'avais pas encore ce nouveau code.

    Mais sinon pour vous expert, pour changer le format de mes cellules dois-je forcement toucher au css (Dans mon cas) ou avec ce code rajouter juste quelques instructions?

    Honnement sa m'étonne que personne n'a déja eu ce problème de fromat.

    Merci pour votre attention

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 70
    Par défaut
    Avec ce code, on ne fait que parcourir chaque contrôle contenu dans le gridview et si le contrôle n'est pas un simple label, récupérer la valeur du control pour la saisir dans un nouveau label (par sa propriété .Text) créé pour l'occasion.
    A aucun moment on ne touche au format de la valeur remonté dans le gridview.

    Je pencherai plutôt pour Excel qui va attribuer de lui même un format à la valeur renvoyé par le code.
    Si celui ci voit que la valeur ne contient que des chiffres, il va de lui même appliqué le format numérique sur la cellule ou celle ci sera stockée avec pour résultat la suppression des zéros en début de chaîne.

    Vérifie le format de la cellule dans laquelle sont enregistré tes valeurs, si c'est un format numérique, c'est que c'est bien Excel qui merdoie.

    L'astuce serai de mettre une petit apostrophe devant tes valeurs avant de les passer dans Excel, comme ceci: (je n'ai pas testé ce code, mais ca pourrais marcher)
    pour le cas ou se serai un contrôle à choix multiple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    literal.Text = "'" + (string)control.GetType().GetProperty("SelectedItem").GetValue(control, null);
    et pour le cas ou se ne serai pas un contrôle à choix multiple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    literal.Text = "'" + (string)control.GetType().GetProperty("Text").GetValue(control,null);
    Essai toujours et fais moi un retour, je suis curieux ...

  7. #7
    Membre éclairé Avatar de SonnyFab
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 498
    Par défaut
    Je ne te suis pas quand tu parles de:
    pour le cas ou se serai un contrôle à choix multiple
    Moi j'ai affiché un gridview assez simple, genre connexion -> requete -> affichage de la colonne.

    Mais quoicqu'il en soit j'ai éssayé les 2 codes que t'as posté, que dale! les zéros sont toujours homis.

    Aussi je pense que t'as raison c'est excel qui merdoie parceque mes données sont en varchar sous sql et c'est vrai il n'y a que des mobiles dans cette colonne.

    Merci de ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Exporter les valeurs à OptionButton dans une feuille Excel
    Par pimpom81 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/05/2012, 20h01
  2. [AC-2007] Exporter plusieurs tables dans UNE feuille Excel
    Par Bristow47 dans le forum VBA Access
    Réponses: 8
    Dernier message: 06/07/2010, 08h00
  3. [AC-2003] Comment exporter un module dans une feuille Excel?
    Par SunRay dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/10/2009, 16h23
  4. [MySQL] librairie - exporter base de donnees dans une feuille excel ?
    Par juju03 dans le forum PHP & Base de données
    Réponses: 28
    Dernier message: 30/07/2008, 14h45
  5. Exporter une variable dans une feuille excel
    Par adrien.gendre dans le forum VBA Access
    Réponses: 1
    Dernier message: 23/07/2007, 20h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo