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

Windows Forms Discussion :

Découper un Word à partir de son sommaire


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    Points : 35
    Points
    35
    Par défaut Découper un Word à partir de son sommaire
    Bonjour,

    J'ai un fichier Word d'environ 200 pages qui contient une multitude de paraphe.
    Il y a un sommaire très complet. Je voudrais découper ce fichier Word en plein de fichier Word qui contiendrait chacun un paragraphe.
    Je m'explique:

    J'ai un fichier Word avec un sommaire du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Chapitre 1. Intro
    1.1. Root
    1.1.1. Root\Titre1
    1.1.1.1. Root\Titre1\01- Mon Menu
    1.1.1.1.1. Root\Titre1\01-Mon Menu\04 Mon Sous-Menu
    1.1.1.1.1.1. Root\Titre1\01-Mon Menu\04 Mon Sous-Menu\Test
    1.1.1.1.1.1.1. Root\Titre1\01-Mon Menu\04 Mon Sous-Menu\Test1	 
    1.1.1.1.1.1.2. Root\Titre1\01-Mon Menu\04 Mon Sous-Menu\Test2       
    1.1.1.1.1.1.3. Root\Titre1\01-Mon Menu\04 Mon Sous-Menu\Test3 
    Il faudrait découper le WORD pour récupérer la section Test1 et la mettre dans un autre fichier Word. Le même traitement devrait être fait pour Test2 et Test3.

    Il existe une API appellé DocX qui est excellente et super bien fait pour manipuler les fichier docx par C#. Mais malheureusement elle n'implémente pas cette possibilité et son framework ne semble pourvoir répondre à ce besoin.

    Donc le but est d'ouvrir le fichier Word, de repérer la section à extraire puis de créer un nouveau fichier Word. La dernière partie devrait se faire sans souci avec docX. Par contre pour la partie d'extraction, je n'ai aucune idée comment le faire.

    Est-ce que quelqu'un aurait une idée sur ce sujet ?
    Cela passe par une automation de Word dans VS2008 mais je ne vois pas comment naviguer dans le fichier. En Excel, je comprends avec les cellules comment le faire mais pas en Word.

    Y-a-t-il une bonne âme qui aurait une idée sur ce sujet ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Salut,

    si tu utilises l'Interop regarde du côté de Microsoft.Office.Interop.Word.Sections, je pense que tu peux récupérer ta section et la copier puis créer un nouveau document et la coller de cette manièrere :
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Mword = Microsoft.Office.Interop.Word;
     
    namespace monProjet
    {
        class Class1
        {
            public void extraireSection(string chemin,string destination , int numSection)
            {
                Mword.ApplicationClass app = new Microsoft.Office.Interop.Word.ApplicationClass();
                object fileName = chemin;
                object Missing = System.Reflection.Missing.Value;
                object f = true;
                app.Visible = true;
                Mword.Document Doc = app.Documents.Open(ref fileName, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing);
                Mword.Section section = Doc.Sections[numSection];
                s.Range.Copy();
                Mword.Document Doc2 = app.Documents.Add(ref Missing, ref Missing, ref Missing, ref Missing);
                Doc2.Range(0, 0).Paste();            
            }
        }
    }
    je n'est pas testé mais je pense que le principe est bon, bonne continuation.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    Points : 35
    Points
    35
    Par défaut
    Merci beaucoup pour cette piste.
    Je teste cela dans la journée.

    En fait cela ne fonctionne pas car ton code découpe suivant les sections Word or un type de paragraphe ne correspond pas à une section. Je découpe bien mon Word mais suivant les sections définis. Il faudrait les définir à la main ce que je ne veux pas car cela reviens à faire le traitement que je veux faire.
    J'ai chercher un peu dans cette direction mais je pense que sans un certain formalisme dans le fichier Word, je ne vais pas y arriver.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    ha ok désolé mais tu parlais de section donc je pensais que les sections étaient définies dans ton fichier Word ... ce qui n'est pas le cas, sinon il te reste plus qu'a bidouiller un peu pour rechercher tes paragraphes à partir de leur numéros.
    Pour cela utilise la methode Find.Execute().

    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
     
    object missing = System.Reflection.Missing.Value;
     
    object fileName = Parametres.Racine+@"word\" + matrice;
    Mword.Application w = = new Mword.Application();
    w.Visible = true;
    Mword.Document Doc = w.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
     
    w.Selection.Range.Application.ActiveDocument.Select();
    w.Selection.Find.ClearFormatting();
    w.Selection.Find.Text = "Chapitre1";
    if(w.Selection.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing))
    {
         Mword.Range rng;
         rng.Strat = w.Selection.Range.Start
         w.Selection.Range.Application.ActiveDocument.Select();
         w.Selection.Find.ClearFormatting();
         w.Selection.Find.Text = "1.1.1";
        if(w.Selection.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing))
        {
               rng.End= w.Selection.Range.Start;
               rng.Copy();
              //CREATION DU NOUVEAU DOCUMENT ET COLLAGE DU TEXTE
         }
    }
    cette exemple de code récupèrera de chapitre 1 jusqu'à 1.1.1 (non inclus).

    Voilà à part ce genre de bidouillage qui sera à adapter dans des boucles imbriquées je ne vois pas comment faire.

    Bonne continuation.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    Points : 35
    Points
    35
    Par défaut
    Merci mille fois hotsizzle
    Je vais essayer de me dépatouiller avec ce code.
    Merci pour l'effort de coding, j'apprécie. Je te tiens au courant si cela a fonctionné.

    Je viens de tester donc le principe fonctionne nickel. J'arrive à découper mon word suivant les balises que je veux (au fait c'est quoi MWord dans ton code ?). Cependant la commande rng.Copy(); ne copie que le text or il y a aussi des images dans mon Word que j'aurais aimé garder. Je creuse la piste. Merci pour tout

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Alors les images sont normalement dans la collection InlineShapes de ton range si mes souvenirs sont bons, mais je ne sais pas du tout comment les récupérer par la même occasion... regarde du côté de InlineShapes si tu trouves quelque chose.

    Pour ce qui est du Mword dans mon code c'est simplement une définition de la classe Microsoft.Office.Interop.Word, en effet pour ne pas avoir a retaper à chaque fois cette longue et fastidieuse instruction , je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    using Mword = Microsoft.Office.Interop.Word;
    Voilà si je trouves quelque chose pour les images je te tiens au courant.

    A bientôt.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Regarde également du coté de la collection Paragraphes de ton document, ca t'évitera peut être d'utiliser la méthode find. (je n'avais pas vu cette collection dsl)

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    Points : 35
    Points
    35
    Par défaut
    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
     
                object missing = System.Reflection.Missing.Value;
                object fileName = @"monDoc.docx";
                Microsoft.Office.Interop.Word.Application w = new Microsoft.Office.Interop.Word.Application();
                w.Visible = false;
                Microsoft.Office.Interop.Word.Document Doc = w.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
     
                w.Selection.Range.Application.ActiveDocument.Select();
                w.Selection.Find.Text = "mon Texte à trouvé";
     
                if(w.Selection.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing))
                {
                    Microsoft.Office.Interop.Word.Range rng = w.Selection.Range;
                    rng.Start = w.Selection.Range.Start;
                    w.Selection.Range.Application.ActiveDocument.Select();
                    w.Selection.Find.Text = @"mon texte de fin";
     
                    if(w.Selection.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing))
                    {
                        rng.End= w.Selection.Range.Start;
                        rng.Copy();
                        DataObject clipData = new DataObject(DataFormats.Rtf, Clipboard.GetData(DataFormats.Rtf));
     
                        // Attribuer le nom
                        object fileNameOut = @"MonDocdeSortie.doc";
     
                        Microsoft.Office.Interop.Word.Document nvDoc;
                        // Créer le document
                        nvDoc = w.Documents.Add(ref missing, ref missing, ref missing,
                                                    ref missing);
     
                        rng.Copy();
                        nvDoc.Content.Paste();
     
                        // Sauver le document
                        nvDoc.SaveAs(ref fileNameOut, ref missing, ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing, ref missing, ref missing,
                                    ref missing);
     
                        // Fermer le document
                        nvDoc.Close(ref missing, ref missing, ref missing);
     
                        // Fermeture de word
                        w.Quit(ref missing, ref missing, ref missing);
                     }
    Avec ce code j'arrive à remplir mon besoin.
    Donc je découpe le Word suivant les balises et je peux aussi copier les images
    Merci mille fois hotsizzle pour ton aide

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

Discussions similaires

  1. Arranger son sommaire sous word 2007
    Par bendesarts dans le forum Word
    Réponses: 3
    Dernier message: 07/12/2009, 07h24
  2. Trouver le jour de l'année à partir de son numéro
    Par Nounours666 dans le forum C++Builder
    Réponses: 7
    Dernier message: 09/01/2006, 13h20
  3. Réponses: 2
    Dernier message: 13/10/2004, 14h52
  4. Réponses: 3
    Dernier message: 24/09/2004, 21h21
  5. [VB.NET] Obtenir un Char a partir de son ASCII Decimal ...
    Par maitrebn dans le forum Windows Forms
    Réponses: 8
    Dernier message: 09/09/2004, 14h49

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