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

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

12 réponses

Répondre au sujet
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - Modifié par jordane45 le 25/06/2014 à 11:39
0
Utile
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
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 25 juin 2014 à 11:46
0
Utile
1
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();


Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 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
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 25 juin 2014 à 17:46
0
Utile
1
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);



AkramIng 12 Messages postés lundi 16 juin 2014Date d'inscription 23 juillet 2014 Dernière intervention - 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
AkramIng 12 Messages postés lundi 16 juin 2014Date d'inscription 23 juillet 2014 Dernière intervention - 25 juin 2014 à 17:51
0
Utile
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
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 25 juin 2014 à 18:22
0
Utile
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
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 26 juin 2014 à 17:43
0
Utile
É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
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 26 juin 2014 à 17:48
0
Utile
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
AkramIng 12 Messages postés lundi 16 juin 2014Date d'inscription 23 juillet 2014 Dernière intervention - 26 juin 2014 à 18:02
0
Utile
1
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
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 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
AkramIng 12 Messages postés lundi 16 juin 2014Date d'inscription 23 juillet 2014 Dernière intervention - 26 juin 2014 à 18:48
0
Utile
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.