Générer un CSV à partir plusieurs onglets excels

Résolu
AkramIng Messages postés 12 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 23 juillet 2014 - Modifié par jordane45 le 25/06/2014 à 11:39
AkramIng Messages postés 12 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 23 juillet 2014 - 26 juin 2014 à 18:48
Bonjour,

Je voulais générer un seul csv à partir de 4 onglets excel
Voici le code que j'ai proposé mais ça marche pas
Merci de m'aider


 public void generationFeuillesToCsv()
        {
            if (File.Exists(Chemin_csv_output)) File.Delete(Chemin_csv_output);

            Application xl = new Application();

            try
            {
                Workbook workbook = xl.Workbooks.Open(Chemin_modgap_input);
                Worksheet ws = (Worksheet)workbook.Sheets["Stock_Passif"];
                Worksheet ws1 = (Worksheet)workbook.Sheets["nCredit"];
                ws.SaveAs(Chemin_csv_output, XlFileFormat.xlCSV);
                ws1.SaveAs(Chemin_csv_output, XlFileFormat.xlCSV);

                Marshal.ReleaseComObject(ws1);
            }
            finally
            {
                xl.DisplayAlerts = false;
                xl.Quit();

                Marshal.ReleaseComObject(xl);
            }


9 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
Modifié par jordane45 le 25/06/2014 à 11:39
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :

http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Message édité pour les mettre.
.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
25 juin 2014 à 11:46
mais ça marche pas
Peux tu être plus explicite ?

Est-ce que tu as des messages d'erreur ?
Est-ce que tu as testé en mode pas à pas ?
As tu essayé de mettre un block CATCH dans ton TRY ?..qu'obtiens tu ?


Tu as ajouté les référence Excel Interop à ton projet ?
using Microsoft.Office.Interop.Excel;


Et pour la déclaration... je pense que tu as une erreur ici :
 Application xl = new Application();
.
Pour moi ça devrait plutot être:
  Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();


0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
25 juin 2014 à 17:40
je pense que tu as une erreur ici :
Application xl = new Application();



S'il a bien mis le using, ça marche.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
25 juin 2014 à 17:46
Bonsoir,
                ws.SaveAs(Chemin_csv_output, XlFileFormat.xlCSV);//ceci écrit un fichier csv à l'adresse contenue dans Chemin_csv_output
                ws1.SaveAs(Chemin_csv_output, XlFileFormat.xlCSV);//ceci écrase le csv précédant et en écrit un autre.


je te propose d'écrire un fichier par csv, puis des les concaténer en un seul:
ws.SaveAs("temp1.csv", XlFileFormat.xlCSV);//ceci écrit un fichier csv temp1 dans le répertoire de l'appli
ws1.SaveAs("temp2.csv", XlFileFormat.xlCSV);//ceci écrase le csv temp2 dans le répertoire de l'appli


.....
string fichier1 = File.ReadAllText("temp1.csv");
string fichier2 = File.ReadAllText("temp2.csv");

File.WriteAllText(Chemin_csv_output,fichier1 + fichier2);



0
AkramIng Messages postés 12 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 23 juillet 2014
26 juin 2014 à 10:50
J'ai tester cette proposition mais elle m'affiche une exception IOException :
Pour le fichier temp2 m'affiche : le processus ne peut pas accéder au fichier 'temp2.Csv', car il est en cours d'utilisation par un autre processus.

Merci de me répondre
0
AkramIng Messages postés 12 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 23 juillet 2014
25 juin 2014 à 17:51
j'ai mis Tous les Using nécéssaire
using Microsoft.Office.Interop.Excel


Mais le problème c'est que la génération du CSV ça fonctionne pour un seul onglet excel (ws) mais ça marche pas pour les deux onglets (ws et ws1)en même temps.

Et moi, j'ai besoin de générer un seul CSv à partir de 5 onglets Excel (Je pense que conceptuellement il faut utiliser une liste d'onglets)
Mais Comment?

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
25 juin 2014 à 18:22
Je te confirme que ça ne marche pas c'est pourquoi je t'ai proposé une autre solution.
As tu au moins essayé?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
26 juin 2014 à 17:43
Édit de la modération, dépôt ici du message supprimer sur l'autre fil:

Je voulais savoir comment faire pour lire les deux fichiers simultanément,
NB: avec ce code, il m'affiche une exception de type IOException:
Le processus ne peut pas accéder au fichier "temp2.csv", car il est cours d'utilisation par un autre processus

ws.SaveAs("temp1.csv", XlFileFormat.xlCSV);
ws1.SaveAs("temp2.csv", XlFileFormat.xlCSV);


string fichier1 = File.ReadAllText("temp1.csv");
string fichier2 = File.ReadAllText("temp2.csv");//l'affichage de l'exception ce fait à ce niveau

File.WriteAllText(Chemin_csv_output,fichier1 + fichier2);



Merci
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
26 juin 2014 à 17:48
Bonsoir, c'est que le worksheet w2 et encore entrain de parler à temps2 au moment ou file.readallline essayé d'y accéder.

Il faut d'abord que tu libères le fichier, par exemple tu peux libérer la variable w2 si tu n'en plus besoin.
0
AkramIng Messages postés 12 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 23 juillet 2014
26 juin 2014 à 18:02
En fait , j'ai libérer les deux worksheet mais je pense que le problème arrive de la deuxième lecture du fichier CSV (temp2.csv")non pas du premier CSV(temp1.csv) donc normalement il faut je je libere le processus de lecture sur Streamreader du premier fichier (temp1.csv).

Mais ma question: c'est comment faire pour liberer le processus de lecture du premier fichier.

Merci
Akram
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
26 juin 2014 à 18:29
J'ai essayé ça avec deux csv de quelques lignes et pour moi ça fonctionne
        private void OuvreEtJointDeuxCsv()
        {
            string temp1 = File.ReadAllText("temp1.csv");
            string temp2 = File.ReadAllText("temp2.csv");

            File.WriteAllText("Concat.csv", temp1 + temp2);
        }


Peux tu tester avec tes csv déjà générés sans passer par l'export depuis excel?
Cela permettrait de valider (ou non) que ça ne vient pas de ReadAllText, mais bien de ws1.SaveAs("temp2.csv", XlFileFormat.xlCSV); qui a encore la main sur le fichier.

Parce que le texte de ton erreur est clairement quelqu'un se sert de temp2, donc moi je ne peux pas.
0
AkramIng Messages postés 12 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 23 juillet 2014
26 juin 2014 à 18:48
Oui, c'est bon le problème est résolu,

Le problème arrive d'excel,

Il faut fermer classeur Excel pour liberer le fichier CSV

 workbook.close();



Merci
0
Rejoignez-nous