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.
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.
Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...
Pour générer un CSV, voilà une fonction toute faite:
Utilisation :
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 ; }
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...
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....
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 ; }
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)
et comme erreur dans l'execution au moment ou il appelle la fonction j'ai cette erreur:
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 );
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.
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
Nan ça marche pas, je vous donne le code si l'un d'entre vous voit quelque chose:
.h:
fonction:
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 );
Appel de la 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 ; }
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
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:
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
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 );
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part StringGrid2CSV( StringGrid1, "C:\\Users\\ARNAUD\\Downloads\\MonFichierCSV.csv" , ',' ) ;
Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...
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
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...
En effet, j'ai un ID dans la cellule [0][0] si je me souviens bien... merci!
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...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager