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

VB.NET Discussion :

Remplir DataGridView avec classeur EXCEL 2007 (> 256 colonnes)


Sujet :

VB.NET

  1. #1
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Par défaut Remplir DataGridView avec classeur EXCEL 2007 (> 256 colonnes)
    Bonjour,

    Je désire remplir un DataGridView avec un classeur Excel 2007 possédant > 256 colonnes. Le problème est que seul 256 colonnes sont chargées.
    Existe-il un moyen?

    Voici un extrait du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ds.Clear()
    da.SelectCommand() = New OleDbCommand("SELECT * FROM [" & CurrTable & "$" & "]")
    da.SelectCommand().Connection = DBConnectionImport
    da.FillSchema(ds, SchemaType.Source, CurrTable & "$")
    da.Fill(ds, CurrTable & "$")
     
    'dtTemp = ds.Tables(CurrTable & "$")
     
    Form_UI_Main.DataGridView_MàJ_SelectProjet.DataSource = ds 'dt  ' 
    Form_UI_Main.DataGridView_MàJ_SelectProjet.DataMember = CurrTable & "$"
    Je vous en remercie d'avance ;-)

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    Il me semble que le datagridview n'est pas limité en colonnes mais en largeur, regarde du ctoé de l'attribut FillWeight des colonnes.
    Ceci dit, je plains l'utilisateur du tableau

  3. #3
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Par défaut
    Merci pour ton message!!!

    J'ai testé avec DataGridView..::.AutoResizeColumns mais quelle que soit la largeur mon datatgridview est limité à 255

  4. #4
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Par défaut
    Non, ce n'est pas le datagridview qui limite le nb. Je soupçonne plutôt le DataAdapter... Si qqun à la solution...

  5. #5
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    En fait il s'agit du provider OleDb qui limite la sélection à 255 colonnes (essayez de faire un "SELECT * FROM [Feuil1$]" dans un OleDbDataReader, vous verrez qu'il n'y a que 255 colonnes en résultat).

    Pour pouvoir sélectionner plus de 255 colonnes dans une feuille Excel, il faut le faire en plusieurs fois par tranches de 255 en spécifiant la plage de données dans la requête.

    Exemple avec 383 colonnes :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -- Colonnes 0 à 255 :
    SELECT * FROM [Feuil1$A1:IU10]
    -- Colonnes 256 à 383 :
    SELECT * FROM [Feuil1$IV1:NS10]
    Si vous utilisez un DataSet, il vous est possible d'alimenter plusieurs DataTable (ici, deux) puis de faire un Merge des DataTable.

  6. #6
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Par défaut
    SUPER JE T'EN REMERCIE !!!


  7. #7
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Par défaut
    Maintenant un autre petit souci:

    il merge bien les 2 tables mais dans mon datagridview j'ai un décalage au niveau des lignes :
    123456789101112131415
    xxxxxxxxx
    yyyyyyyyy
    ..............xxxxxxxxxxxxx
    ...............yyyyyyyyyyyyy
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            da.SelectCommand() = New OleDbCommand("SELECT * FROM [" & CurrTable & "$A1:IU10" & "]")
            da.SelectCommand().Connection = DBConnectionImport
            da.Fill(dt1)
     
     
            da.SelectCommand() = New OleDbCommand("SELECT * FROM [" & CurrTable & "$IV1:NS10" & "]")
            da.SelectCommand().Connection = DBConnectionImport
            da.Fill(dt2)
     
            dt1.Merge(dt2)
            ds.Tables.Add(dt1)
     
            Form_UI_Main.DataGridView_MàJ_SelectProjet.DataSource = ds
            Form_UI_Main.DataGridView_MàJ_SelectProjet.DataMember = ds.Tables(0).ToString

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    A mon avis l'information qu'il manque c'est la clef primaire.
    Pour faire correspondre une ligne de dt1 avec une ligne de dt2, il faut une référence commune.
    Je pense que dans tes select, tu devrais donc mettre seulement 254 colonne + une colonne de clef primaire. Ensuite tu devrais definir un .primarykey pour dt1 et dt2, et à ce moment là peut être que le merge se fera correctement.

  9. #9
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Par défaut
    ça me parait une bonne idee...

    N'étant que débutant en SQL peux-tu m'indiquer comment utiliser "SELECT" pour 2 colonnes distinctes?

  10. #10
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par yot_teddy Voir le message
    il merge bien les 2 tables mais dans mon datagridview j'ai un décalage au niveau des lignes
    Oui, en y réfléchissant, ce n'est pas étonnant car il merge en fonction du nom de colonne, en ajoutant les données à la suite.
    Alors que dans ton cas, il faut ajouter les données dans des colonnes supplémentaires.
    Citation Envoyé par Flamby38 Voir le message
    A mon avis l'information qu'il manque c'est la clef primaire.
    Pour faire correspondre une ligne de dt1 avec une ligne de dt2, il faut une référence commune.
    Je pense que dans tes select, tu devrais donc mettre seulement 254 colonne + une colonne de clef primaire. Ensuite tu devrais definir un .primarykey pour dt1 et dt2, et à ce moment là peut être que le merge se fera correctement.
    Les possibilités de SQL avec Excel sont très limitées. Avec notre solution actuelle, on ne peut sélectionner qu'une plage de données adjacentes et je n'ai aucune idée comment sélectionner deux colonnes séparées dans ce cas.

    A mon avis, il vaut mieux se faire un script perso d'ajout des données :
    1. Ajouter les colonnes du deuxième DataTable (DT2) dans le DataTable final (DTF) : DTF.Columns.AddRange()
    2. Ajouter les données dans le DTF avec des boucles qui vont bien

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    Ok, j'avoue ne pas connaitre le fonctionnement d'excel du point de vue SQL.
    Si on admet que le select dans excel va renvoyer les lignes dans l'ordre, on peut créer notre propre clef primaire avec la propriété autoincrement.

    le code devrait ressembler a quelquechose comme ca (à titre purement indicatif) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dt1.addcolumn("ID")
    dt1.column("ID").autoincrement  = true
    dt1.prymarykey = dt1.column("ID)
    Ainsi quand on remplit la datatable 1, on aura une colonne numérotée.
    Si on fait la meme chose sur la datable 2, on aura la meme colonne numérotée.
    Et quand on fera le merge, je pense que ca devrait faire ce qu'il faut.

    Sinon, eh bien la solution de skalp marche certainement bien, mais c'est un peu plus pénible à implémenter je pense.

  12. #12
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Par défaut
    Merci pour ton aide!

    voilà ce que j'obtiens:

    Code VB.NET : 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
            da.SelectCommand() = New OleDbCommand("SELECT * FROM [" & CurrTable & "$A1:IU39" & "]")
            da.SelectCommand().Connection = DBConnectionImport
            da.Fill(dt1)
     
            da.SelectCommand() = New OleDbCommand("SELECT * FROM [" & CurrTable & "$IV1:NS39" & "]")
            da.SelectCommand().Connection = DBConnectionImport
            da.Fill(dt2)
     
            dtf.Merge(dt1)
     
            Dim i As Integer
            Dim colonne(dt2.Columns.Count) As DataColumn
     
            For i = 0 To dt2.Columns.Count - 1
                colonne(i) = New DataColumn(i.ToString)
                colonne(i) = dt2.Columns(i)
            Next i
     
            dtf.Columns.AddRange(colonne)
     
            ds.Tables.Add(dtf)


    Là je reçois l'erreur
    La colonne [..] appartient déjà à un autre DataTable.
    Je ne vois pas ou est le problème

  13. #13
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par yot_teddy Voir le message
    Là je reçois l'erreur "La colonne [..] appartient déjà à un autre DataTable."
    La solution que je te proposait était à implémenter à la place du Merge (donc plus besoin de Merge).
    Ton erreur vient du fait que l'instance de l'objet DataColumn est déjà associée à ton dt2 et elle ne peut pas appartenir à un autre DataTable. Je n'y avais pas pensé et effectivement, c'est embêtant...

    Essaye plutôt la solution de Flamby qui semble bcp plus élégante que la mienne et qui profite de la méthode Merge :
    Citation Envoyé par Flamby38 Voir le message
    Ainsi quand on remplit la datatable 1, on aura une colonne numérotée.
    Si on fait la meme chose sur la datable 2, on aura la meme colonne numérotée.
    Et quand on fera le merge, je pense que ca devrait faire ce qu'il faut.

  14. #14
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Par défaut
    Merci beaucoup à vous 2 !!!

    Voici le code fonctionnel:
    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
     
     'Table 1
            dt1.Columns.Add("ID")
            dt1.Columns("ID").AutoIncrement = True
     
            Dim PrimaryKeyColumns(0) As DataColumn
            PrimaryKeyColumns(0) = dt1.Columns("id")
            dt1.PrimaryKey = PrimaryKeyColumns
     
            da.SelectCommand() = New OleDbCommand("SELECT * FROM [" & CurrTable & "$A1:IU39" & "]")
            da.SelectCommand().Connection = DBConnectionImport
            da.Fill(dt1)
     
            'Table 2
            dt2.Columns.Add("ID")
            dt2.Columns("ID").AutoIncrement = True
     
            PrimaryKeyColumns(0) = dt2.Columns("id")
            dt2.PrimaryKey = PrimaryKeyColumns
     
            da.SelectCommand() = New OleDbCommand("SELECT * FROM [" & CurrTable & "$IV1:NS39" & "]")
            da.SelectCommand().Connection = DBConnectionImport
            da.Fill(dt2)
     
            'Fusion Table & Table 2
            dt1.Merge(dt2)

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

Discussions similaires

  1. [Tutoriels /Cours] Tutoriel : Lire des classeurs Excel 2007 avec SAS 9.1
    Par fafabzh6 dans le forum Contribuez
    Réponses: 0
    Dernier message: 18/03/2010, 09h17
  2. Lire des classeurs Excel 2007 avec SAS 9.1
    Par Fleur-Anne.Blain dans le forum Contribuez
    Réponses: 0
    Dernier message: 17/03/2010, 21h23
  3. ruban excel avec lien sur une feuille du classeur excel 2007
    Par corbisier dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/09/2007, 15h00

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