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++ Discussion :

ouvrir fichier Excel avec VC++


Sujet :

C++

  1. #21
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    error C2275: '_variant_t' : utilisation non conforme de ce type comme expression
            f:\program files\microsoft visual studio 9.0\vc\include\comutil.h(1000) : voir la déclaration de '_variant_t'
    f:\documents and settings\jérôme\mes documents\visual studio 2008\projects\testexcel\testexcel\main.cpp(36) : error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'chaine'
    f:\documents and settings\jérôme\mes documents\visual studio 2008\projects\testexcel\testexcel\main.cpp(36) : error C3861: '_T' : identificateur introuvable

  2. #22
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    il te manque un include ...
    la macro _T est défini dans windows.h ou tchar.h (a vérifier)
    a la rigueur fait sans la macro, puisque _variant_t accepte les char ou les wchar_t --> enleve le _T

    @+

  3. #23
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    J'ai rajouté winows.h et tchar.h
    J'ai enlevé la macro "_T()"

    Mais ça ne compile toujours pas.

  4. #24
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    Toujours ce satané :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '_variant_t' : utilisation non conforme de ce type comme expression
    Solution ?

  5. #25
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    pas assez d'infos.
    poste la fonction complète.

  6. #26
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    Désolé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheet->Range["B7"]->Value = _variant_t chaine(_T("ma chaine"));


    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    _variant_t chaine(_T("ma chaine"));
    worksheet->Range["B7"]->Value = chaine;
    La compilation marche et la feuille Excel s'ouvre mais J'ai toujours l'erreur "Le type ne correspond pas".

  7. #27
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    worksheet->Range["B7"]->Value = _variant_t chaine(_T("ma chaine"));
    c'est pas du C++ ça
    tu fais une affectation avec une déclaration de variable ...

    fais plutot ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    worksheet->Range["B7"]->Value = _variant_t(_T("ma chaine"));
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    worksheet->Range["B7"]->Value = _T("ma chaine");
    devrait marcher aussi car ce n'est pas un constructeur explicit.


    La compilation marche et la feuille Excel s'ouvre mais J'ai toujours l'erreur "Le type ne correspond pas".
    Là c'est spécifique à Excel. Il rejette ton affectation, peut être parce que c'est pas un format attendu (erreur lors d'une conversion), ou qu'il y a une option sur le format de la cellule ...

    Désolé de ne pas t'aider plus, mais je peux pas faire mieux que rechercher à ta place dans la MSDN ...

    c'est peut être le "B7", si tu compiles en UNICODE ça peut etre un probleme, ou il faut peut etre un variant aussi ...

    @+

  8. #28
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    Comment savoir si je compile en UNICODE ?
    J'ai mis [_variant_t(_T("B7"))] à Range mais sans succès.

  9. #29
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Si la propriété demande explicitement une BSTR dans un variant, tu peux essayer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheet->Range["B7"]->Value = _variant_t(_bstr_t(_T("ma chaine")));

  10. #30
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    Le probleme ne vient pas de la syntaxe utilisé.
    Il y a des conversions implicites pour les bstr_t et variant_t
    Je suis justement en train de m'éclater avec pour faire du MSXML ...
    et ça marche très bien.

    Son probleme vient surtout de la méthodologie.
    Il appelle les mauvaises méthodes ou propriétés...
    Et là, c'est un tour par MSDN pour savoir comment s'y prendre pour modifier la valeur d'une cellule sous Excel ...

    @+

  11. #31
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Citation Envoyé par stephdim Voir le message
    Le probleme ne vient pas de la syntaxe utilisé.
    Il y a des conversions implicites pour les bstr_t et variant_t
    Sauf qu'à ma connaissance, un _variant_t peut contenir trois types de chaînes (char*, wchar_t* et BSTR). Il peut donc être nécessaire de forcer explicitement un type plutôt qu'un autre...

  12. #32
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    Ouf !!!
    Après de très nombreuses recherches aiguillées grâce à Médinoc et stehdim j'ai enfin réussi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheet->Range["C7"]->Item[1][1] = "test"
    A partir de l'exemple de cette page :
    http://www.codeproject.com/KB/wtl/WTLExcel.aspx

    EDIT : le lien est le 1er résultat Google en tapant "c++ excel #import"

  13. #33
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    Sauf qu'à ma connaissance, un _variant_t peut contenir trois types de chaînes (char*, wchar_t* et BSTR). Il peut donc être nécessaire de forcer explicitement un type plutôt qu'un autre...
    non, OLE ne connait que BSTR. Et BSTR est une chaine de caractères unicode uniquement --> la seule particularité de BSTR c'est que la mémoire est gérée par le système OLE via SysAllocString, SysFreeString ...

    après la classe variant_t propose des constructeurs à partir de char*,wchar_t* ou bstr_t pour faciliter la tache au programmeur, mais au final c'est du BSTR.

    @+

  14. #34
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    J'ai enlevé le tag [RESOLU].
    Explications :
    Vu que je dois ouvrir le fichier Excel en cliquant sur un bouton d'une IHM créée avec Qt, je dois convertir une valeur d'un tableau Qt en std::string et là ça ne marche plus.Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string chaineTest = tableau->item(0, 1)->text().toStdString();
    worksheet->Range["B7"]->Item[1][1] = chaineTest;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    .\IHM.cpp(128) : error C2664: 'Excel::Range::PutItem' : impossible de convertir le paramètre 3 de 'std::string' en 'const _variant_t &'
            Raison : impossible de convertir de 'std::string' en 'const _variant_t'
            Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé
    .\IHM.cpp(128) : error C2660: 'Excel::Range::GetItem' : la fonction ne prend pas 0 arguments
    Alors que ça marche nickel si je mets = "chaineTest".
    Je ne comprends plus...

  15. #35
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    récupère un pointeur sur la chaine uniquement, sans passer par un std::string
    je connais pas Qt mais ça doit etre faisable ...

    ou sinon il y a une méthode dans la STL pour récuperer une cstr()
    mais c'est un peu lourd, car tu converties une chaine Qt en chaine STL puis en chaine C puis en chaine BSTR ....

    @+

  16. #36
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Tu as raison, les types VT_LPSTR et VT_LPWSTR ne sont pas utilisés en OLE et, doc à l'appui, ne sont pas censés apparaître dans des VARIANT...

  17. #37
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    Tu as raison, les types VT_LPSTR et VT_LPWSTR ne sont pas utilisés en OLE et, doc à l'appui, ne sont pas censés apparaître dans des VARIANT...
    ok ils existent, mais tu me diras ou ils sont utilisés dans notre cas

    contenu de <comutil.h>:

    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
     
    // Construct a VT_BSTR VARIANT from a const _bstr_t&
    //
    inline _variant_t::_variant_t(const _bstr_t& bstrSrc) 
    {
        V_VT(this) = VT_BSTR;
     
        BSTR bstr = static_cast<wchar_t*>(bstrSrc);
        if (bstr == NULL) {
            V_BSTR(this) = NULL;
        }
        else {
            V_BSTR(this) = ::SysAllocStringByteLen(reinterpret_cast<char*>(bstr),
                                                   ::SysStringByteLen(bstr));
            if (V_BSTR(this) == NULL) {
                _com_issue_error(E_OUTOFMEMORY);
            }
        }
    }
     
    // Construct a VT_BSTR VARIANT from a const wchar_t*
    //
    inline _variant_t::_variant_t(const wchar_t* pSrc) 
    {
        V_VT(this) = VT_BSTR;
     
        V_BSTR(this) = ::SysAllocString(pSrc);
     
        if (V_BSTR(this) == NULL && pSrc != NULL) {
                _com_issue_error(E_OUTOFMEMORY);
        }
    }
     
    // Construct a VT_BSTR VARIANT from a const char*
    //
    inline _variant_t::_variant_t(const char* pSrc) 
    {
        V_VT(this) = VT_BSTR;
        V_BSTR(this) = _com_util::ConvertStringToBSTR(pSrc);
    }
    d'ailleurs je me demande pkoi ils n'ont pas utilisés VT_LPSTR et VT_LPWSTR ?

    mais bon, je pense pas que ce sujet interesse l'auteur de ce billet

    alors si c'est pour débattre sur des détails de ce genre ..... désolé je suis qu'un débutant

    @+

  18. #38
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    Je précise que j'avais commencé à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheet->Range["B7"]->Item[1][1] = tableau->item(0, 1)->text();

    Message du compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    impossible de convertir le paramètre 3 de 'QString' en 'const _variant_t &'
            Raison : impossible de convertir de 'QString' en 'const _variant_t'
            Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé
    .\IHM.cpp(128) : error C2660: 'Excel::Range::GetItem' : la fonction ne prend pas 0 arguments
    C'est par la suite que j'ai tenté de convertir en std:string mais le problème reste inchangé.

  19. #39
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Points : 75
    Points
    75
    Par défaut
    Up !

  20. #40
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    tu regardes dans la doc de Qt comment tu peux extraire un const char * ou un const wchar_t * depuis ton QString et le tour est joué. autrement dit, recuperer un pointeur sur une chaine de type C (avec un '\0' pour finir la chaine)
    de préférence un const wchar_t *, ça évite des conversions ...

    @+

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [XL-2010] Ouvrir fichier Excel avec une partie de son nom
    Par juluseless dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/10/2014, 15h12
  2. [XL-2007] Ouvrir fichier excel avec vba
    Par Traputaca dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/05/2013, 17h22
  3. Ouvrir fichier excel avec accents
    Par allergique dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/05/2011, 15h03
  4. [OpenOffice][Tableur] Ouvrir fichier EXCEL avec OO dans IE
    Par hittony dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 19/04/2011, 12h38
  5. Ouvrir fichier Excel avec macro
    Par zephirsoul dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/11/2007, 19h48

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