IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

[Excel] Probleme avec Excel.Application


Sujet :

Dotnet

  1. #1
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut [Excel] Probleme avec Excel.Application
    Bonjour a tous.

    Je suis actuellement en train de me battre pour debugguer une appli qui a ete faite il y a un deja quelques temps.

    Le morceau qui me pose un souci est celui-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    this.monApp = new ApplicationClass();
    // [...]
    object o = this.monApp.Run(nom, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14, obj15, obj16, obj17, obj18, obj19, obj20, obj21, obj22, obj23, obj24, obj25, obj26, obj27, obj28, obj29, obj30, obj31);
    this.monApp s'initialise sans erreur, et les parametres passes a la methode Run sont coherents.

    Je ne suis pas familier du tout de l'utilisation des feuilles Excel en .NET, et je n'arrive donc pas a voir pourquoi ca coince ici.

    Aucune exception n'est levee, aucune erreur visible d'aucune sorte.
    C'est juste que o vaut null apres l'appel a la methode.
    Du coup toute la suite du programme se vautre lamentablement.

    Est ce que quelqu'un saurait d'ou peut venir cette erreur, ou dans quelle direction je dois chercher pour trouver pourquoi ca coince ?

    D'avance merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    La méthode Run permet d'exécuter une macro dans Excel.
    Le premier paramètre est le nom de la macro à éxécuter : dans ton cas, le contenu de la variable "nom".
    Les autres paramètres sont les paramètres utilisés par la macro.

    Si cette macro n'existe pas dans ton fichier piloté, il y a de grandes chances que le résultat soit null.

  3. #3
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Skalp Voir le message
    La méthode Run permet d'exécuter une macro dans Excel.
    Le premier paramètre est le nom de la macro à éxécuter : dans ton cas, le contenu de la variable "nom".
    Les autres paramètres sont les paramètres utilisés par la macro.

    Si cette macro n'existe pas dans ton fichier piloté, il y a de grandes chances que le résultat soit null.
    Ok je vois.

    Comment je peux faire pour avoir le nom de ce fichier ? Ou pour tester si la macro existe ?
    Est-ce que je peux le recuperer directement a partir de l'objet ou est ce que je dois chercher un appel a une methode precise plus haut dans le code ?

    (Ces questions peuvent sembler etrange, mais le code est relativement crade et je connais pas du tout l'utilisation des macros en .NET... donc je suis completement perdu.)

  4. #4
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Entre : this.monApp = new ApplicationClass(); et object o = this.monApp.Run(...);
    Tu dois chercher l'appel à la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.monApp.Workbooks.Open(...);
    Le premier paramètre de la méthode Open est le nom du fichier.

  5. #5
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Entre : this.monApp = new ApplicationClass(); et object o = this.monApp.Run(...);
    Tu dois chercher l'appel à la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.monApp.Workbooks.Open(...);
    Le premier paramètre de la méthode Open est le nom du fichier.
    Ok. alors j'ai trouve ca d'interessant entre les deux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    this.monApp = new ApplicationClass();
    Workbooks o = this.monApp.Workbooks;
    this.monWorkbook = o.Open(tmpFile, 3, true, 5, "", "", true,   XlPlatform.xlWindows, "", true, false, 0, false);
    File.Delete(tmpFile);
    Marshal.ReleaseComObject(o);
    o = null;
    Sachant que tmpFile est un chemin vers un fichier temporaire du genre "C:\\WINDOWS\\TEMP\\tmp2.tmp".

    Personnellement, j'ai du mal a voir l'utilite de ce code... Ca fait un petit moment que je me bas avec.

  6. #6
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par Jack_serious Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    this.monApp = new ApplicationClass();
    Workbooks o = this.monApp.Workbooks;
    this.monWorkbook = o.Open(tmpFile, 3, true, 5, "", "", true,   XlPlatform.xlWindows, "", true, false, 0, false);
    File.Delete(tmpFile);
    Marshal.ReleaseComObject(o);
    o = null;

    Il n'y a rien entre o.Open(tmpFile) et File.Delete(tmpFile) ???
    D'après ce que je vois, le code ouvre le fichier... et le supprime juste après !

    Normalement, tu devrais avoir une erreur dès le File.Delete(tmpFile) !
    En tous cas, je comprend mieux pourquoi this.monApp.Run(...) ne te renvoie rien !

    Voilà ce que je te propose :
    1. Essayer de retrouver le fichier indiqué dans tmpFile. Tu pourras voir à quoi il ressemble.
    2. Commenter la ligne File.Delete(tmpFile);, ça ira certainement mieux !

  7. #7
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Skalp

    Il n'y a rien entre o.Open(tmpFile) et File.Delete(tmpFile) ???
    Niet. Je t'ai donne le code tel quel.

    Citation Envoyé par Skalp
    D'après ce que je vois, le code ouvre le fichier... et le supprime juste après !

    Normalement, tu devrais avoir une erreur dès le File.Delete(tmpFile) !
    En tous cas, je comprend mieux pourquoi this.monApp.Run(...) ne te renvoie rien !
    Je savais bien que j'etais pas fou.

    En fait il s'agit de code desassemble a grand coup de reflector.
    Debugguer du code desassemble c'est assez funky.

    Citation Envoyé par Skalp
    Voilà ce que je te propose :
    1. Essayer de retrouver le fichier indiqué dans tmpFile. Tu pourras voir à quoi il ressemble.
    2. Commenter la ligne File.Delete(tmpFile);, ça ira certainement mieux !
    Alors le fichier tmpFile est un beau fichier Excel, avec plein de choses dedans.
    Exactement le type de donnees que l'application est "sensee" traiter et renvoyer si elle marchait.

    En virant le Delete ca ne marche pas mieux.

    Bon je donne un poil plus de code des fois que ca vienne de plus haut.

    On a un constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            public MyObject(string userId, string dataPath)
            {
                this.excelWrapper = new ExcelWrapper();
                this.abstracter.OpenExcel();
                string[] strArray = this.abstracter.Run("Initialize", new object[] { dataPath, userId }).ToString().Split(new char[] { ',' });
                // [CODE NON EXECUTE]
            }
    Le code de la methode Open:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            public void OpenExcel()
            {
                this.monApp = new ApplicationClass();
                Workbooks o = this.monApp.Workbooks;
                this.monWorkbook = o.Open(base.ExcelSheetPath, 3, true, 5, "", "", true, XlPlatform.xlWindows, "", true, false, 0, false);
                File.Delete(base.ExcelSheetPath);
                Marshal.ReleaseComObject(o);
                o = null;
            }
    Et le code de la methode Run:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
            public object Run(string nom, params object[] parameters)
            {
                log.Debug("Wll run Excel Application.");
                object obj2 = Missing.Value;
                object obj3 = Missing.Value;
                object obj4 = Missing.Value;
    // Test et initialisation pour la 20aine de parametres... 
    // [...] [...]
                object o = this.monApp.Run(nom, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14, obj15, obj16, obj17, obj18, obj19, obj20, obj21, obj22, obj23, obj24, obj25, obj26, obj27, obj28, obj29, obj30, obj31);
                if ((o != null) && Marshal.IsComObject(o))
                {
                    Marshal.ReleaseComObject(o);
                    o = null;
                }
                return o;
            }
    Voila.

    Et le code apres l'appel a Run n'est pas appele. Donc c'est bien la que ca pete.
    Desole pour la tronche du code, c'est du genere que j'ai arrange comme j'ai pu mais j'ai pas encore recode les morceaux que je n'ai pas integralement compris. Dont celui la...

    Merci de m'aider sur ce coup en tout cas...

  8. #8
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Bon, pour le pilotage Excel, tu peux déjà prendre connaissance de cet article, il t'aidera à mieux comprendre comment piloter Excel : Pilotage de l'application Office Excel (Excel Automation)

    Ca a l'air d'un truc assez costaud que tu as désassemblé là, on dirait qu'il y a toute une classe d'encapsulation de pilotage Excel.
    Sans plus de code, je ne vois pas à quoi correspondent certaines variables. Mais si tu veux bien, tu peux m'envoyer quelques-uns de ces fichiers, je pourrais ptet te faire un dégrossissage, ça me ferait marrer.

  9. #9
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Bon, pour le pilotage Excel, tu peux déjà prendre connaissance de cet article, il t'aidera à mieux comprendre comment piloter Excel : Pilotage de l'application Office Excel (Excel Automation)

    Ca a l'air d'un truc assez costaud que tu as désassemblé là, on dirait qu'il y a toute une classe d'encapsulation de pilotage Excel.
    Sans plus de code, je ne vois pas à quoi correspondent certaines variables. Mais si tu veux bien, tu peux m'envoyer quelques-uns de ces fichiers, je pourrais ptet te faire un dégrossissage, ça me ferait marrer.
    Merci pour le lien sur ton article. Je l'avais deja trouve en fait . Les codes C# pour ce genre de chose ne courent pas les rues.

    C'est en effet un truc assez costaud. Et la partie Excel c'est que la partie emergee du bouzin.

    Pour cette partie la c'est en effet une classe d'encapsulation de pilotage Excel, qui est sensee marcher avec plusieurs versions. La c'est la partie Excel 2000 qui me pose des problemes.

    Bon je te fais un paquet cadeau pour que tu puisse jeter un oeil.

  10. #10
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Bon...

    En fait suite a une installation de Office 2000 apres une desinstallation de Office XP j'avais explose quelque chose. Je ne sais pas exactement quoi, mais ca aidait le bouzin a marcher.

    Donc en installant l'application sur un systeme vierge, tout marche a merveille.

    Il reste donc a rajouter des tests dans l'application pour eviter que ca ne se reproduise.
    Merci pour le coup de main en tout cas, ce fut instructif.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Excel] Probleme avec la fonction SUM
    Par lidouka dans le forum Excel
    Réponses: 2
    Dernier message: 06/03/2007, 13h09
  2. Réponses: 3
    Dernier message: 04/12/2006, 13h41
  3. VBA EXCEL : Probleme avec On Error
    Par izalec dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 10h23
  4. Extraction fichier Excel - Probleme avec les VbCrLf
    Par oromeyer dans le forum Modules
    Réponses: 3
    Dernier message: 16/02/2006, 19h06
  5. problème avec Excel
    Par LE NEINDRE dans le forum Modules
    Réponses: 3
    Dernier message: 08/02/2006, 23h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo