Ralala ... On peut dire que tu as de la chance, j'ai du faire ceci il y a moins de une semaine .
J'avais fait pas mal de recherches pour exporter vers excel, et ce qui m'a semblé le plus simple c'est d'enregistrer sous forme de fichier xml.
Cela se présente comme ceci :
<?xml version="1.0"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<ColonneA>Donnée1</ColonneA>
<ColonneB>Donnée2</ColonneB>
//...
</row>
<row>
<ColonneA>Donnée4</ColonneA>
<ColonneB>Donnée5</ColonneB>
</row>
//...
</Root>
Ce code donne :
ColonneA ColonneB
Donnée1 Donnée2
Donnée4 Donnée5
//... ...
Le tout s'enregistre au format .xls, et s'ouvre automatiquement avec excel qui va demander 2 trucs à l'ouverture :
au premier il faut répondre : "En tant que liste XML", et au 2ème il faut cliquer sur "Ok" pour que le schéma sur lequel se base excel soit fait automatiquement (je pense que ce
n'est pas la peine de détailler plus, ça n'a pas grand rapport avec le code).
Quant au fameux code : (il est a ajuster pour le mettre dans une fonction au lieu du main)
#include
#include <fstream> // Pour l'enregitrement j'utilise fstream
void afficheColonne(float [], int); // Fonction pour vérifier le contenu d'une colone
void EnregistrerUneColonne(float[], float[], float[], float[], int); // Un fonction qui enregistre les 4 colonnes
int main()
{
int nbredemesures = 25; // Au pif, ici c'est encore dans le main pour faire un test
float *INPUT = new float[nbredemesures];
int nbElementsColonne = (int)(nbredemesures / 4);
FILE*ReadInput;
ReadInput=fopen("fichier.txt","r" ) ;
if(ReadInput==0)
{
fprintf(stderr,("Erreur ouverture fichier\n"));
exit(-1);
}
for (int i=0 ; i < nbredemesures; i++)
{
fscanf(ReadInput,"%f", &INPUT[i]);
}
printf("\n\n");
float ligne[4] = { 0};
//Les 4 colonnes :
float *colonneA = new float[nbElementsColonne];
float *colonneB = new float[nbElementsColonne];
float *colonneC = new float[nbElementsColonne];
float *colonneD = new float[nbElementsColonne];
// Leurs initialisations
for (int i = 0; i < nbElementsColonne; i++)
{
colonneA[i] = 0;
colonneB[i] = 0;
colonneC[i] = 0;
colonneD[i] = 0;
}
fclose(ReadInput) ;
int index = 0; // Compte le nombre de lignes dans la colonne
for (int i=0 ; (i+4)<nbredemesures ; i+= 4) // On prend ligne par ligne
{
for (int j = i; j < i + 4; j++)
{
printf("\t%f",INPUT[j]); // et on affiche élément par élément
if (j == i)
{
colonneA[index] = INPUT[j]; // Remplis la colonne A à la ligne index, tous les 4 i
}
else if ( j == (i+1))
{
colonneB[index] = INPUT[j]; // Idem pour B mais avec la valeur suivante
}
else if (j == (i+2))
{
colonneC[index] = INPUT[j]; // ...
}
else
{
colonneD[index] = INPUT[j]; //...
}
}
index ++;
printf ("\n");
}
// Affiche le contenu des colonnes pour vérification :
printf ("\nColonne A : \n");
afficheColonne(colonneA, nbElementsColonne);
printf ("\nColonne B : \n");
afficheColonne(colonneB, nbElementsColonne);
printf ("\nColonne C : \n");
afficheColonne(colonneC, nbElementsColonne);
printf ("\nColonne D : \n");
afficheColonne(colonneD, nbElementsColonne);
// Enregistre les colonne avec une fonction (pour pas surcharger le main qui est déjà pas mal grand... :
EnregistrerUneColonne(colonneA, colonneB, colonneC, colonneD, nbElementsColonne);
// Supprime les tableaux du tas :
delete[] colonneA;
delete[] colonneB;
delete[] colonneC;
delete[] colonneD;
delete[] INPUT;
}
// Fonction d'affichage :
void afficheColonne(float colonne[], int nombreElements)
{
for (int i = 0; i < nombreElements; i++)
{
std::cout << colonne[i] << std::endl;
}
}
// Enregistement :
void EnregistrerUneColonne(float colonneA[], float colonneB[], float colonneC[], float colonneD[], int nbreLignes)
{
// ouvre le fichier en écriture, le crée s'il n'existe pas et remplace le fichier existant
std::ofstream fichier; // Ouvre un fichier façon fstream (ça fait pareil que FILE *)
fichier.open("fichierExcel.xls", std::ios::out); // Ouvre le fichier (ou crée) fichierExcel.xls à coté de l'éxecutable, et le vide (par défaut)
if (fichier) // Si y'a pas eu d'erreur au niveau du fichier on continu
{
std::cout << "\n**Enregistrement**\n"; // <- Si ça ne s'affiche dans la console, c'est que le fichier est pas ouvert
// En-tête :
fichier << "<?xml version="1.0"?>\n<Root xmlns:xsi="http:\/\/www.w3.org\/2001\/XMLSchema-instance">\n";
// Remplissage :
for (int i = 0; i < nbreLignes; i++)
{
fichier << "\t<row>\n\t\t<ColonneA>";
fichier << colonneA[i];
fichier << "</ColonneA>\n\t\t";
fichier << "<ColonneB>";
fichier << colonneB[i];
fichier << "</ColonneB>\n\t\t";
fichier << "<ColonneC>";
fichier << colonneC[i];
fichier << "</ColonneC>\n\t\t";
fichier << "<ColonneD>";
fichier << colonneD[i];
fichier << "</ColonneD>\n";
fichier << "\t</row>\n";
}
fichier << "</Root>";// Pour finir le fichier en xml correctement
fichier.close(); // Et fermeture
}
}
Et voila !
Du coté des nom de variables c'est à revoir au départ j'avais pris nbredemesures comme le nombre de chiffres dans le fichier...Mais bon ça ne change rien au calcul, tant que c'est bien ceci qu'on lui donne. J'ai testé avec un fichier "fichier.txt" qui contient :
1.5 2.3 3.54 4.78
5 6 7 8.8
9.54 10.4 11.4 12.5585
13.1 14 15 16
17 18.65 19.48 20.16
21 22.13 23 24
Et marche très bien, le fichier excel créé ("fichierExcel.xls") a 4 colonnes A,B,C,D qui contiennent les chiffres dans l'ordre, avec les décimales.
Bon ben voila, (enfin je crois)
C++dialement,
Pop70