coyotte Posté(e) le 3 mars 2010 Posté(e) le 3 mars 2010 Bonjour à tous, je vais tenter de vous expliquer simplement mon problème. Je tente de faire en C# une routine qui puise lire et écrire un fichier Excel. J'importe pour cela la référence "Microsoft.Office.Interop.Excel". Mais les objets Application, worbook, worksheet sont inutilisables, ils me renvoie systématiquement une erreur. Je me suis appercu que ces memes objet utilisés dans un projet "exe" fonctionnent très bien, mais plus du tout dans un projet "dll". Voila j'espère avoir été clair dans mon explication. Merci d'avance de vos réponses. http://www.carpetdiem.netPlugins pour AutoCAD
(gile) Posté(e) le 3 mars 2010 Posté(e) le 3 mars 2010 Salut, Un exemple de classe avec des méthode Open() et Close() à compléter pour la lecture ou l'écriture. Attention aux problèmes de compatibilité, le programme ne fonctionnera pas avec des versions de Excel plus ancienne que celle avec laquelle la dll a été compilée. public class ExcelReader { // Champs Excel private _Application m_Application; private int m_ProcessId; private _Workbook m_Workbook; private _Worksheet m_Worksheet; // Propriété public int ProcessId { get { return m_ProcessId; } } // Constructeur public ExcelReader() { m_ProcessId = -1; } // Méthodes // Ouvre le processus Excel et le fichier donné (surchargé) public void Open(string Filename) { this.Open(Filename, null); } public void Open(string filename, string WorksheetName) { Process[] ExcelProcessBefore = Process.GetProcessesByName("EXCEL"); m_Application = new ApplicationClass(); Process[] ExcelProcessAfter = Process.GetProcessesByName("EXCEL"); m_ProcessId = GetProcessId(ExcelProcessBefore, ExcelProcessAfter); m_Application.DisplayAlerts = false; m_Workbook = m_Application.Workbooks.Open( filename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); m_Worksheet = string.IsNullOrEmpty(WorksheetName) ? (_Worksheet)m_Workbook.ActiveSheet : GetWorksheet(WorksheetName); } // Ferme le processus Excel public void Close() { m_Worksheet = null; m_Workbook.Close(false, Type.Missing, Type.Missing); m_Workbook = null; m_Application.DisplayAlerts = true; m_Application.Quit(); m_Application = null; Process.GetProcessById(m_ProcessId).Kill(); m_ProcessId = -1; } // Retourne l'identifiant du processus présent dans le deuxième paramètre et absent du premier. private int GetProcessId(Process[] ExcelProcessBefore, Process[] ExcelProcessAfter) { bool isThisProcess = false; int result = -1; if (ExcelProcessBefore.Length == 0 && ExcelProcessAfter.Length == 1) result = ExcelProcessAfter[0].Id; else { foreach (Process processAfter in ExcelProcessAfter) { isThisProcess = true; foreach (Process processBefore in ExcelProcessBefore) { if (processAfter.Id == processBefore.Id) { isThisProcess = false; } } if (isThisProcess) result = processAfter.Id; } } return result; } // Retourne l'instance de la feuille donnée en paramètre, null si elle n'existe pas. private _Worksheet GetWorksheet(string worksheetName) { foreach (_Worksheet worksheet in m_Workbook.Worksheets) { if (worksheet.Name == worksheetName) return worksheet; } return null; } } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
coyotte Posté(e) le 3 mars 2010 Auteur Posté(e) le 3 mars 2010 Merci Gile comme toujours, une réponse rapide et pertinente ;) http://www.carpetdiem.netPlugins pour AutoCAD
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant