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

Accès aux données Discussion :

Connexion Excel vb.net


Sujet :

Accès aux données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Employer
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Employer
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 29
    Points
    29
    Par défaut Connexion Excel vb.net
    Bonjour,
    je viens vers vous pour vous demander de l'aide, ou des pistes, car là, après plus d'un mois de recherche, je commence à désespérer.

    Mon but est d'arriver à lister les feuilles d'un fichier Excel sélectionné. Le problème vient des différente version de Windows, et des différente version d'Excel.

    les divers types de configuration sur lesquels le programme final sera amené à tourné:
    win7 ou 10 32bit et office 2007 ou 2010 ou 2013 32bit
    win7 ou 10 64bit et office 2007 ou 2010 ou 2013 32bit
    win7 ou 10 64bit et office 2010 ou 2013 64bit
    Voilà, en somme un peux tout à la fois, et c'est là le problème
    Mon poste est win10 32bit et office 2010 32bit.
    Je suis partie du principe de faire un programme 32bit afin de pouvoir le faire tournés sur les systèmes 64bit.

    Bref, j'ai essayer divers code de connexion aux divers format de fichier Excel, mais j'ai à chaque fois des erreur lors des test sur les diverses configuration.

    Voici le code de connexion que j'utilise:
    (TextBox1.Text contient le chemin et le nom du fichier sélectionné, et code se trouve dans la form1)
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    Imports System.IO
    Imports System.Data.OleDb
    Imports xls = Microsoft.Office.Interop.Excel
    Imports System.Text.RegularExpressions
     
    Private appXls As xls.Application
    Private booksXls As xls.Workbook
    Private sheetXls As xls.Worksheet
     
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Call SelectionFichierExcel()
            Call ListeLesFeuilles()
    End Sub
     
    Private Sub ListeLesFeuilles()
     
            Dim NomDeFeuille As String = ""
            Dim Extention As String = LCase(Split(TextBox1.Text, ".")(UBound(Split(TextBox1.Text, "."))))
     
            Dim i As Integer
            Dim DR As System.Data.OleDb.OleDbDataReader = Nothing
            Dim DT As DataTable = Nothing
            Dim CMD As System.Data.OleDb.OleDbCommand = Nothing
            Dim CNX As System.Data.OleDb.OleDbConnection = Nothing
     
            Dim TableDesFeuilleXLSM() As String
            ReDim TableDesFeuilleXLSM(0)
     
            Try
                Select Case Extention
                    Case "xls"
                        CNX = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text & ";Extended Properties =""Excel 8.0;HDR=No"";")
     
                    Case "xlsx"
                        CNX = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & TextBox1.Text & ";Extended Properties =""Excel 12.0;HDR=No"";")
     
                     Case "xlsm"
                        appXls = New xls.Application  
                        appXls.Workbooks.Open(TextBox1.Text,, True) 
                        booksXls = appXls.Workbooks(1)
     
                        For i = 1 To booksXls.Worksheets.Count
                            sheetXls = booksXls.Worksheets(i)
                            ReDim Preserve TableDesFeuilleXLSM(i)
                            TableDesFeuilleXLSM(i - 1) = sheetXls.Name
                        Next i
     
                End Select
     
     
                Select Case Extention
                    Case "xls"
                        CNX.Open()
     
                        DT = New System.Data.DataTable
                        DT = CNX.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, {Nothing, Nothing, Nothing, "TABLE"})
                        ListBox2.Items.Clear()
                        For i = 0 To DT.Rows.Count - 1
                            NomDeFeuille = DT.Rows.Item(i).ItemArray(2).ToString
                            If Mid(NomDeFeuille, Len(NomDeFeuille)) = "$" Then
                                NomDeFeuille = Replace(DT.Rows.Item(i).ItemArray(2).ToString, "$", "")
                                If Mid(NomDeFeuille, 1, 1) = "'" Then
                                    NomDeFeuille = Mid(NomDeFeuille, 2, Len(NomDeFeuille) - 1)
                                End If
                                ListBox2.Items.Add(NomDeFeuille)
                            End If
                        Next
     
                    Case "xlsx"
                        CNX.Open()
     
                        DT = New System.Data.DataTable
                        DT = CNX.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, {Nothing, Nothing, Nothing, "TABLE"})
                        ListBox2.Items.Clear()
                        For i = 0 To DT.Rows.Count - 1
                            NomDeFeuille = DT.Rows.Item(i).ItemArray(2).ToString
                            If Mid(NomDeFeuille, Len(NomDeFeuille)) = "$" Then
                                NomDeFeuille = Replace(DT.Rows.Item(i).ItemArray(2).ToString, "$", "")
                                If Mid(NomDeFeuille, 1, 1) = "'" Then
                                    NomDeFeuille = Mid(NomDeFeuille, 2, Len(NomDeFeuille) - 1)
                                End If
                                ListBox2.Items.Add(NomDeFeuille)
                            End If
                        Next
     
                    Case "xlsm"
                        ListBox2.Items.Clear()
                        For i = 0 To UBound(TableDesFeuilleXLSM) - 1
                            ListBox2.Items.Add(TableDesFeuilleXLSM(i))
                        Next i
                        appXls.Quit()
     
                End Select
     
     
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                Select Case Extention
                    Case "xls"
                        If Not CNX Is Nothing Then
                            CNX.Close()
                        End If
                        CNX = Nothing
     
                    Case "xlsx"
                        If Not CNX Is Nothing Then
                            CNX.Close()
                        End If
                        CNX = Nothing
     
                    Case "xlsm"
                        If appXls IsNot Nothing Then
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(sheetXls)
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(booksXls)
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(appXls)
                            appXls = Nothing
                        End If
     
                End Select
     
            End Try
     
        End Sub

    Généralement pour le fichier .xls j'y arrive. Mais lorsque je teste un fichier .xlsx ou .xlsm c'est plein d'erreur ou quand ca fonctionne sur mon poste c'est sur les autres config que ca plante.
    Dans l'état actuel du code par exemple, j'ai le message d'erreur "La table externe n'est pas dans le format attendu." lorsque j'ouvre un xlsx.
    Si j'utilise le même code que pour le xlsm sur le xlsx, ca fonctionne chez moi, mais pas sur un système win64bit office32.

    En bref j'adapte mon code de diverse manière et je test, et a chaque fois j'ai des erreurs.

    Auriez vous une solution, ou une nouvelle piste a explorer?

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai été confronté au même problème il y a quelques années dans un développement d'un soft utilisable sur différentes configurations. J'ai bien galéré puis j'ai fini par trouver la solution qui consiste à remplacer l'objet Microsoft.Office.Interop.Excel par la DLL Excellibrary.dll. Depuis ça fonctionne nickel sur toutes les configurations même sans pack office installé, et en plus j'ai gagné en performance.
    Naturellement il faut adapter le code en conséquence mais c'est plus simple à utiliser.

    Cordialement

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Employer
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Employer
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Merci pour le lien, je vais l'explorer.
    Même si je doit dire que moi et l'anglais ca fait 10 binaire.

    Et aussi, je vois oledbconnexion avec Microsoft.Jet.OLEDB.4.0 ou Microsoft.Ace.OLEDB.12.0, en fonction de l'extension, c'est une vois que j'ai déjà exploré.
    J'ai beaucoup utilisé ce site pour essayer divers connexion :
    https://www.connectionstrings.com/excel/

    Site très utile, mais j'arrive toujours pas a faire la connexion sur tout les systems


    Merci pour l'idée de la dll, je vais faire des recherches, et je revindrai vous dire ce que ca donne

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Citation Envoyé par Macstorm Voir le message
    Merci pour le lien, je vais l'explorer.
    Même si je doit dire que moi et l'anglais ca fait 10 binaire.
    y a peut etre des infos en francais aussi
    le principe c'est qu'à priori tu n'as pas besoin des dll d'office en référence (et donc de toute cette complexité) pour avoir la liste des feuilles

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Employer
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Employer
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Et si tu voyais le projet dans son ensemble, il y a encore bien plus de truc inutile, mais j'ai essayé tellement de truc diffèrent que pour tout nettoyer je vais devoir recrée un nouveau projet et utilisé que ce qui est vraiment utile... d'ici la je continu de chercher une solution qui me convienne...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Macstorm Voir le message
    Et aussi, je vois oledbconnexion avec Microsoft.Jet.OLEDB.4.0 ou Microsoft.Ace.OLEDB.12.0, en fonction de l'extension, c'est une vois que j'ai déjà exploré.
    J'ai beaucoup utilisé ce site pour essayer divers connexion :
    Salut,

    Normalement:
    ACE => Office 2007 (installé par défaut)
    Jet => Office 2003 et moins (installé par défaut)

    Pour la connexion:
    Extended Properties Excel 8.0 => Fichier Excel 8 à Excel 11 (97 ~ 2003) => Format BIFF8 => extension .xls
    Extended Properties Excel 12.0 => Fichier Excel 12 à Excel ? (2007 et +) => Format OpenXml => extension .xlsx, .xlsm
    Extended Properties Excel 12.0 => Fichier Excel 12 à Excel ? (2007 et +) => Format BIFF12=> extension .xlsb

    ACE est téléchargeable, donc il devrait pouvoir être installé sur des versions Office inférieur à 2007.
    ACE est retro-compatible avec Jet. Ce que peut faire Jet, ACE le fait.
    Jet ne gère pas les Formats OpenXml et BIFF12.
    Jet n'est pas compatible 64 bit.

    Voilà le peu que je puisse te dire. Il faut séparer le moteur (Jet, ACE) du format de fichier (OpenXml etc...).

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Employer
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Employer
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    J'ai trouvé une solution qui parait fonctionner...

    Je partais du principe que pour une meilleur compatibilité avec les systèmes différent, il me fallait crée un programme 32bit et alors j'ai cherché et appris plein de chose. Mais pour ce que je voulais faire je cherchais trop loin. Dans mon cas il me fallait un prog pour un poste 32 bits et un autre prog pour un poste 64 bits. D'où ma question: Pourquoi avoir mis AnyCPU dans Visual Studio dans ce cas? Bref...j'ai fait le test, et me voilà avec un seul prog au lieu de deux. Du coup, je peux n'utiliser que le moteur ACE... Seul chose que je n'ai pas test, c'est des systèmes sur lesquels je n'aurai pas installer le "AccessDatabaseEngine_X64.exe", mais dans tout les cas, je pourrais l'installer, alors c'est pas grave.

    Ma solution est:
    Dans la compilation du projet j'ai décoché la case "Préférer 32 bits" (image ci-dessous)... et apparemment ainsi, le programme se lance en 32 ou 64 bits et utilise la version 32 ou 64 bits de la dll en fonction du système...

    Nom : preferer32bits.jpg
