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 Word et Styles


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut interop Word et Styles
    Bonjour à tous,

    Je me casse la tête sur le pilotage de word. Le sujet paraît pourtant assez simpliste :

    Je lit un treeview dans mon application et je copie le contenu des noeuds dans un document word en faisant correspondre un style en fonction du niveau du noeud.

    Pour chaque noeud, l'application cliente appelle la classe ExpertWord de mon assembly c#.

    Exemple d'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void JeuxEssaiStyle()
    		{
    			 InsereParagraphe("Chapitre 1", "Titre 1");
    			 InsereParagraphe("A-xxxxx", "Titre 2");
    			 InsereParagraphe("aaaaa 1", "Normal");
    			 InsereParagraphe("B-xxxxx", "Titre 2");
    			 InsereParagraphe("aaaaa 2", "Normal");
    			 InsereParagraphe("Chapitre 2", "Titre 1");
    			 InsereParagraphe("A-xxxxx", "Titre 2");
    			 InsereParagraphe("bbbb 1", "Normal");
    			 InsereParagraphe("B-xxxxx", "Titre 2");
    			 InsereParagraphe("bbbb 2", "Normal");
    		}
    La méthode InsereParagraphe

    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 InsereParagraphe(string MonText, string NomStyle)
    		{
     
    			object LeStyle =  NomStyle;
    			object oMissing = System.Reflection.Missing.Value;
    //			MessageBox.Show("InsertAfter", "InsereParagraphe", MessageBoxButtons.OK, MessageBoxIcon.Information);
    			_MaSelection.InsertAfter(MonText);
    //			MessageBox.Show("Set_Style " + NomStyle, "InsereParagraphe", MessageBoxButtons.OK, MessageBoxIcon.Information);
    			try
    			 {_MaSelection.set_Style(  ref LeStyle );
     
    			 }
    			catch (Exception E)
    			 {
    				MessageBox.Show(E.Message, "InsereParagraphe", MessageBoxButtons.OK, MessageBoxIcon.Error);
    			 }
     
    //             MessageBox.Show("InsertAfter LigneSuivante", "InsereParagraphe", MessageBoxButtons.OK, MessageBoxIcon.Information);
    			_MaSelection.InsertAfter("\n");
    		}

    A l'éxécution,

    #msg# Insert after
    Chapitre 1 est inséré
    #msg# Set_Style Titre1
    Chapitre 1 passe en titre 1
    #msg# insérer ligne suivante
    une nouvelle ligne en titre 1 est créé

    #msg# Insert After
    A-xxxxxx est inséré (le style est Titre 1)
    #msg# Set_Style Titre2
    Les 2 lignes de textes passent en Titre 2
    #msg# insérer ligne suivante
    une nouvelle ligne en titre 2 est créé

    #msg# Insert After
    aaaaa 1 est inséré (le style est Titre 2)
    #msg# Set_Style Titre2
    Les 3 lignes de textes passent en Normal

    etc ...


    Visiblement le problème vient de _MaSelection (de type Microsoft.Office.Interop.Word.Range) qui contient l'intégralité du texte envoyé.

    _MaSelection est inialisé lors de la recherche du signet par la méthode 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
    16
    17
    18
    19
    20
    21
    22
    23
    public bool AtteindreSignet(string NomSignet)
            {
                object Nom = (object)NomSignet;
     
                //récupére la liste de signets
                _MesSignets = _MonDocument.Bookmarks;
     
                //si le signet cherché existe
                if (_MesSignets.Exists(NomSignet))
                {
                    //on positionne le range sur le signet et la fonction retourne true
                    _MonSignet = _MesSignets.get_Item(ref Nom);
                    _MonSignet.Select();
    				_MaSelection = _MonSignet.Range;
                    return true;
                }
                else
                {
                    //Un message d'erreur est affiché, et la fonction retourne false
    				MessageBox.Show(string.Format("Le signet {0} n'existe pas dans le fichier.", NomSignet), "Insertion impossible", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return false;
                }
    		}
    Après l'ajout de la première ligne par InsereParagraphe, comment modifier _MaSelection pour que les lignes précédentes ne soit plus dedans ?

    Merci pour votre aide

  2. #2
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    Bon comme quoi par moment reposer ses problèmes ça aide, j'ai enfin trouvé la solution :

    Je met la solution, ca pourra peut être aider quelqu'un.

    à la suite de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _MaSelection.InsertAfter("\n");
    il suffit d'insérer ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	int Nbligne=1;
    			object what = (object) WdGoToItem.wdGoToLine;
    			object whitch = (object) WdGoToDirection.wdGoToNext;
    			object Numero = (object)Nbligne;
     
    			//Atteindre la ligne suivante
    			_MaSelection = _MaSelection.GoTo(ref what, ref whitch, ref Numero, ref M);

  3. #3
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    Ma solution était valable pour les titres, mais là je tombe sur un os.

    Quand la chaîne envoyée à la méthode InsereParagraphe contient des retours à la ligne, mon décalage d'une ligne me positionne à l'intérieur du texte que je viens d'insérer ...

    Forcément c'est pas terrible.

    Est-ce qu'il y a un moyen simple de positionner se positionner automatiquement à la fin du paquet qui a été envoyé ?

    Je carricature :

    _MaSelection = _Maselection.GoToFin



    @Edit :

    Visiblement _MaSelection.Start = _MaSelection.End; à l'air de fonctionner.

    Est-ce vraiment la bonne méthode ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2011
    Messages : 15
    Points : 25
    Points
    25
    Par défaut
    Bonjour RamDevTeam

    Il est difficile d'utiliser l'Interop de Word. Et je sais qu'il est facile d'ajouter le paragraphe et définir le style par Spire.Doc.
    Il y a 3 démo à ce sujet:
    • http://www.e-iceblue.com/Knowledgebase/Spire.Doc/Demos/Formating/Word-Text-for-C-VB.NET.html

    • http://www.e-iceblue.com/Knowledgebase/Spire.Doc/Demos/Formating/Word-Styles-for-C-VB.NET.html

    • http://www.e-iceblue.com/Knowledgebase/Spire.Doc/Demos/Formating/Word-indent-for-C-VB.NET.html

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Salut,
    moi j'utilise cette fonction pour ajouter du texte :
    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
     
     /// <summary>
            /// Insère un texte mis en forme après le range spécifié
            /// </summary>
            /// <param name="range">position</param>
            /// <param name="value">texte à insérer</param>
            /// <param name="text_color">couleur du texte à insérer</param>
            /// <param name="size">taille du texte à insérer</param>
            /// <param name="bold">gras (1)/ normal (0) pour le texte à insérer</param>
            /// <param name="italic">italique (1) / normal (0) pour le texte à insérer</param>
            /// <param name="alignment">alignement du paragraphe [0 gauche | 1 centré | 2 droite | 3 justifié ]</param>
            private void AddFormatedTextAfter(Range range, string value, WdColor text_color = WdColor.wdColorBlack, int size = 11, int bold = 0, int italic = 0, int alignment = 0)
            {
                object save_pos = range.End - 1;
                range.InsertAfter(value);
                object current_pos = range.End - 1;
                nvDoc.Range(save_pos, current_pos).Font.Color = text_color;
                nvDoc.Range(save_pos, current_pos).Font.Size = size;
                nvDoc.Range(save_pos, current_pos).Font.Bold = bold;
                nvDoc.Range(save_pos, current_pos).Font.Italic = italic;
     
                nvDoc.Range(save_pos, current_pos).ParagraphFormat.SpaceAfter = 1;
                switch (alignment)
                {
                    case 0:
                        nvDoc.Range(save_pos, current_pos).ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
                        break;
                    case 1:
                        nvDoc.Range(save_pos, current_pos).ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
                        break;
                    case 2:
                        nvDoc.Range(save_pos, current_pos).ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;
                        break;
                    case 3:
                        nvDoc.Range(save_pos, current_pos).ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
                        break;
                }
            }
    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AddFormatedTextAfter(oRng,"ligne 1",WdColor.wdColorOrange,11,1);
    AddFormatedTextAfter(oRng,"\n");
    AddFormatedTextAfter(oTable.Cell(oTable.Rows.Count, 1).Range, "ligne 2", WdColor.wdColorBlack, 11, 1);
    tu peux l'améliorer avec le Style que je n'ai pas mi

  6. #6
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    Merci pour vos réponses, çà donne des pistes d'amélioration.

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

Discussions similaires

  1. Recherche de Microsoft.Office.Interop.Word.dll
    Par MRosa dans le forum Framework .NET
    Réponses: 7
    Dernier message: 26/03/2015, 16h59
  2. Microsoft.Office.Interop.Word + Sharepoint + Usercontrol
    Par museman dans le forum SharePoint
    Réponses: 31
    Dernier message: 09/06/2009, 23h45
  3. Réponses: 5
    Dernier message: 07/01/2008, 20h25
  4. [Débutant] [interop Word] obtenir les noms des champs Fields
    Par TSalm dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 30/08/2007, 22h03
  5. Réponses: 10
    Dernier message: 19/07/2007, 12h38

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