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 :

ACE OLE DB et Excel


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut ACE OLE DB et Excel
    Bonjour à tous et à toutes.
    Voici mon soucis je cherche à remplacer un traitement fait via interop excel ( exportation de données) car trés long.
    J'utilise donc une connexion ACe.OLEDB.12.0 . Jusque la rien de particulier Je pointe mon fichier sélectionne la feuille et je rapatrie dans un dataSet pour faire ma tambouille.
    Mais voila que je remarque qu'il y a des manques d'informations, certaines cellules remplies dans excel ne sont pas importées avec la connexion ACE.OLEDB
    Donc je farfouille et je me rends compte que les feuilles en question contiennent des liste de choix.
    ET ce sont ces valeurs sélectionnées ( dans des listes de choix sous excel) qui ne sont pas importées. Du coup Grr c'etait trop beau car rapide en requete SQL.
    Y a t'il moyen tout de même dans un des paramètres de la connexionstring de passer ce problème ou un autre moyen ( Je veux éviter absolument interop.Excel car trop long fastidieux etc...)

    Cdt

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Bonjour,

    Via OleDb il y a malheureusement plusieurs problèmes dont les cellules fusionnées.
    Tu peux par contre utiliser EPPlus pour lire et générer des documents Excel, c'est rapide et facile.

  3. #3
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Je ne cherche pas a creer des fichiers Excel ( je récupère des fichiers excel existant pour exporter un certains nombre de données vers une SGBD) .ce qui m’embête ce sont ces fameuse cellules à choix multiples dont il ne lit pas les valeurs affiché. SQL ne reconnait certainement pas le format de donnée c'est un objet Excel. Mais si il n'y a pas de moyen de lire autrement que par interop.Excel correctement ces données je resterai avec ma vieille routine. Je cherchais a gagner du temps de traitement.

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    J'avais bien répondu en ce sens

    Citation Envoyé par Sankasssss Voir le message
    Tu peux par contre utiliser EPPlus pour lire et générer des documents Excel, c'est rapide et facile.
    EPPlus s'affranchi de l'interop, ça veut dire qu'il n'est pas obligé d'avoir une version d'Excel sur le poste client où va s’exécuter l'application. Franchement utile pour un serveur par exemple où même microsoft ne conseil pas l'automation.

    Mais la plus grande qualité d'EPPlus, c'est sa vitesse. Vu qu'il ne fait pas de pilotage d'application il est extrêmement rapide.
    Documentation PDF ici.

  5. #5
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    hello,
    Je te remercie
    Cela ne fonctionne pas avec des fichiers xls apparemment dans la doc excel package représente des fichiers au format xlsx uniquement ...
    Et du coup retour à la case départ.

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par Ashireon Voir le message
    Cela ne fonctionne pas avec des fichiers xls apparemment dans la doc excel package représente des fichiers au format xlsx uniquement ...

    Exact.


    Mais puisque le format OpenXML, sur lequel sont conçus EPPlus et ClosedXML date de plus de 10 ans, (Office 2007) il est temps de se questionner sur l'utilité de rester avec xls.

    Suffit de lire le fichier xls avec un Excel 2007 et suivant et de l'enregistrer sous le nouveau format.

  7. #7
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Effectivement, vieux format que le XLS, je serais du même avis que clementmarcotte mais je suppose que tu ne maîtrises pas la provenance des fichiers.

  8. #8
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Simpliste, mais peut-être cela peut-il te convenir.

    Tu ne veux pas travailler avec l'Interrop car tu trouves cela trop lourd ?
    Soit, mais tu pourrais l'utiliser juste pour lire la feuille Excel selon tes besoins et remplir un DataSet sur lequel tu pourrais ensuite travailler avec SQL et bien d'autres outils très commodes.
    Avec l'Imports Excel = Microsoft.Office.Interop.Excel, tu peux ensuite utiliser le code suivant pour lire tes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Dim XLSAPP As Excel.Application = Nothing
     
    ' ......................................................
     
            XLSAPP = New Excel.Application
            XLSAPP.Visible = True
            XLSAPP.Workbooks.Open("D:\... ... ... \MaFeuille.xls")  'ouvir le fichier XLS
     
            ' Il est possible de programmer en VB tout ce qu'on ferait en Macro
            XLSAPP.Range("C4").Select()                 'sélectionner une cellule
            MonDataSetPrefere.Tables.Add( .....   XLSAPP.ActiveCell. ............
    ' ......................................................
    Ce n'est bien sûr qu'une idée ...

  9. #9
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Bonjour ROb,
    C'est ce que je fais déjà , l’exécution sur une centaine de feuilles prends au moins une dizaine de minutes. Au bas mot.
    Je cherchais à accélérez la procédure car la centaine de fichiers est juste un échantillon représentatif de ce que j'aurai à faire traiter.
    cdt

  10. #10
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Vu que l'on ne trouve pas d'alternative à l'interrop, quand je l'utilise pour écrire dans Excel un gros bloc de données je le fais en exportant un array dans un range et ça va énormément plus vite que de le faire cellule par cellule.
    A voir s'il est possible de faire l'inverse, de prendre un range et de le mettre dans un array... C'est une piste à creuser, si ça fonctionne, ça m’intéresse d'être au courant

  11. #11
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Vu que ça m’intéressait fortement, j'ai fait un test et ça fonctionne.
    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
        Sub Main()
            Dim app = New Excel.Application
            Dim wb = app.Workbooks.Open("C:\test.xls")
            Dim ws As Excel.Worksheet = wb.Sheets(1)
            Dim sw = New Stopwatch
            sw.Start()
            Dim range = ws.Range(ws.Cells(1, 1), ws.Cells(50000, 100))
            Dim rangeValue = range.Value
            sw.Stop()
            Trace.WriteLine(sw.Elapsed.ToString)
            For x = 1 To rangeValue.GetLength(0)
                For y = 1 To rangeValue.GetLength(1)
                    Trace.Write(rangeValue(x, y) & " ")
                Next
                Trace.WriteLine("")
            Next
        End Sub
    Me donne un rapatriement de 50.000 lignes de 100 colonnes, donc 5.000.000 cellules en 1,1 seconde

  12. #12
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Je vais tester cette méthode ,
    mais je pense aussi le fait d'ouvrir et de fermer a la suite des classeurs via interop ralentit énormément le processus.
    En le faisant par ACE.OLEDB ca va très très vite en comparaison , mais il manque des infos a cause de formats merdique dans les fichiers sources.(fusion, liste de choix etc..)
    Je vais finir par trouver un moyen.

  13. #13
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Si ce sont les listes de choix qui posent problème, n'est-il pas possible de ne lire que la partie visible des cellules (comme lorsqu'on regarde la feuille Excel à l'écran) ?
    Je pense à ActiveCell.Text ou ActiveCell.Value ou ActiveCell.FormulaR1C1, ..., (j'ai pas testé).

  14. #14
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    @Phil Rob : Relis bien la conversation, il n'a pas de problème pour lire avec l'interrop, ça fonctionne très bien, c'est juste un problème de vitesse car effectivement chaque action en automation office prend du temps et il faut les limiter. C'est avec OLEDB qu'il y a un problème de lecture des listes. (et aussi des cellules fusionnées).

    Comme il le dit dans sa précédente réponse, il pense que c'est l'ouverture des classeurs qui pose problème et c'est bien possible.

    @Ashireon : En cherchant rapidement j'ai aussi trouvé "Excel Data Reader - Read Excel files in .NET" , à tester...

    Tiens nous au courant de tes trouvailles...

    P.S. : Si en automation tu lis cellule par cellule, mon précédent code te fera déjà bien gagner du temps.

  15. #15
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Citation Envoyé par Sankasssss Voir le message
    @Phil Rob : Relis bien la conversation, il n'a pas de problème pour lire avec l'interrop, ça fonctionne très bien, c'est juste un problème de vitesse car effectivement chaque action en automation office prend du temps et il faut les limiter. C'est avec OLEDB qu'il y a un problème de lecture des listes. (et aussi des cellules fusionnées).

    Comme il le dit dans sa précédente réponse, il pense que c'est l'ouverture des classeurs qui pose problème et c'est bien possible.

    @Ashireon : En cherchant rapidement j'ai aussi trouvé "Excel Data Reader - Read Excel files in .NET" , à tester...

    Tiens nous au courant de tes trouvailles...

    P.S. : Si en automation tu lis cellule par cellule, mon précédent code te fera déjà bien gagner du temps.

    Sorry ...
    Je répondais seulement à la remarque de 13h30' :
    ... mais il manque des infos a cause de formats merdique dans les fichiers sources.(fusion, liste de choix etc..)
    C'est pourquoi la lecture de ce qui visible seulement (si c'est possible) ôterait le problème des listes de choix.

  16. #16
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    @Phil Rob : Oui mais cette remarque était pour la partie OleDb :
    Citation Envoyé par Ashireon Voir le message
    En le faisant par ACE.OLEDB ca va très très vite en comparaison , mais il manque des infos a cause de formats merdique dans les fichiers sources.(fusion, liste de choix etc..).

    qui s'utilise comme la lecture d'une base de données, ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Using connExcel As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'")
                connExcel.Open()
                Using dc As New OleDb.OleDbCommand("select * from [Feuil1$]", connExcel)
                    Using da As New OleDb.OleDbDataAdapter(dc)
                        dt = New DataTable
                        da.Fill(dt)
                    End Using
                End Using
            End Using
    Et là il y a des problèmes.
    Avec l'automation ça fonctionne bien mais c'est hyper lent.

    Il faut bien lire et comprendre les messages pour bien répondre

  17. #17
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Bonjour,
    Et bonne nouvelle et un grand merci à tous et particulièrement à Sankass qui a trouvé la solution avec Exceldatareader ( fonctionne très bien en mode binary pour les fichiers .xls). je rapatrie sur un dataset en un clin d'oeil un fichier excel.
    Ensuite je peux requeter la dessus ça va aller très très vite je pense.
    Merci je cloture

    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
     
     Public Sub ChargementDatareaderExcel(ByVal chemin As String)
     
            Dim Str As FileStream = File.Open(chemin, FileMode.Open, FileAccess.Read)
     
            Dim LecteurExcel As IExcelDataReader = ExcelReaderFactory.CreateBinaryReader(Str)
     
            DATSuivi = LecteurExcel.AsDataSet
     
            While LecteurExcel.Read
     
             End While
     
            LecteurExcel.Close()
     
     
        End Sub
    plutot facile et les champs qui me posaient problème leur valeur on été rapatriée.

  18. #18
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Content que ça fonctionne.
    C'est toujours bon à savoir au cas où on exigerait la lecture de .xls .
    Bon week-end.

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

Discussions similaires

  1. [Lazarus] [0.9.24] Utilisation d'OLE pour piloter Excel
    Par dnode57 dans le forum Lazarus
    Réponses: 1
    Dernier message: 27/08/2008, 12h11
  2. Win32::OLE::Const 'Microsoft Excel';
    Par best94 dans le forum Modules
    Réponses: 0
    Dernier message: 09/04/2008, 15h29
  3. Objet OLE WORD et EXcel avec mot de passe
    Par willich dans le forum Modélisation
    Réponses: 2
    Dernier message: 28/05/2007, 14h22
  4. OLE automation pour Excel
    Par escteban dans le forum VBScript
    Réponses: 5
    Dernier message: 19/04/2007, 12h20
  5. Gestion OLE/COM pour Excel + Fichier d'aide
    Par MelkInarian dans le forum Delphi
    Réponses: 1
    Dernier message: 25/02/2007, 16h21

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