ignoux
Messages postés3Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention23 novembre 2006
-
22 nov. 2006 à 16:14
seigneurdjire
Messages postés4Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention14 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
//
//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;
/*********************/
/* 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 */
/***********************************/
//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
seigneurdjire
Messages postés4Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention14 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