Générer un CSV à partir plusieurs onglets excels [Résolu]

Messages postés
12
Date d'inscription
lundi 16 juin 2014
Dernière intervention
23 juillet 2014
- 25 juin 2014 à 11:33 - Dernière réponse :
Messages postés
12
Date d'inscription
lundi 16 juin 2014
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);
            }


Afficher la suite 

Votre réponse

12 réponses

Messages postés
23254
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2018
- Modifié par jordane45 le 25/06/2014 à 11:39
0
Merci
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.
.
Commenter la réponse de jordane45
Messages postés
23254
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2018
- 25 juin 2014 à 11:46
0
Merci
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();


Messages postés
12258
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 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.
Commenter la réponse de jordane45
Messages postés
12258
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 25 juin 2014 à 17:46
0
Merci
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);



Messages postés
12
Date d'inscription
lundi 16 juin 2014
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
Commenter la réponse de Whismeril
Messages postés
12
Date d'inscription
lundi 16 juin 2014
Dernière intervention
23 juillet 2014
- 25 juin 2014 à 17:51
0
Merci
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
Commenter la réponse de AkramIng
Messages postés
12258
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 25 juin 2014 à 18:22
0
Merci
Je te confirme que ça ne marche pas c'est pourquoi je t'ai proposé une autre solution.
As tu au moins essayé?
Commenter la réponse de Whismeril
Messages postés
12258
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 26 juin 2014 à 17:43
0
Merci
É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
Commenter la réponse de Whismeril
Messages postés
12258
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 26 juin 2014 à 17:48
0
Merci
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.
Commenter la réponse de Whismeril
Messages postés
12
Date d'inscription
lundi 16 juin 2014
Dernière intervention
23 juillet 2014
- 26 juin 2014 à 18:02
0
Merci
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
Messages postés
12258
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2018
- 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.
Commenter la réponse de AkramIng
Messages postés
12
Date d'inscription
lundi 16 juin 2014
Dernière intervention
23 juillet 2014
- 26 juin 2014 à 18:48
0
Merci
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
Commenter la réponse de AkramIng

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.