ignoux
Messages postés3Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention23 novembre 2006
-
22 nov. 2006 à 16:19
ignoux
Messages postés3Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention23 novembre 2006
-
23 nov. 2006 à 13:27
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
//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
MaxVen
Messages postés5Date d'inscriptionjeudi 23 novembre 2006StatutMembreDernière intervention28 décembre 2006 23 nov. 2006 à 10:29
Salut,
Tu es sûr que ton problème vient de "Problème rencontré lors de l'utilisation d'Excel. Vérifiez qu'Excel Office 2000 est bien installé sur votre ordinateur"?
Essaye de lancer ton programme en debug apres avoir mis ton try/catch en commentaire, tu pourra voir plus precisement d'ou vient l'erreur.
ignoux
Messages postés3Date d'inscriptionlundi 20 novembre 2006StatutMembreDernière intervention23 novembre 2006 23 nov. 2006 à 13:27
Salut MaxVen,
J'ai essayé ta réponse et cela m'a apporté une nouvelle info. En effet, à l'execution de l'export excel l'appli déclenche une erreur qui dit:
"Ancien format ou bibliotheque de types non valide ( exception de HRESULT)
JE vais me pencher sur cette nouvelle erreur.
Cordialement
PS merci pour ta réponse
Ignoux