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 :

probleme d'ouverture d'un fichier excel


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut probleme d'ouverture d'un fichier excel
    Bonjour,
    Je souhaite ouvrire un fichier excel déja existant afin de modifier des cellules.
    Voici mon programme:
    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
     
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include <utilcls.h>
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    extern PACKAGE wchar_t * __fastcall StringToOleStr(const AnsiString Source);
    TForm1 *Form1;
    Variant vMSExcel, vXLWorkbooks, vXLWorkbook, vWorksheet,vFileName;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbooks= vXLWorkbooks.OleFunction("Add");
    vXLWorkbooks = vXLWorkbooks .OlePropertyGet("Worksheets",1);
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    vMSExcel.OleFunction("Quit");
    vMSExcel = Unassigned;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    Variant vValue, vRange, vCell;
    AnsiString s;
    s=Edit1->Text;
    vCell = vWorksheet.OlePropertyGet("Cells",4,1);
    vValue = s.c_str();
    vCell.OlePropertySet("Value", vValue);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Variant vValue, vRange, vCell;
    AnsiString s;
    s=Edit1->Text;
    vCell = vWorksheet.OlePropertyGet("Cells",1,1);
    vValue = s.c_str();
    vCell.OlePropertySet("Value", vValue);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
     
    vMSExcel = Variant::GetActiveObject("Excel.Application");
     
    vMSExcel.OlePropertySet("Visible", true);
    vFileName= "C:\\Classeur.xls";
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbooks= vXLWorkbooks.OleFunction("Open",vFileName);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
    vXLWorkbook.OleProcedure("Save");
    }
    Mon programme ouvre bien lorsque que jappuye sur le bouton 2 (creation d'un nouveau fichier) mais il me met une erreur lorsque que je souhaite ouvrir un fichier déja existant (bouton 6) "Opération non disponible".
    1) Cependant lorsque je clique sur le bouton 2,ensuite je ferme la page excel je peu cliquer sur le bouton 6 et sans erreur...
    2) De plus si je veu modifier une cellule d'un fichier existant il me met une erreur "OLE error 800A01A8"

    Merci d'avance

  2. #2
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    C'est normal que ton Bouton6 plante lorsque tu cliques dessus en premier car tu n'as pas d'instance d'Excel d'ouverte.

    Cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vMSExcel = Variant::GetActiveObject("Excel.Application");
    Te renvois l'instance d'Excel ouverte s'il y en a une, null sinon.

    Donc tu peux faire un test s'il y a une instance d'excel d'ouverte, si c'est le cas, tu la récupère, sinon tu en crée une comme tu le fait dans ton Bouton2.

    Et là normalement tu ne devrais pas avoir d'erreur.

    Ton Bouton6 fonctionne après que tu est cliqués sur le Bouton2 car tu as une instance d'Excel d'ouverte donc tu peux la récupérer.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    ahh ok !! Je voi le truc maintenant ..
    Mais est que tu sais pourquoi je ne peut pas modifier mon fichier excel avec mes 2 autre boutons (bouton 1 et 5 ) ?

    Merci de ta rapidité

  4. #4
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Je ne sais pas si cela viens forcément de cela mais essaye ceci pour l'écriture de ta valeur dans une cellule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    AnsiString s;
    ...
    vValue = StringToOleStr(s);
    vCell.OlePropertySet("Value", vValue);

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    non sa marche pas ,sa me met une erreur..
    Ambiguity between '_fastcall System::StringToOleStr(cont System::AnisString)' and '_fastcall System::StringToOleStr(cont System::AnisString)'

  6. #6
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    essaye en incluant ceci au début de ta form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "Excel_XP.h"
    Après je sais pas quelle version tu utilises de C++ Builder, et surement qu'il y a une classe qui existe avec les versions plus récentes

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    sa me met des erreurs dans Office_XP.h
    Le truc c'est que se code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Variant vValue, vRange, vCell;
    AnsiString s;
    s=Edit1->Text;
    vCell = vWorksheet.OlePropertyGet("Cells",4,1);
    vValue = s.c_str();
    vCell.OlePropertySet("Value", vValue);
    marche très bien lorsque que je crée un nouveau fichier...
    Mais moi j'aimerai modifier un fichier déja existant.

    Je travail sur C++ builder 6

  8. #8
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut jojolastar27
    C'est tout a fait normal que cela ne fonctionne pas tu recopie le code de la FAQ sans faire attention, deja ceci a mon avis ne sert a rien
    extern PACKAGE wchar_t * __fastcall StringToOleStr(const AnsiString Source);
    pour ouvrir Excel il faut faire comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbook= vXLWorkbooks.OleFunction("Add");
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",1);
    }
    et deja la les bouttons 1 et 5 vont fonctionner

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    oui les boutons 1 et 5 ont toujours fonctionner lorsque j'utilise le bouton 2.Se que je souhaite c'est ouvrir une fichier deja existant ("C:\\Classeur.xls") et le modifier.
    Dsl mais pour cette ligne je les pas trop comprise donc j'ai preferer la rajouter a mon programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern PACKAGE wchar_t * __fastcall StringToOleStr(const AnsiString Source);
    Je debute sur builder et ces assez chaud

  10. #10
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Cette ligne ne t'est pas necessaire donc inutile
    extern PACKAGE wchar_t * __fastcall StringToOleStr(const AnsiString Source);
    Je pense qu'il est necessaire pour toi de bien comprendre que tes variables doivent declarees correctement tu melange public et prive
    Prive soit dans ton .h, private: // User declarations
    Public dans ton .h, public: // User declarations

    dans le .cpp
    declarees comme ceci elles sont public donc accessible dans tout le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TForm1 *Form1;
    Variant vMSExcel, vXLWorkbooks, vXLWorkbook, vWorksheet,vFileName;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    comme ceci elles sont privee donc accessible uniquement dans cette portion de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    Variant vValue, vRange, vCell;
    AnsiString s;
    }
    vMSExcel represente l'application.
    vXLWorkbooks represente les classeurs.
    vXLWorkbook represent le classeur sur lequel tu travail.
    vWorksheets represente les feuilles du classeur.
    vWorksheet represente la feuille sur laquelle tu travail
    vRange("A1") ou ("Cells", 1, 1) la cellule sur laquelle tu travail
    voici le 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include <utilcls.h>
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    Variant vMSExcel, vXLWorkbooks, vXLWorkbook, vWorksheet,vFileName;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbook= vXLWorkbooks.OleFunction("Add");
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    vMSExcel.OleFunction("Quit");
    vMSExcel = Unassigned;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    Variant vValue, vRange, vCell;
    AnsiString s;
    s=Edit1->Text;
    vCell = vWorksheet.OlePropertyGet("Cells",4,1);
    vValue = s.c_str();
    vCell.OlePropertySet("Value", vValue);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Variant vValue, vRange, vCell;
    AnsiString s;
    s=Edit1->Text;
    vCell = vWorksheet.OlePropertyGet("Cells",1,1);
    vValue = s.c_str();
    vCell.OlePropertySet("Value", vValue);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
    vFileName= "C:\\test.xls";
    vXLWorkbook= vXLWorkbooks.OleFunction("Open",vFileName);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
    vXLWorkbook.OleProcedure("Save");
    }

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    J'arrive bien a faire la difference entre privé et public mais le truc cest que je ne savait pas a quoi correspondant exactement les variables vMSExcel .... mais maintenant c'est bon .
    Par contre ton code me permet bien d'ouvrir le fichier déja existant mais je ne peut pas le modifier avec les deux boutons (sa modifie le nouveau fichier)

  12. #12
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Il faut selectionner le nouveau classeur charge ainsi que la feuille de travail du nouveau classeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
    vFileName= "C:\\test.xls";
    vXLWorkbook= vXLWorkbooks.OleFunction("Open",vFileName);
     
    // on active le classeur test
    vXLWorkbook = vMSExcel.OlePropertyGet("Workbooks", 2); // ici on peut remplacer "1" par le nom du classeur "mon_classeur"
    vXLWorkbook.OleProcedure("Activate");
    // on active la feuille 1 du classeur test
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1); // ici on peut remplacer "1" par le nom de la feuille "ma_feuille
    vWorksheet = vMSExcel.OlePropertyGet("ActiveSheet");
    }
    //---------------------------------------------------------------------------
    Par contre il y a une chose que je ne comprend pas, pourquoi ouvre tu un classeur vide pour travailler sur un autre classeur

  13. #13
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    Cettait un programme ou j'essayait de comprendre Excel c'est pour cela que jessayait d'ouvrire un classeur vide et un classeur a modifier .
    Mais le je pense que j'ai tout compris.
    Merci les gars

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

Discussions similaires

  1. Probleme d'ouverture d'un fichier Excel
    Par sihammaster dans le forum VB.NET
    Réponses: 0
    Dernier message: 20/01/2011, 11h56
  2. Ouverture d'un fichier excel predefini
    Par nberthonneau dans le forum Access
    Réponses: 10
    Dernier message: 13/06/2007, 22h14
  3. [VBA-E] Probleme avec l'ouverture d'un fichier Excel
    Par mennix dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/12/2006, 11h11
  4. [Debutant][VB.net] Probleme d'ouverture d'une fichier excel
    Par Tatouine dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/06/2006, 12h42
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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