Affichages : 640
Taille : 64,3 Ko
    Comme toujours pourquoi faire simple quand on peut faire compliqué...

    PS: je ne clos pas de suite ce poste, car si vous avez d'autre retour cela peut encore m'aider ou aider d'autre personne...

  9. #9
    Membre du Club
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Bonsoir je réponds à 08/01/2016, 11h24 Macstorm

    Je suis confronté à ce genre de problème avec un acces à MS Access en 64 bits qui fonctionnait avec le même sur un précédent PC et ne fonctionne plus.

    J'ignore si cela est vrai, mais il me faudrait passer de AnyCPU à X86 ( dans vbproj fichier ).

    Mais dans la version Visual Basic 2010 express, je ne retrouve plus ce choix 32bits. Disparu.

    Que faire alors? ( la modification en dur dans le fichier .vbproj ne m'a apporté que des ennuis - peut-être l'ai je mal faite )

    Bien à vous

    Pierre

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

Discussions similaires

  1. Test de connexion en VB.net
    Par marcusien dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/05/2012, 20h37
  2. Réponses: 8
    Dernier message: 20/07/2010, 12h25
  3. Créer connexion entre Vb.net et une base Access
    Par fixfix dans le forum Accès aux données
    Réponses: 9
    Dernier message: 05/12/2007, 10h07
  4. [VB.NET] font.colorindex pour excel avec .NET
    Par beegees dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/07/2006, 16h17
  5. [C#] [Excel] Pourquoi .NET > VB6 ???
    Par lololefada dans le forum C#
    Réponses: 16
    Dernier message: 21/05/2004, 11h31

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