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 :

Enregistrer un StringGrid au format xls


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 14
    Points
    14
    Par défaut Enregistrer un StringGrid au format xls
    Bonjour, je développe sous C++ builder 6 et mon appli comporte un stringgrid. Je voudrais l'enregistrer entièrement au format xls ou autre de façon à pouvoir l'ouvrir sur ecxel. Comment faire?
    merci.

  2. #2
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Tu peux générer ton document EXCEL en manipulant directement EXCEL via OLE.

    Tu peux allez voir ici ou pour plus d'informations...

    Si tu veux simplement pouvoir l'ouvrir avec EXCEL, tu peux générer un simple fichier CSV, chose qui est plutôt simple.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  3. #3
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Pour générer un CSV, voilà une fonction toute faite:
    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
    void StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator )
    {
      TStringList *csv = new TStringList();
      for( int i=0; i< grid->RowCount; i++ )
      {
        AnsiString ligne = "" ;
        for( int j=0; j< grid->ColCount; j++)
        {
          ligne = ligne + grid->Cells[j][i] + AnsiString(separator) ;
        }
        csv->Add( ligne ) ;
      }
      csv->SaveToFile( filename ) ;
      delete csv ;
    }
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      StringGrid2CSV( StringGrid1, "C:\\MonFichierCSV.csv" , ',' ) ;
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Fonction intéressante mais j'ai une erreur lors de la compilation :

    [C++ Erreur] Unit1.cpp(245): E2268 Appel à une fonction non définie 'StringGrid2CSV'

    Etrange....

  5. #5
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Citation Envoyé par dekalima Voir le message
    Fonction intéressante mais j'ai une erreur lors de la compilation :

    [C++ Erreur] Unit1.cpp(245): E2268 Appel à une fonction non définie 'StringGrid2CSV'

    Etrange....

    Tu a simplement oublié de déclarer la fonction dans ton .h
    void StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator );

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Oui j'avais oublié et après j'ai déconnecté. Toujours est-il que j'ai une autre erreur:

    [Lieur Erreur] Unresolved external 'TForm1::StringGrid2CSV(Grids::TStringGrid *, System::AnsiString, char)' referenced from C:\USERS\ARNAUD\DESKTOP\TUTO\UNIT1.OBJ

  7. #7
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Citation Envoyé par dekalima Voir le message
    Oui j'avais oublié et après j'ai déconnecté. Toujours est-il que j'ai une autre erreur:

    [Lieur Erreur] Unresolved external 'TForm1::StringGrid2CSV(Grids::TStringGrid *, System::AnsiString, char)' referenced from C:\USERS\ARNAUD\DESKTOP\TUTO\UNIT1.OBJ
    Maintenant c'est un problème de portée.
    Est ce que tu a déclaré StringGrid2CSV comme une méthode de la classe TForm1 ?

    Et ensuite écrit la fonction à l'extérieur de la classe comme elle te l'a été donné ?

    Si c'est le cas, il suffit de l'écrire comme une méthode de la classe en ajoutant TForm1 comme ceci
    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
    void TForm1::StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator )
    {
      TStringList *csv = new TStringList();
      for( int i=0; i< grid->RowCount; i++ )
      {
        AnsiString ligne = "" ;
        for( int j=0; j< grid->ColCount; j++)
        {
          ligne = ligne + grid->Cells[j][i] + AnsiString(separator) ;
        }
        csv->Add( ligne ) ;
      }
      csv->SaveToFile( filename ) ;
      delete csv ;
    }

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Oui j'avais trouvé ça hier soir, merci de ton aide ... par contre j'avais encore une autre erreur( pas lors de la compilation, mais au moment ou il appelle la fonction dans l'exe ).

    J'ai ça dans mon .h en définitif: (pour public)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    public:
            __fastcall TForm1(TComponent* Owner);
              void TForm1::StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator );
    et comme erreur dans l'execution au moment ou il appelle la fonction j'ai cette erreur:


  9. #9
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Citation Envoyé par dekalima Voir le message
    Oui j'avais trouvé ça hier soir, merci de ton aide ... par contre j'avais encore une autre erreur( pas lors de la compilation, mais au moment ou il appelle la fonction dans l'exe ).

    J'ai ça dans mon .h en définitif: (pour public)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    public:
            __fastcall TForm1(TComponent* Owner);
              void TForm1::StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator );
    et comme erreur dans l'execution au moment ou il appelle la fonction j'ai cette erreur:

    ok, je suppose que l'erreur survient lors du SaveToFile,
    Est ce bien le cas ?
    Il peut y avoir pas mal de raisons pour qu'une écriture dans un fichier échoue, par exemple : pas de droit en écriture, disque plein, etc...

    Sinon, tu n'es pas obligé de spécifier le TForm1 dans la déclaration, tu peux simplement écrire :
    void StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator );

    Comme il est dans la déclaration de la classe, il n'y a pas besoin de le rappeler au compilo.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Hum oui, j'ai changé la destination d'enregistrement du fichier et j'ai plus ce message d'erreur ( j'ai quelque problèmes de sécurité sur seven ), mais il enregistre rien du tout...
    Je vais y réfléchir, merci de ton aide

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Nan ça marche pas, je vous donne le code si l'un d'entre vous voit quelque chose:

    .h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public:
            __fastcall TForm1(TComponent* Owner);
              void TForm1::StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator );
    fonction:
    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
     
    void TForm1::StringGrid2CSV( TStringGrid *StringGrid1, AnsiString filename, char separator )
    {
      TStringList *csv = new TStringList();
      for( int i=0; i< StringGrid1->RowCount; i++ )
      {
        AnsiString ligne = "" ;
        for( int j=0; j< StringGrid1->ColCount; j++)
        {
          ligne = ligne + StringGrid1->Cells[j][i] + AnsiString(separator) ;
        }
        csv->Add( ligne ) ;
      }
      csv->SaveToFile( filename ) ;
      delete csv ;
    }
    Appel de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringGrid2CSV( StringGrid1, "C:\Users\ARNAUD\Downloads\MonFichierCSV.csv" , ',' ) ;

    Si personne trouve, je laisserais tomber. j'en ai marre

  12. #12
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Citation Envoyé par dekalima Voir le message
    Si personne trouve, je laisserais tomber. j'en ai marre
    Il faut persévérer, c'est en se cassant la tête sur des problème qu'on apprend le plus!

    Alors déja:
    Dans ton .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public:
           __fastcall TForm1(TComponent* Owner);
    private: // A moins qu'il y ait une utilité a la déclarer public?
            //inutile de mettre 'TForm1::' ici 
            void StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator );
    Ensuite en C++ le caractère '\' est un caractère d'échappement, donc dans une chaine de caractère il faut le doubler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     StringGrid2CSV( StringGrid1, "C:\\Users\\ARNAUD\\Downloads\\MonFichierCSV.csv" , ',' ) ;
    Après si c'est vraiment la sauvegarde qui pose problème, c'est peut être a cause de la politique de sécurité spécifique à Windows7, et là je ne peut pas t'aider étant donné que je ne connais pas du tout l'OS.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    C'est bon, ça marche maintenant, merci à toi encore une fois....

    Donc il ouvre bien un fichier avec les valeurs de mon Stringgrid1 mais il me met quand même une autre erreur ( parce que sinon c'est pas marrant ) :



    Mais bon, on peut passer outre pour voir quand même le tableau, mais si quelqu'un connait la signification de cette erreur, c'est toujours bon à prendre

  14. #14
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    A tester:
    Cela arrive lorsque les deux premiers caractères de ton fichier CSV sont "ID" (en majuscule). Essai de changer les deux premiers caractères par n'importe quoi d'autre (y compris "id" en minuscule) pour voir si le problème vient bien de là.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    En effet, j'ai un ID dans la cellule [0][0] si je me souviens bien... merci!

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2003
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void StringGrid2CSV( TStringGrid *grid, AnsiString filename, char separator )
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      StringGrid2CSV( StringGrid1, "C:\\MonFichierCSV.csv" , ',' ) ;
    Mais comment cela peut-il marcher chez vous ? Chaque fois que j'ai essayé de passer une TStringGrid en paramètres à une fonction, notamment de cette façon, j'ai eu un superbe message d'erreur du compilateur "les classes de style VCL doivent être construites en utilisant l'opérateur new" ??? Du coup j'y avais renoncé ! Et d'ailleurs j'ai toujours ce message...

  17. #17
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Citation Envoyé par pjtuloup Voir le message
    Mais comment cela peut-il marcher chez vous ? Chaque fois que j'ai essayé de passer une TStringGrid en paramètres à une fonction, notamment de cette façon, j'ai eu un superbe message d'erreur du compilateur "les classes de style VCL doivent être construites en utilisant l'opérateur new" ??? Du coup j'y avais renoncé ! Et d'ailleurs j'ai toujours ce message...
    Dans l'exemple donné, c'est un pointeur sur l'objet qui est passé en paramètre, est ce que tu déclares bien un pointeur sur ton objet, c'est peut être la ton problème... ?

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

Discussions similaires

  1. [Débutant] Enregistrer au format .xls en ayant Excel 2007
    Par kryztof dans le forum MATLAB
    Réponses: 12
    Dernier message: 18/08/2009, 15h57
  2. XP "enregistrer l'image sous" : formats disparus !
    Par NEXUS6 dans le forum Windows XP
    Réponses: 7
    Dernier message: 18/12/2005, 11h08
  3. [VBA-E] Enregistrer sous un autre format
    Par Bashaq dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/10/2005, 23h33
  4. lecture de fichier au format xls via un prog C++
    Par lepoutho dans le forum C++
    Réponses: 9
    Dernier message: 08/09/2005, 10h23
  5. [GLScene] Comment enregistrer une image au format TGA
    Par Invité dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 27/05/2005, 15h12

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