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

C# Discussion :

Interopérabilité Word/Excel et COMException


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut Interopérabilité Word/Excel et COMException
    Bonjour CSharpers

    Voici mon problème. Je veux lire un document Word pour récupérer certaines informations. Pour ce faire, j'utilise l'interopérabilité. Je teste, Ok, ça marche.
    Maintenant, je veux pouvoir utiliser ces données récupérées pour écrire un fichier Excel, toujours avec l'interopérabilité. Voici le code de la classe principale:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using StudyPlanReader;
    using DmpkFilesGenerator;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string cwd = @"C:\Documents and Settings\gldavid\Desktop";
                string file = @"C:\Documents and Settings\gldavid\My Documents\Documents\MyDoc.doc";;
                StudyPlanParser target = new StudyPlanParser(file);
                try
                {
                    Console.WriteLine("Reading Word");
                    target.Open();
                    target.Parse();
                    string sn = target.StudyNumber;
                    List<String>clots = target.CompoundLots;
                    target.Close();
                    Console.WriteLine("Creating Excel");
                    CalculationsSummaryCreator csc = new CalculationsSummaryCreator(sn, clots, cwd);
                    csc.CreateFile();
                    Console.WriteLine("OK...");
                    Console.ReadKey();
                }
                catch (Exception e)
                {
                    target.Close();
                    Console.WriteLine("{0}", e.Message);
                    Console.WriteLine("{0}", e.Source);
                    Console.WriteLine("{0}", e.StackTrace);
                    Console.WriteLine("...");
                    Console.ReadKey();
                }
            }
        }
    }
    Le problème est qu'en cours d'exécution, j'ai l'erreur suivante:
    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
     
    System.Runtime.InteropServices.COMException was unhandled
      Message=The remote procedure call failed and did not execute. (Exception from HRESULT: 0x800706BF)
      Source=StudyPlanReader
      ErrorCode=-2147467259
      StackTrace:
           at StudyPlanReader.AWordReader.Close() in C:\Documents and Settings\dbourgais\my documents\visual studio 2010\Projects\DmpkExcelCalculationsLib\StudyPlanReader\AWordReader.cs:line 74
           at ConsoleApplication1.Program.Main(String[] args) in C:\Documents and Settings\dbourgais\my documents\visual studio 2010\Projects\DmpkExcelCalculationsLib\ConsoleApplication1\Program.cs:line 33
           at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ThreadHelper.ThreadStart()
      InnerException:
    J'ai oublié quelque chose ?
    Merci d'avance de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Peut etre qu'il faudrait mettre le code de target.Close();
    A priori si celui-ci pose problème, tu le rappelles dans le catch, et à ce moment là il ne sera plus catch!

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Bonjour

    Voici le code mon catch:
    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
    18
    19
     
    public void Close()
            {
                try
                {
                    if (this.document != null)
                    {
                        this.document.Close(missing, missing, missing);
                    }
                    if (this.word != null)
                    {
                        this.word.Quit(missing, missing, missing);
                    }
                }
                catch (Exception e)
                {
                    throw new IOException(e.Message);
                }
            }
    J'ai "résolu" mon problème de la manière suivante toutefois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Console.WriteLine("Reading Word");
                    target.Open();
                    target.Parse();
                    string sn = target.StudyNumber;
                    List<String>clots = target.CompoundLots;
                    target.Close();
                    Thread.Sleep(1000);
                    Console.WriteLine("Creating Excel");
                    CalculationsSummaryCreator csc = new CalculationsSummaryCreator(sn, clots, cwd);
                    csc.CreateFile();
                    Thread.Sleep(1000);
                    Console.WriteLine("OK...");
                    Console.ReadKey();
    Bon, franchement, j'aime pas mettre des Sleep dans mon code...
    Si quelqu'un a une solution plus raffinée, je prends volontiers,

    Merci,

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    On ne connais pas les types de document et word, je suppose que document c'est un workbook et word est excel ?

    Je connais pas trop mais souvent ce que je vois c'est ca :
    Marshal.FinalReleaseComObject(document);
    apres le close( et aussi apres le quit).
    Regarde si ca change quelque chose!

  5. #5
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    Le code de la méthode Close est l'effet, cela produit l'erreur, mais ce qu'il faut connaître pour comprendre c'est le code de la classe StudyPlanParser .

    GLDavid : ça fait du bien d'entendre que les Thread.Sleep sont moche, car c'est le cas. Beaucoup de gens se satisfont de ce genre de solutions. J'aime cette démarche.

  6. #6
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Bonjour à tous

    Merci de vos réponses. De mon côté, j'ai décidé d'attraper le COMException...et de ne rien en faire:
    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
    18
    19
    20
     
            public void Close()
            {
                try
                {
                    if (this.document != null)
                    {
                        this.document.Close(missing, missing, missing);
                    }
                    if (this.word != null)
                    {
                        this.word.Quit(missing, missing, missing);
                    }
                }
                catch (COMException) { }
                catch (Exception e)
                {
                    throw new IOException(e.Message);
                }
            }
    J'enlève mes Thread.Sleep.
    A l'exécution, OK, ça marche.
    Néanmoins, je me demande si c'est la bonne procédure à suivre.
    Qu'en pensez-vous ?

    Merci d'avance,

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

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

Discussions similaires

  1. VBA Word / Excel
    Par forsay1 dans le forum VBA Word
    Réponses: 3
    Dernier message: 29/12/2005, 16h48
  2. VBA Word / Excel
    Par forsay1 dans le forum VBA Word
    Réponses: 6
    Dernier message: 28/12/2005, 15h39
  3. VBA WORD / Excel
    Par forsay1 dans le forum VBA Word
    Réponses: 7
    Dernier message: 23/12/2005, 14h14
  4. VBA WORD / EXCEL
    Par forsay1 dans le forum VBA Word
    Réponses: 2
    Dernier message: 22/12/2005, 09h58
  5. Export d'etat ACCESS vers WORD/EXCEL : pb de mise en forme
    Par leguminator dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2005, 11h03

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