Export de donnees Access vers Excel

ignoux Messages postés 3 Date d'inscription lundi 20 novembre 2006 Statut Membre Dernière intervention 23 novembre 2006 - 22 nov. 2006 à 16:14
seigneurdjire Messages postés 4 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 14 août 2014 - 27 sept. 2010 à 16:07
Bonjour à tous,
Je developpe actuellement une application en C#. Je developpe à l'aide de #develop. J'ai une classe export qui doit gerer des exports d'une base access vers un classeur excel. Aucune erreur de compilation... Seulement à l'enregistrement du fichier excel, ma message box intervient en me disant de verifier si excel est installé. Excel est installé version 2000.
Je vous met ma méthode d'export excel:
//---------------------------------------------------------------------------------------------------------
        // Export Excel
        //---------------------------------------------------------------------------------------------------------
        /**
         * Export des résultats dans un fichier Excel (.xls).
         * \param[in] fileName Chemin du fichier excel.
         * \param[in] p Patient pour lesquelles les données sont exportées.
         * \param[in] tabRes Tableau stockant tous les examens pour un patient.
         */
         
        public static void ExportExcel (string fileName, Patient p, Resultat[] tabRes)
        {
            if (File.Exists(fileName)) {
                MessageBox.Show("Le fichier spécifié existe déjà, veuillez choisir un autre nom.", "Export Impossible", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
               
           
            // TODO vérifier que le fichier n'est pas en lecture seule
            // TODO fermer le processus Excel à la fin
            //On copie le modèle de fichier situé dans le répertoire source
            string repertoireExecution = System.Windows.Forms.Application.ExecutablePath;
            File.Copy(repertoireExecution.Substring(0, repertoireExecution.LastIndexOf('\\'))
                      +"\" + "Modeles\\Modele_export.xls", fileName);
           
            object Missing = System.Reflection.Missing.Value;   
           
                //Application               
                Excel.Application xlApp;
            //Classeur qui regroupe les feuilles
            Excel._Workbook xlClasseur;
            //Feuille sur laquelle on travaille
            Excel._Worksheet xlFeuil1;
           
            try
            {
                //Création d'une nouvelle application excel
                xlApp = new Excel.Application();
                xlApp.Visible = false;//Pour ne pas affciher excel dans notre appli
                                    
                //Création d'un nouveau classeur excel
                xlClasseur = xlApp.Workbooks.Add(fileName);           
                //Accès au classeur excel si il existe
                xlClasseur = xlApp.Workbooks.Open(fileName,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing);
               
                //Accès aux feuilles du classeur
                //On accède à la feuille par son étiquette, ici Resultat
                Excel.Sheets xlFeuilles = xlClasseur.Sheets;
                xlFeuil1 = (Excel._Worksheet)xlFeuilles["Resultat"];             
               
                //---------------------------------------------------------------------------------------------------------
                // Tableaux concernant le patient
                //---------------------------------------------------------------------------------------------------------
                               
                // Pour chaque paramètre concernant le patient, différentes actions sont effectuées :
                //    - Accès à la cellule de la feuille dans laquelle on souhaite écrire
                //    - Accès au contenu de la cellule
                //    - Modification du contenu de la cellule   
                //
                                               
                //Nom
                Excel.Range rNom = xlFeuil1.get_Range("B9",Missing);           
                object cellNom = (object)rNom.Cells.Value ;       
                rNom.Cells.Value =p.nom;           
                           
                //Prénom
                Excel.Range rPrenom = xlFeuil1.get_Range("G9",Missing);           
                object cellPrenom = (object)rPrenom.Cells.Value ;       
                rPrenom.Cells.Value = p.prenom;
               
                //Numéro de dossier
                Excel.Range rNumDossier = xlFeuil1.get_Range("B10",Missing);           
                object cellNumDossier = (object)rNumDossier.Cells.Value ;       
                rNumDossier.Cells.Value = p.numDossier;
               
                //Sexe
                Excel.Range rSexe = xlFeuil1.get_Range("B11",Missing);           
                object cellSexe = (object)rSexe.Cells.Value ;       
                rSexe.Cells.Value = p.sexe;
               
                //Diagnostic
                Excel.Range rDiag = xlFeuil1.get_Range("G11",Missing);           
                object cellDiag = (object)rDiag.Cells.Value ;       
                rDiag.Cells.Value = p.diagnostic;
               
                //Date de naissance au format jj/mm/aaaa
                Excel.Range rDateNaissance = xlFeuil1.get_Range("B12",Missing);           
                object cellDN = (object)rDateNaissance.Cells.Value ;       
                rDateNaissance.Cells.Value = p.dateNaissance.Day+"/"+p.dateNaissance.Month+"/"+p.dateNaissance.Year;
               
                //---------------------------------------------------------------------------------------------------------
                // Insertion des lignes dans chaque tableau sous Excel
                //---------------------------------------------------------------------------------------------------------
               
                //On insère autant de lignes qu'il y a d'examens pour chaque tableau :
                //    - tableau concernant les Dates d'examen
                //    - tableau concernant les Résultats d'examens
                //    - tableau concernant les calculs
               
                for (int i=0; i< tabRes.Length; i++){   
                   
                    // Pour ces paramètres, différentes actions sont effectuées :
                    //    - Création d'une suite de cellules, en indiquant la plage de cellule à créer
                    //    - Insertion de cette ligne
                   
                    /******************************************/
                    /* Tableau concernant les commentaires  */
                    /******************************************/
                    //On indique la plage de cellules à insérer en fonction de l'interface du fichier Excel
                    Excel.Range rNewLine = xlFeuil1.get_Range("A16:M16",Missing);
                    rNewLine.Insert(XlDirection.xlDown);
                   
                    /******************************************/
                    /* Tableau concernant les Dates d'examen  */
                    /******************************************/
                    //On indique la plage de cellules à insérer en fonction de l'interface du fichier Excel
                    //et du nombre de résultats à insérer
                    Excel.Range rNewLine1 = xlFeuil1.get_Range("A"+(19+i+1)+":M"+(19+i+1),Missing);
                    rNewLine1.Insert(XlDirection.xlDown);
                   
                    /**********************************************/
                    /* Tableau concernant les Résultats d'examen  */
                    /**********************************************/
                    //On indique les cellules à insérer (par leur nom) en fontion de l'interface du fichier excel
                    //et du nombre de résultats à insérer
                    Excel.Range rNewLine2 = xlFeuil1.get_Range("A"+(22+i*2+2)+":M"+(22+i*2+2),Missing);
                    rNewLine2.Insert(XlDirection.xlDown);
                }
               
                //---------------------------------------------------------------------------------------------------------
                // Affichage des informations associées aux examens
                //---------------------------------------------------------------------------------------------------------
               
                //Affichage dans les lignes que l'on vient d'insérer
                //Affichage des informations relatives à l'examen
                //Pour chaque examen on écrit dans une nouvelle cellule en fonction de l'interface du fichier Excel
                //Exemple : pour l'examen 1, on écrit le nom de l'examen dans la cellule A16
                //            pour l'examen 2, on écrit le nom de l'examen dans la cellule A17
                //            etc.
                //Et ceci pour chaque information relative à l'examen
           
                //Parcours du tableau d'examens
                for (int i=0; i< tabRes.Length; i++){
                   
                    /********************/
                    /* Nom de l'examen  */
                    /********************/
                    //Apparaît dans quatres cellules différentes dans le fichier excel
                    //Chaque nom de test est écrit dans une certaine cellule en fonction du nombre d'examens associés au patient.
                    //1ère cellule : Pour le tableau concernant les commentaires
                    Excel.Range rTest = xlFeuil1.get_Range("A"+(16+i),Missing);
                    object cellTest = (object)rTest.Cells.Value ;       
                    rTest.Cells.Value = tabRes[i].nom;
                   
                    //2ème cellule : Pour le tableau concernant les dates d'examens
                    Excel.Range rTest1 = xlFeuil1.get_Range("A"+(19+tabRes.Length+i),Missing);
                    object cellTest1 = (object)rTest1.Cells.Value ;       
                    rTest1.Cells.Value = tabRes[i].nom;
                   
                    //3ème cellule : Pour le tableau concernant les résultats d'examens
                    //une première série de nom d'examen à déja été insérée auparavant,
                    //il faut donc en tenir compte pour l'insertion dans les bonnes cellules de la 2ème série
                    Excel.Range rTest2 = xlFeuil1.get_Range("A"+(22+(tabRes.Length*2)+i),Missing);
                    object cellTest2 = (object)rTest2.Cells.Value ;       
                    rTest2.Cells.Value = tabRes[i].nom;
                   
                    //4ème cellule : Pour le tableau concernant les calculs effectués par examen
                    //Idem ici, il faut tenir compte de l'insertion des deux séries de nom d'examen précédentes
                    Excel.Range rTest3 = xlFeuil1.get_Range("A"+(25+(tabRes.Length*3)+i),Missing);
                    object cellTest3 = (object)rTest3.Cells.Value ;       
                    rTest3.Cells.Value = tabRes[i].nom;   
                   
                    /*********************/
                    /*   Commentaires    */
                    /*********************/
                    Excel.Range rCommentaire = xlFeuil1.get_Range("B"+(16+i),Missing);
                    object cellC = (object)rCommentaire.Cells.Value ;       
                    rCommentaire.Cells.Value = tabRes[i].commentaires;
                   
                    /*********************/
                    /* Date de l'examen  */
                    /*********************/
                    Excel.Range rDateTest = xlFeuil1.get_Range("B"+(19+tabRes.Length+i),Missing);
                    object cellDT = (object)rDateTest.Cells.Value ;       
                    rDateTest.Cells.Value = tabRes[i].date.Day+"/"+tabRes[i].date.Month+"/"+tabRes[i].date.Year;           
                   
                    /******************************/
                    /* Nombre d'actions précoces  */
                    /******************************/
                    //Une première série d'informations a déja été insérée précédement,
                    //il faut donc en tenir compte ici
                    Excel.Range rNbTot = xlFeuil1.get_Range("B"+(22+(tabRes.Length*2)+i),Missing);
                    object cellNbTot = (object)rNbTot.Cells.Value ;       
                    rNbTot.Cells.Value = tabRes[i].nbTot;
               
                    /******************************/
                    /* Nombre d'actions tardives  */
                    /******************************/
                    //Une première série d'informations a déja été insérée précédement,
                    //il faut donc en tenir compte ici
                    Excel.Range rNbTard = xlFeuil1.get_Range("C"+(22+(tabRes.Length*2)+i),Missing);
                    object cellNbTard = (object)rNbTard.Cells.Value ;       
                    rNbTard.Cells.Value = tabRes[i].nbTard;
                   
                    /***********************************/
                    /* Statistiques sur les résultats  */
                    /***********************************/
                   
                    //MoyenneT
                    //Deux séries d'informations a déja été insérées précédement (parties Dates et Résultats),
                    //il faut donc en tenir compte ici
                    Excel.Range rMoyT = xlFeuil1.get_Range("B"+(25+(tabRes.Length*3)+i),Missing);
                    object cellMoyT = (object)rMoyT.Cells.Value ;       
                    rMoyT.Cells.Value = tabRes[i].MoyenneT().Seconds+"''"+tabRes[i].MoyenneT().Milliseconds;
                    //MédianeT
                    Excel.Range rMedT = xlFeuil1.get_Range("D"+(25+(tabRes.Length*3)+i),Missing);
                    object cellMedT = (object)rMedT.Cells.Value ;       
                    rMedT.Cells.Value = tabRes[i].MedianeT().Seconds+"''"+tabRes[i].MedianeT().Milliseconds;
                    //Ecart TypeT
                    Excel.Range rECT = xlFeuil1.get_Range("F"+(25+(tabRes.Length*3)+i),Missing);
                    object cellECT = (object)rECT.Cells.Value ;       
                    rECT.Cells.Value = tabRes[i].EcartTypeT().Seconds+"''"+tabRes[i].EcartTypeT().Milliseconds;
                    //Moyenne
                    Excel.Range rMoy = xlFeuil1.get_Range("H"+(25+(tabRes.Length*3)+i),Missing);
                    object cellMoy = (object)rMoy.Cells.Value ;       
                    rMoy.Cells.Value = tabRes[i].Moyenne().Seconds+"''"+tabRes[i].Moyenne().Milliseconds;
                    //Médiane
                    Excel.Range rMed = xlFeuil1.get_Range("J"+(25+(tabRes.Length*3)+i),Missing);
                    object cellMed = (object)rMed.Cells.Value ;       
                    rMed.Cells.Value = tabRes[i].MedianeT().Seconds+"''"+tabRes[i].MedianeT().Milliseconds;
                    //Ecart Type
                    Excel.Range rEC = xlFeuil1.get_Range("L"+(25+(tabRes.Length*3)+i),Missing);
                    object cellEC = (object)rEC.Cells.Value ;       
                    rEC.Cells.Value = tabRes[i].EcartType().Seconds+"''"+tabRes[i].EcartType().Milliseconds;
                                   
                    //Parcours des résultats pour un examen donné
                    for (int j=0; j<tabRes[i].tabResultat.Length; j++){                           
                                               
                        //Affichage des résultats de l'examen (temps)
                        Excel.Range rRes = xlFeuil1.get_Range(new String((char)(68+j),1)+(22+tabRes.Length*2+i),Missing);
                        object cellRes = (object)rRes.Cells.Value ;       
                        rRes.Cells.Value = tabRes[i].tabResultat[j].Seconds+"''"+tabRes[i].tabResultat[j].Milliseconds;       
                                                   
                    }
                }
                   
                //Enregistre les modifications des cellules
                xlClasseur.Save();
                   
                //On met fin au pilotage
                xlApp.Quit();
                xlApp = null;
                //Fermeture du classeur excel
                xlClasseur = null;
                //Fermeture de la feuille sur laquelle on a travaillé
                xlFeuil1 = null;
                xlFeuilles = null;
                //Arrêt du processus
                GC.Collect();
                   
                //Affichage d'un message assurant que les résultats ont bien été exportés
                MessageBox.Show("Votre fichier a bien été enregistré.", "Export réussi", MessageBoxButtons.OK, MessageBoxIcon.Information);
               
            }
           
            //Récupération des erreurs liées à l'export
            //Dans le cas où Excel n'est pas installé sur le poste ou si la version d'Excel utilisée n'est pas la bonne.
            catch (System.Runtime.InteropServices.COMException)
            {   
                MessageBox.Show( "Problème rencontré lors de l'utilisation d'Excel. Vérifiez qu'Excel Office 2000 est bien installé sur votre ordinateur", "Erreur", MessageBoxButtons.OK,MessageBoxIcon.Error );   
            }
                             
        }
    }
En gras, l'exception levée alors que excel est installé sur mon ordi.
Les données ne sont pas transferrées dans le classeur et en plus le classeur contient 66000 lignes!!
Si quelqu'un a une idée ... je suis perdu.
Merci
Cordialement
ignoux

1 réponse

seigneurdjire Messages postés 4 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 14 août 2014
27 sept. 2010 à 16:07
Salut j'ai le meme probleme d'export vers excel. Je developpe une application access dans laquelle on fait une recherche multi-criteres. Je veux pouvoir exporter le resultat dans un fichier excel dont je preciserai le nom. Quelqu'un peut m'aider? Merci
0
Rejoignez-nous