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

C++Builder Discussion :

[OLE][Excel] Charger un fichier csv


Sujet :

C++Builder

  1. #1
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut [OLE][Excel] Charger un fichier csv
    Bonjour,
    Je souhaite charger un fichier csv à partir de mon application. En me basant sur les tutoriaux et les explications de Ricky81, j'ai fais le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    vFileName = GetCurrentDir()+"Data\\"+nom_fichier+".csv"; //nom complet de l'emplacement
    vNotUsed = Unassigned;
    vSeparator = 4; //séparation par des ';'
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed, vNotUsed, vSeparator);
    Je me retrouve avec une erreur "Type de variable incorrecte" lors de l'éxécution de ce code.
    Je ne vois pas d'où viens l'erreur ni quel est la variable incorrecte.
    Si quelqun vois le soucis, je suis tout ouïe.
    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    je pense que c'est ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vFileName = GetCurrentDir()+"Data\\"+nom_fichier+".csv"; //nom complet de l'emplacement
    il faut d'abord convertir tout AnsiString ou String en chaine de caratere unicode (wchar_t*)
    pour cela on utilise habituellement la fonction StringToOleStr(...)

  3. #3
    Membre chevronné Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Par défaut
    Citation Envoyé par Djob
    il faut d'abord convertir tout AnsiString ou String en chaine de caratere unicode (wchar_t*) pour cela on utilise habituellement la fonction StringToOleStr(...)
    Ou alors tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WideString = "monAnsiString";
    et tu auras un wchar_t* (enfin dans mes souvenirs)

  4. #4
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Tout d'abord merci de m'avoir répondu.
    J'ai essayé ces deux lignes suivantes mais aucune n'a d'effet bénéfique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        chemin = GetCurrentDir()+"Data\\"+nom_fichier+".csv";
        vFileName = WideString (chemin); //nom complet de l'emplacement
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        chemin = GetCurrentDir()+"Data\\"+nom_fichier+".csv";
        vFileName = StringToOleStr(chemin); //nom complet de l'emplacement
    En effet je n'ai plus la même erreur, maintenant j'ai "une exception s'est produite".
    Lorsque je regarde dans le "sysvari.h" l'éxécution de la fonction appelée par OleFunction la variable arg possède une valeur à {????} alors que tous les paramètres sont renseignés.

  5. #5
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Bonsoir,

    j'ai reproduit ton problème. Il s'agit à priori du fichier qui n'existe pas.
    En tout cas j'ai fais un test avec une adresse de fichier existant (ca passe) et un autre avec une mauvaise adresse (ca donne ton erreur).

    Bon courage

    Eric

  6. #6
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    En effet, j'avais un soucis de ce côté là , mais ce qui m'inquiète c'est que même ce point corrigé, je n'arrive toujours pas à ouvrir excel.
    Il se produit la même erreur. :

  7. #7
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Bonjour,

    peux tu mettre ton code "complet" (enfin on se comprend j'espère) ?

    Eric

  8. #8
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut,
    Voilà mon code :
    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
     
        static bool excel;
    /*
        try
        {
            vMSExcel = Variant::GetActiveObject("Excel.Application");
        }
        catch(...)
        {
            vMSExcel = Variant::CreateObject("Excel.Application");
        }
    */
        if(!excel)
        {
            vMSExcel = Variant::CreateObject("Excel.Application");
            vMSExcel.OlePropertySet("Visible", true);
            excel = true;
        }
        else
        {
            vMSExcel = Variant::GetActiveObject("Excel.Application");
            vMSExcel.OlePropertySet("Visible", true);
        }
    /*    
        vFileName = "Data\\"+nom_fichier+".csv";
        vLink = Unassigned;
        vReadOnly = true;
        vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
        vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vLink, vReadOnly);
        Variant vFileName, vNotUsed, vSeparator;
    */
    /*
        vFileName = GetCurrentDir()+"Data\\"+nom_fichier+".csv"; //nom complet de l'emplacement
        vNotUsed = Unassigned;
        vSeparator = 4; //séparation par des ';'
        vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
        vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed, vNotUsed, vSeparator);
    */
        AnsiString chemin;
        chemin = GetCurrentDir()+"Data\\"+nom_fichier+".csv";
     
        vMSExcel.OlePropertySet("SheetsInNewWorkbook", 1); //1 feuille à l'ouverture
    //    vFileName = WideString (chemin); //nom complet de l'emplacement
        vFileName = StringToOleStr(chemin); //nom complet de l'emplacement
        vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
        vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, Unassigned, Unassigned, 4);
    En commentaire, tu peux voir les méthodes que j'ai essayé qui ne fonctionne pas.
    Je n'ai pas non plus réussi à récupérer l'instance ouverte d'excel, ce qui explique mon booléen me permettant de me faire mon instance et de travailler dessus.

    Si tu vois le problème, je t'acoute car j'aimerais bien comprendre pourquoi cela ne fonctionne pas.
    Merci de t'inquiéter de mon problème

  9. #9
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Vois-tu ce qui ne vas pas Ricky?

  10. #10
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Rajoutes un Quelque chose me dit que tu devrais plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chemin = GetCurrentDir()+"\\Data\\"+nom_fichier+".csv";
    Mais finalement, où se trouve ton fichier ?

    Eric

  11. #11
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Excuse moi pour le retard
    Mon fichier se trouve dans un répertoire "Data" situé lui même dans le répertoire courrant de l'application.
    J'ai modifié et rajouté le "\\" devant Data, et en effet ca ne devait pas arranger les chose, mais le problème est toujours présent.

  12. #12
    Nouveau candidat au Club
    Inscrit en
    Juin 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 2
    Par défaut
    Bonjour,

    J'ai eu le même pb en voulant charger des noms de fichier Excel
    à partir d'un .INI

    Le pb est le passage AnsiString->Variant

    Voici comment je l'ai résolu (pgm simplifié):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     AnsiString FileName2 = "test.xls" ;
    // en réalité c'était chargé à partir du .INI
    AnsiString FileName1 = "C:\\DATA\\" ;
    WideString = FileName = FileName1 + FileName2 ;
     
    Variant VFileName = FileName.c_bstr() ; // il s'agit bien de c_bstr() !!!!
     
    //Et à partir de là tu peux ouvrir avec un classique
     
    vXLWorkbook = vXLWorkbooks.OleFunction("Open",vFileName,vLink)
    // pour moi
    J'espère que ça marchera aussi bien pour toi

    A+

    René

  13. #13
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Merci COLIN pour ton aide, mais malheureusement cela ne marche pas plus.
    Je charge un fichier csv et ma commande est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, Unassigned, Unassigned, 4);
    L'erreur ne pourrait elle aps venir de là?

  14. #14
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    dans la faq on utilise vWorkbook et non pas vXLWorkbook est ce que cela aurait une importance ? en esperant t'aider

  15. #15
    Nouveau candidat au Club
    Inscrit en
    Juin 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 2
    Par défaut
    Salut bandit boy,je n'avais pas encore eu l'occasion de charger des.csvgrace a toi c est fait

    Le bout de pgm suivant marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Variant vMSExcel , vLink , vSeparator;
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible",true);
    vMSExcel= Variant::GetActiveObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible",true);
    vLink =0 ;
    vSeparator = 4;
    Variant vFileName, vXLWorkbooks, vXLWorkbook ;
    vFileName = "I:\\Myprojects\\Excelcsv\\Biotest.csv";
    vXLWorkbooks= vMSExcel.OlePropertyGet("Workbooks") ;
    ShowMessage("Avant load");
    vXLWorkbook= vXLWorkbooks.OleFunction("Open",vFileName,vLink,Unassigned,4) ;
    ShowMessage("Apres load");
    Tu devrais dans un premier temps ecrire le path deton file en dur
    ( dans ton pgm comme j'ai fait) si ca passe pas et que le path est bon !
    c'est l open qui marche pas
    Si pas de pb alors tu peux essayer de creer le path de maniere
    dynamique ( comme dans ton pgm par exemple)
    Mais de maniere générale il vaut mieux serier les pb
    Ici en fait on ne sait pas trop si c est au niveau du filename
    ou de la fonction open que ca merde

    En tout cas je t assure que le pgm ci-dessus fonctionne donc
    il n y a pas de raison que ca ne tourne pas pour toi

    A+

    René

  16. #16
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    j'ai effectue un essai pour moi ca fonctionne chez moi vois ce que tu peut faire avec j'utilise la boite de dialogue excel ouvrir pour prendre le nom du fichier il est possible d'ajouter un filtre pour les extensions des fichiers *.TXT ou *.CVS ...
    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
     
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
     
    #pragma link "Excel_2K_SRVR"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Variant vMSExcel , vLink , vSeparator;
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible",true);
    vMSExcel= Variant::GetActiveObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible",true);
    ExcelApplication1->Connect();
    Variant vFileName, vXLWorkbooks, vXLWorkbook ;
    Variant title = StringToOleStr("Ouverture Fichier"); // titre à donner à la boite de dialogue
    Variant multiselect = true; // selection multiple autorisée
    vFileName = ExcelApplication1->GetOpenFilename(EmptyParam, EmptyParam, title, EmptyParam, multiselect, 0);
    vLink =0 ;
    vSeparator = 4;
    vXLWorkbooks= vMSExcel.OlePropertyGet("Workbooks") ;
    //ShowMessage("Avant load");
    vXLWorkbook= vXLWorkbooks.OleFunction("Open",vFileName); //,vLink,Unassigned,4) ;
    //ShowMessage("Apres load");
    }

  17. #17
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Tout d'abord merci !
    J'ai tenté de faire la fonction donnée par COLIN, mais rien n'y fait, je n'arrive toujours pas à ouvrir mon fichier. J'obtiens toujours la même erreur "une exception c'est produite".
    Cependant, la méthode utilisée par blondelle fonctionne chez moi, comme quoi j'ai un problème à l'ouverture de mon fichier.
    Je vais partir, je pense, dans cette dernière direction.
    Merci encore à vous tous de vous être intéressé à mon cas.

  18. #18
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 35
    Par défaut
    Bonjour,
    j'ai utilisé le code de blondelle :

    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
     
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
     
    #pragma link "Excel_2K_SRVR"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Variant vMSExcel , vLink , vSeparator;
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible",false);
    ExcelApplication1->Connect();
    Variant vFileName, vXLWorkbooks, vXLWorkbook ;
    vLink =0 ;
    vSeparator = 4;
    vXLWorkbooks= vMSExcel.OlePropertyGet("Workbooks") ;
    vFileName="e:\\Bank.xls";
    vXLWorkbook= vXLWorkbooks.OleFunction("Open",vFileName); //,vLink,Unassigned,4) ;
    }
    avec quelques petites modification le nom du fichier est dans le source et je n'affiche pas la fenetre excel!
    J'ai essayé en l'affichant et ca marche tres bien!
    sauf que la je voudrais acceder au colonnes du fihcier!! comment faire ?
    je veux par exemple mettre les données de la colonne numéro1 dans un tableau ou bien afficher cette colonne dans un Mémo.
    ex: memo1->lines->ADD(IntToStr(ExcelApplication1->feuille1->colonne[1,1])); //un truc du genre
    je veux pouvoir extraire les données d'un fichier et les utiliser ensuite.
    Merci

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

Discussions similaires

  1. [PDO] Charger un fichier csv dans une base de données en utilisant PDO
    Par soussou1010 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/07/2014, 14h36
  2. charger ligne fichier csv dans tableau C
    Par nhella22 dans le forum Débuter
    Réponses: 6
    Dernier message: 21/04/2011, 20h28
  3. 40 Feuilles dans 1 fichier Excel = Autant de Fichier .CSV
    Par Nissartis dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/03/2008, 15h53
  4. Charger un Fichier CSV avec traitement
    Par Iphelias dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 06/08/2007, 13h53
  5. [Excel] séparateur pour les fichiers csv
    Par drinkmilk dans le forum Excel
    Réponses: 2
    Dernier message: 27/08/2005, 14h21

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