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 :

Problème d'exportation de données vers excel


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Points : 87
    Points
    87
    Par défaut Problème d'exportation de données vers excel
    Bonjour, voila j'ai récupéré un code qui me permet d'exporter des données à partir d'un datagrid vers excel qui est celui-ci

    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
     
            Dim i
            Dim iCnt As Integer
            Dim tamponxls As String
            tamponxls = vbNullString
            iCnt = Me.BindingContext(ObjetDataSet, table).Count
            For i = 0 To iCnt
                If i = iCnt Then Exit For
                tamponxls = tamponxls & (Me.DataGridMission.Item(i, 1)) & vbTab
                tamponxls = tamponxls & (Me.DataGridMission.Item(i, 2)) & vbTab
                tamponxls = tamponxls & (Me.DataGridMission.Item(i, 3)) & vbTab
                tamponxls = tamponxls & (Me.DataGridMission.Item(i, 4)) & vbTab
                tamponxls = tamponxls & (Me.DataGridMission.Item(i, 5)) & vbTab
                tamponxls = tamponxls & (Me.DataGridMission.Item(i, 6)) & vbTab
                tamponxls = tamponxls & (Me.DataGridMission.Item(i, 7)) & vbTab
                tamponxls = tamponxls & (Me.DataGridMission.Item(i, 8)) & vbTab & vbCr
            Next i
     
            RichTextBox1.Text = tamponxls
     
            Dim saveFileDialog1 As New SaveFileDialog
            saveFileDialog1.Filter = "Excel|*.xls|Texte|*.txt|Richtext|*.rtf"
            saveFileDialog1.Title = "Sauver le fichier exporter sous ?"
            saveFileDialog1.ShowDialog()
     
            If saveFileDialog1.ShowDialog() = DialogResult.OK Then
                RichTextBox1.SaveFile(saveFileDialog1.FileName, _
                RichTextBoxStreamType.PlainText)
            End If
    Cependant avec ce code j'ai un problème avec les signes & < L'opérateur '&' n'est pas défini pour 'Nothing' et type 'DataGridViewTextBoxCell'. >, j'ai voulu les remplacer par des + mais même problème < L'opérateur '+' n'est pas défini pour type 'DataGridViewTextBoxCell' et chaîne " ". >


    du cou j'ai fait des recherches et j'ai voulu utiliser le code qui est disponible dans la faq vb.net pour exporter des données vers excel, mais j'obtiens cette erreur : "Exception de HRESULT : 0x800A03EC" et cela se passe au moment de la lecture des lignes et des colonnes de mon datagrid.

    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
     
      Dim xlApp As Excel.Application
            Dim xlBook As Excel.Workbook
            Dim xlSheet As Excel.Worksheet
     
            xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
            xlBook = CType(xlApp.Workbooks.Add, Excel.Workbook)
            xlSheet = CType(xlBook.Worksheets(1), Excel.Worksheet)
     
            ' ici on compte le nombre de lignes et de colonnes du datatable
            Dim nbrLigne As Integer = ObjetDataSet.Tables(table).Rows.Count - 1
            Dim nbrColon As Integer = ObjetDataSet.Tables(table).Columns.Count - 1
            Dim x, y As Integer
     
            For x = 0 To nbrColon
                ' ici on prends le titre des colonnes du datatable
                xlSheet.Cells(1, x + 1) = ObjetDataSet.Tables(table).Columns(x).ColumnName
                ' on mets la première ligne en gras
                xlSheet.Rows(1).Font.Bold = True
     
                ' pour chaque colonne et chaque ligne on transfert les données      
                For y = 0 To nbrLigne
                    xlSheet.Cells(y + 2, x + 1) = DataGridMission.Item(y, x)    ====> çà se passe ici le problème
                Next
            Next
     
            ' ici on affiche les résultat dans excel
            xlSheet.Application.Visible = True
            ' on peut sauvegarder notre document sur le disque
            xlSheet.SaveAs("C:\nom_document.xls")
            ' on quitte l'application et on détruit les objets
            xlApp.Quit()
            xlSheet = Nothing
            xlBook = Nothing
            xlApp = Nothing
    si quelqu'un avait une solution pour une des deux methodes, de préférence celle de la faq qui m'évite de passer par un richtextbox, çà m'aiderait vraiment beaucoup car j'ai pas trouvé de cas similaire sur le net

    d'avance merci

    @++
    dubidon
    "Un jour j'y arriverais tout seul, si si je vous le jure "

  2. #2
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    essaye celui là, il est plus rapide :

    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
     
     Dim xlApp As Excel.Application
            Try
                xlApp = GetObject(, "excel.application")
            Catch
                xlApp = New Excel.Application
            Finally
                xlApp.Visible = False
            End Try
     
            'ajout d'une page et sélection 
            Dim xsSoldesComptes5 As Excel.Worksheet = xlApp.Workbooks.Add.ActiveSheet
            'requete serveur 
            Try
                With xsSoldesComptes5.QueryTables.Add(Connection:= _
                "ODBC;DRIVER=SQL Server;SERVER=TONSERVEUR;Integrated Security=SSPI;" & _
                "APP=Microsoft® Query;DATABASE=TABASE;Trusted_Connection=Yes" _
                , Destination:=xsSoldesComptes5.Range("A1"))
     
                    .CommandText = "LA REQUETE QUI REMPLI LE DATAGRID"
                    .Name = "SoldesComptes5"
                    .FieldNames = True
                    .RowNumbers = True
                    .FillAdjacentFormulas = False
                    .PreserveFormatting = True
                    .RefreshOnFileOpen = False
                    .BackgroundQuery = True
                    .RefreshStyle = Excel.XlCellInsertionMode.xlOverwriteCells
                    .SavePassword = False
                    .SaveData = False
                    .AdjustColumnWidth = True
                    .RefreshPeriod = 0
                    .PreserveColumnInfo = True
                    .Refresh(BackgroundQuery:=False)
                End With
                ' affichage 
                xlApp.Visible = True
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    j'suis vert !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Points : 87
    Points
    87
    Par défaut
    même problème, sauf que là çà me met directement : "Exception de HRESULT : 0x800A03EC"

    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
     
            Dim xlApp As Excel.Application
            Try
                xlApp = GetObject(, "excel.application")
            Catch
                xlApp = New Excel.Application
            Finally
                xlApp.Visible = False
            End Try
     
            'ajout d'une page et sélection 
            Dim xsSoldesComptes5 As Excel.Worksheet = xlApp.Workbooks.Add.ActiveSheet
            'requete serveur 
            Try
                With xsSoldesComptes5.QueryTables.Add(Connection:= _
                "ODBC;DRIVER=SQL Server;SERVER=PORDAM\SQLEXPRESS;Integrated Security=SSPI;" & _
                "APP=Microsoft® Query;DATABASE=DBabcdom;Trusted_Connection=Yes;User ID=sa;Password=abcdom" _
                , Destination:=xsSoldesComptes5.Range("A1"))
     
                    .CommandText = "SELECT LibJour Date ,NbHeures Nombredheure FROM Jour " & _
                     "WHERE NumOrdre = (SELECT NumOrdre FROM ORDRE_MISSION " & _
                     "WHERE NumInt = " & indexint & " " & _
                     "And NumBeneficiaire = " & indexbene & ")"
                    .Name = "SoldesComptes5"
                    .FieldNames = True
                    .RowNumbers = True
                    .FillAdjacentFormulas = False
                    .PreserveFormatting = True
                    .RefreshOnFileOpen = False
                    .BackgroundQuery = True
                    .RefreshStyle = Excel.XlCellInsertionMode.xlOverwriteCells
                    .SavePassword = False
                    .SaveData = False
                    .AdjustColumnWidth = True
                    .RefreshPeriod = 0
                    .PreserveColumnInfo = True
                    .Refresh(BackgroundQuery:=False)
                End With
                ' affichage 
                xlApp.Visible = True
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    @++
    dubidon
    "Un jour j'y arriverais tout seul, si si je vous le jure "

  4. #4
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    sur quelle ligne ?
    j'suis vert !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Points : 87
    Points
    87
    Par défaut
    sur la derniere ligne avant le end with

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     .Refresh(BackgroundQuery:=False)
    et si je la met en commentaire, il ouvre un classeur mais il ne contient rien

    @++
    dubidon
    "Un jour j'y arriverais tout seul, si si je vous le jure "

  6. #6
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    bah met ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .Refresh(BackgroundQuery:=True)
    j'suis vert !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Points : 87
    Points
    87
    Par défaut
    Merci, çà m'affiche quelque chose, mais pas tout à fait ce que j'ai dans mon datagrid.

    En effet dans mon datagrid j'ai deux colonnes, une date et une autre contenant un chiffre mais dans excel j'obtient trois colonne, la premiere contient des dates de ce style "00/01/1900 00:00" mais n'a pas de titre, la deuxième contient le titre date et contient des chiffres "39240" et la derniere contient bien ma deuxième colonne de mon datagrid

    Les chiffres style "39240" doivent bien correspondre aux dates puisque les dates identiques dans mon datagrid correspondent à des chiffre sidentiques dans ma feuille excel.

    Mais comment supprimer la première colonne et comment transformer ces chiffres en date ??

    encore merci pour l'aide que tu m'apportes


    @++
    dubidon
    "Un jour j'y arriverais tout seul, si si je vous le jure "

  8. #8
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    c'est parce que tu as une mise en forme sur le datatable de ton datagrid. Change les types de données de ton datatable, les dates en string je crois et tu aura le bon format dans excel.

    Enfin il me semble.
    j'suis vert !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Points : 87
    Points
    87
    Par défaut
    Il doit y avoir un truc qui m'échappe, mais avec le code que tu m'as filé je fais pas appel du tout au datatable de mon datagrid, ni au datagrid d'ailleurs. Du cou je vois pas pourquoi une mise en forme sur mon datatable de mon datagrid crèeraient un problème pour l'exportation, et en plus je n'ai aps fais de mise en forme, je récupère les données directement.


    Voici le code de chargement de mon datagrid
    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
     
        Private Sub BtnRechercherMission_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnRechercherMission.Click
     
     
            indexint = CMBNomREchInt.SelectedIndex + 1
            indexbene = CMBNomRechBene.SelectedIndex + 1
            strSql = "SELECT LibJour Date ,NbHeures Nombredheure FROM Jour " & _
                     "WHERE NumOrdre = (SELECT NumOrdre FROM ORDRE_MISSION " & _
                     "WHERE NumInt = " & indexint & " " & _
                     "And NumBeneficiaire = " & indexbene & ")"
     
     
            'on indique la table 
            table = "JOUR"
     
            'on vide le dataset
            ObjetDataSet.Clear()
     
     
            'on éxécute la fonction pour se connecter à la base et éxécuter la requête
            If BD.ExecReq(strSql, table, ObjetDataSet) Then
     
                'on efface le datatable
                ObjetDataTable.Clear()
     
     
                'On crèe une datatable à partir du dataset
                ObjetDataTable = ObjetDataSet.Tables(table)
                BSRechMission.DataSource = ObjetDataTable
     
     
                DataGridMission.DataSource = BSRechMission
     
            End If
        End Sub
    code de chargement de mon dataset
    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
     
        Public Function ExecReq(ByVal req As String, ByVal table As String, ByVal datas As DataSet) As Boolean
     
            Try
                'Instanciation d'un Objet Connexion
                objetconnection = New SqlConnection
                'Donner à la propriété ConnectionString les paramètres de connexion
                objetconnection.ConnectionString = strConn
                'Ouvrir la connexion
                objetconnection.Open()
                'Instancier un objet Command
                ObjetCommand = New SqlCommand(req)
                'Instancier un objet Adapter
                ObjetDataAdapter = New SqlDataAdapter(ObjetCommand)
                'initialiser l'objet Command
                ObjetCommand.Connection() = objetconnection
                'initialiser l'objet OleDBComandBuilder (sinon pas d'update)
                ObjetCB = New SqlCommandBuilder(ObjetDataAdapter)
                'Avec l'aide de la propriété Fill du DataAdapter charger le DataSet
                ObjetDataAdapter.Fill(datas, table)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Return False
            Finally
                If Not (objetconnection Is Nothing) Then objetconnection.Close()
            End Try
            Return True ' ou ExecReq = true , return sort en plus d'affecter la variable
        End Function
    @++
    dubidon
    "Un jour j'y arriverais tout seul, si si je vous le jure "

  10. #10
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    ouai effectivement j'ai dit n'importe quoi, j'étais sur l'autre code ...

    pour la premiere colonne essaye de changer cette ligne (il faut la mettre à false) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .RowNumbers = True
    pour la deuxieme colonne, si tu change le format de celulles dans excel en date, tu verra bien tes dates affichées, par contre pour les avoir direct je pense que tu peux faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     strSql = "SELECT CAST(LibJour as varchar(20)) as DateduJour  ,NbHeures Nombredheure FROM Jour " & _
                     "WHERE NumOrdre = (SELECT NumOrdre FROM ORDRE_MISSION " & _
                     "WHERE NumInt = " & indexint & " " & _
                     "And NumBeneficiaire = " & indexbene & ")"
    j'suis vert !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Points : 87
    Points
    87
    Par défaut
    Eh bien merci beaucoup hulk avec toute ta force tu as réussi à corriger mon problème, je te remercie beaucoup. Par contre si c'est pas trop te demander pourrais tu m'expliquer un peu ton code du moins ce qu'il y a entre le with et le end with

    en tout cas encore merci pour ton aide

    @++
    dubidon
    "Un jour j'y arriverais tout seul, si si je vous le jure "

  12. #12
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    tout t'expliquer je pourrais pas, c'est un code que j'avais trouver sur le net, ce que je sias c'est que ca va beaucoup plus vite que le code precedent car ce dernier li les cellules de datagrid une par une, alors quand tu as des centaines voir milliers de lignes ca peut etre tres long :

    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
     
    'là on crée le document excel, comme lautre code
    Dim xlApp As Excel.Application
            Try
                xlApp = GetObject(, "excel.application")
            Catch
                xlApp = New Excel.Application
            Finally
                xlApp.Visible = False
            End Try
     
            'ajout d'une page et sélection 
            Dim xsSoldesComptes5 As Excel.Worksheet = xlApp.Workbooks.Add.ActiveSheet
            'requete serveur 
            Try
                With xsSoldesComptes5.QueryTables.Add(Connection:= _
                "ODBC;DRIVER=SQL Server;SERVER=PORDAM\SQLEXPRESS;Integrated Security=SSPI;" & _
                "APP=Microsoft® Query;DATABASE=DBabcdom;Trusted_Connection=Yes;User ID=sa;Password=abcdom" _
                , Destination:=xsSoldesComptes5.Range("A1"))
     
                    .CommandText = "SELECT LibJour Date ,NbHeures Nombredheure FROM Jour " & _
                     "WHERE NumOrdre = (SELECT NumOrdre FROM ORDRE_MISSION " & _
                     "WHERE NumInt = " & indexint & " " & _
                     "And NumBeneficiaire = " & indexbene & ")"
                    .Name = "SoldesComptes5" 'la cest le nom de la feuille
                    .FieldNames = True 'si on met le titre des colonnes
                    .RowNumbers = True 'si on met les numeros de lignes
                    .FillAdjacentFormulas = False 'je sias pas
                    .PreserveFormatting = True 'je sais pas
                    .RefreshOnFileOpen = False 'je sais pas
                    .BackgroundQuery = True 'je sias pas
                    .RefreshStyle = Excel.XlCellInsertionMode.xlOverwriteCells
                    .SavePassword = False 'je sais pas
                    .SaveData = False 'je sias pas
                    .AdjustColumnWidth = True 'ajuste les colonnes au données
                    .RefreshPeriod = 0 'je sais pas
                    .PreserveColumnInfo = True 'je sias pas
                    .Refresh(BackgroundQuery:=False) 'je sais pas trop
                End With
                ' affichage 
                xlApp.Visible = True
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    j'suis vert !

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Points : 87
    Points
    87
    Par défaut
    Eh bien encore merci encore pour ton aide, çà m'a bien aidé et pour tes dernières explications aussi qui m'aide à déja mieux comprendre comment çà fonctionne.

    @++
    dubidon
    "Un jour j'y arriverais tout seul, si si je vous le jure "

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

Discussions similaires

  1. [XL-2007] Problème d'exportation de données d'Excel 2007 vers access
    Par soumilo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/04/2012, 15h09
  2. Problème exporter des données vers excel
    Par sky88 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 10/01/2011, 13h35
  3. [AC-2003] Problème d'export de données vers Excel
    Par moilou2 dans le forum VBA Access
    Réponses: 4
    Dernier message: 22/10/2009, 09h17
  4. exporter des données vers EXCEL!
    Par JauB dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 25/11/2005, 15h13
  5. Export de données vers Excel
    Par psykot63 dans le forum Access
    Réponses: 2
    Dernier message: 03/01/2005, 12h04

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