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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    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 chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    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
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    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 chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    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
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    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 chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    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.

+ 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