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 :

Manipulation d'objets COM de WORD en DotNet


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 11
    Points
    11
    Par défaut Manipulation d'objets COM de WORD en DotNet
    Salut

    je travaille sur un programme C# qui inclu Word (automation).
    J'ai besoin de récupérer les propriétés caption et name des objets Word (textbox, bouton, ...) pour pouvoir travailler dessus.
    Malheureusement les objets de Word sont de type System.__COMObject et sont incompatibles avec les objets du DotNet (Object).

    Une idée ?
    Merci
    Thomas

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    ne peux tu les caster dans le type qui convient et qui est fourni par Word ?

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    salut

    et non le caste est impossible !

    Message d'erreur lors de l'essai de caste :

    Impossible d'effectuer un cast d'un objet COM de type 'System.__ComObject' en type de classe 'System.Windows.Forms.TextBox'. Les instances de types qui représentent des composants COM ne peuvent pas être castées en types différents représentant des composants COM ; toutefois, elles peuvent être castées en interfaces tant que le composant COM sous-jacent prend en charge les appels QueryInterface pour l'IID de l'interface.

    ca fait 3 jours que je rame !!!
    une autre idée ?
    merci
    Thomas

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Salut

    Aurais tu le code qui te permet de "récuperer" ces objets ?

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    d'abord je créé inlineshape

    Microsoft.Office.Interop.Word.InlineShape zone;

    puis je lui dit que je veux que ce soit une textbox

    object ControlName = "Forms.TextBox.1";

    ensuite je defini un range (en gros je lui donne l'endroit où je veux poser la textbox sur le document)

    object temp = MonDocWord.Application.Selection.Range.End;
    object Rang = MonDocWord.Range(ref temp, ref temp);

    et enfin j'ajoute le contrôle

    zone = MonDocWord.InlineShapes.AddOLEControl(ref ControlName, ref Rang);

    maintenant ce que je voudrais faire c'est atteindre la propriété name par exemple
    dans une macro word, on peut l'atteindre comme ça :

    zone.OLEFormat.Object.name = "nouveau_nom"

    et ça marche
    mais pas dans le code c# car la propriété name n'existe pas dans le context actuel, ou un truc de ce genre !

    et en faisant un caste du style :

    textbox zone2 = (textbox)zone;

    j'ai le message d'erreur que j'ai posté tout à l'heure

    merci pour ton aide
    Thomas

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    quand tu fais un AddOlecontrol, tu recuperes un Shape

    donc, tu peux faire Shape.Name pour en obtenir le nom

    Je pense que tu dois caster peut-etre en Shape et non en textbox

    Essayes

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  7. #7
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    sinon, tu as des fonctions pour ajouter des :

    Textbox (ShapeS.AddTextBox)
    Polyline (Shapes.AddPolyline)
    label, diagram, curve, etc... peut-etre devrais tu t'appuyer sur ces fonctions

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    avec le code suivant, tu devrais trouver ton bonheur

    1 form avec 2 boutons.. 1 pour créer le document , L'autre (le 2 pour le lire)

    et voila
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
                Object oMissing = System.Reflection.Missing.Value;
     
                //OBJECTS OF FALSE AND TRUE
     
                Object oTrue = true;
     
                Object oFalse = false;
     
                //CREATING OBJECTS OF WORD AND DOCUMENT
     
                Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
     
                Microsoft.Office.Interop.Word.Document oWordDoc = new Document();
     
     
                //MAKING THE APPLICATION VISIBLE
     
                oWord.Visible = true;
     
     
     
                //ADDING A NEW DOCUMENT TO THE APPLICATION
     
                oWordDoc = oWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
     
                Object oSaveAsFile = (Object)"C:\\SampleDoc.doc";
     
     
                Microsoft.Office.Interop.Word.Shape shape = oWordDoc.Shapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, 100, 100, 100, 100, ref oMissing);
                shape.Name = "nicolas";
     
     
                oWordDoc.SaveAs(ref oSaveAsFile, ref oMissing, ref oMissing, ref oMissing,
     
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
     
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
     
                    ref oMissing, ref oMissing);
     
                //CLOSING THE FILE
     
                oWordDoc.Close(ref oFalse, ref oMissing, ref oMissing);
     
     
                //QUITTING THE APPLICATION
     
                oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                Object oMissing = System.Reflection.Missing.Value;
     
                //OBJECTS OF FALSE AND TRUE
     
                Object oTrue = true;
     
                Object oFalse = false;
     
                //CREATING OBJECTS OF WORD AND DOCUMENT
     
                Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
     
                Microsoft.Office.Interop.Word.Document oWordDoc = new Document();
     
                object fileName = @"C:\\SampleDoc.doc";
     
                oWordDoc = oWord.Documents.Open(ref fileName, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing);
     
                //MAKING THE APPLICATION VISIBLE
     
                if (oWordDoc.Shapes.Count > 0)
                {
                    MessageBox.Show("This document has shapes");
                }
     
                for (int i = 0; i < oWordDoc.Shapes.Count; i++)
                {
                    object index = i+1;
                    Microsoft.Office.Interop.Word.Shape sh = oWordDoc.Shapes.get_Item(ref index);
                    MessageBox.Show(sh.Name.ToString());
                }
     
                oWord.Visible = true;
     
                oWordDoc.Close(ref oFalse, ref oMissing, ref oMissing);
     
     
                //QUITTING THE APPLICATION
     
                oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
            }
        }

    Ca te convient ?

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Merci

    Je teste et je te tiens au courant

    @+

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Et non, ça ne marche pas !
    Le shape est un objet dotnet (à priori) et je veux tout de même conserver un COMObject sur mon Word.
    Je te remercie pour ton aide.

    J'ai trouvé un moyen de contourner le problème :
    via c#, je pose un contentControl sur le word, puis dans l'évement contentControlAfterAdd, je détruit le contentControl et je pose ma textbox et ainsi j'accède à toutes ses propriétés via cette macro.

    Merci encore et @+

Discussions similaires

  1. Manipulation, d'objet word dans une feuille Excel
    Par lolo-tine dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/03/2013, 15h51
  2. [PHP 4] Problème édition Word avec objet COM en PHP4.4.x
    Par Yanis77 dans le forum Langage
    Réponses: 0
    Dernier message: 01/02/2012, 16h28
  3. Comment libérer proprement un objet COM en dotnet.
    Par sybaris dans le forum C++/CLI
    Réponses: 0
    Dernier message: 15/06/2009, 16h04
  4. [COM] Documentation fonctionnalités "objet COM" / word
    Par Finidrigoler dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/08/2006, 16h27
  5. [COM] Pilotage de Word à partir d'un objet COM
    Par Sangdrax1604 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 05/06/2006, 16h04

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