2010-08-18 6 views
2

Je souhaite traverser tous les éléments d'un document Word un par un et en fonction du type d'élément (en-tête, phrase, tableau, image, zone de texte, forme, etc.) Je souhaite traiter cet élément. J'ai essayé de rechercher n'importe quel énumérateur ou objet qui peut représenter des éléments de document dans l'API d'interopérabilité de bureau mais n'a pas réussi à en trouver. L'API offre des phrases, des paragraphes, des collections de formes mais ne fournit pas d'objet générique pouvant pointer vers l'élément suivant. Par exemple:Comment énumérer un document Word à l'aide de l'API Office Interop?

<header of document> 
<plain text sentences> 
<table with many rows,columns> 
<text box> 
<image> 
<footer> 

(S'il vous plaît imaginer comme un document Word) Alors


, maintenant je veux une recenseur qui va d'abord me donner <header of document>, puis sur la prochaine itération me donner <plain text sentences>, puis <table with many rows,columns> et ainsi de suite. Est-ce que quelqu'un sait comment nous pouvons y parvenir? C'est possible?

J'utilise C#, Visual Studio 2005 et Word 2003.

Merci beaucoup

Répondre

4

La raison pour laquelle vous ne disposez pas d'un itérateur simple est que les documents Word peuvent être beaucoup plus complexe que le simple structure décrite dans votre question. Par exemple, un document peut comporter plusieurs en-têtes et pieds de page pour la première page ainsi que des pages paires et impaires, contient plusieurs sections avec différentes configurations d'en-tête et de pied de page, contenir des notes de bas de page, des commentaires et des révisions. les tableaux, les zones de texte, les images et les formes peuvent apparaître en ligne avec du texte ou flottants. En bref, il n'y a pas de séquence fixe d'éléments.

Vous devez vérifier comment les documents d'entrée complexes vos sont et en fonction du résultat de cette analyse décider comment itérer sur les paragraphes et les images jointes et les formes etc.

+0

merci beaucoup pour expliquer. Donc, fondamentalement, nous ne pouvons pas énumérer les éléments du document. J'ai posé cette question parce que je suis confronté à un problème lors du traitement des tables de mots et des formes différentes. Parfois l'API de mot saute quelques mots du document et par conséquent mon programme échoue. En outre, l'API donne des phrases fausses comme si la phrase est «travaillé comme programmeur principal», puis je reçois «travaillé comme Sr.» comme une phrase et «programmeur» en second lieu.Il aurait dû être une seule phrase. Je veux éviter ce genre de problèmes. Il y a aussi beaucoup plus de problèmes avec l'API interop. – Shekhar

+0

@shekhar: Bien sûr, vous pouvez itérer sur le contenu, mais pas d'une manière simple. Word vous donne un accès complet à tous les objets. En ce qui concerne la segmentation des phrases, vous devez considérer que c'est un sujet de recherche pas si trivial dans le traitement du langage naturel. –

+0

Est-il possible d'itérer sur le contenu? Comment faire ça? – Shekhar

3

par exemple:

 // open the file 
     Word.ApplicationClass app = new Word.ApplicationClass(); 
     object path = @"c:\Users\name\Desktop\Весь набор.docx"; 
     object missing = System.Reflection.Missing.Value; 

     Word.Document doc = null; 
     try 
     { 
      doc = app.Documents.Open(ref path, 
       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); 

      // index 
      foreach (Word.Section section in doc.Sections) 
      { 
       Debug.WriteLine("Section index:" + section.Index); 
       Debug.WriteLine("section start: " + section.Range.Start + ", section end: " + section.Range.End); 

      } 


      bool processNextTable = false; 
      foreach (Word.Paragraph paragraph in doc.Paragraphs) 
      { 
       string toWrite = paragraph.Range.Text; 
       System.Diagnostics.Debug.WriteLine(toWrite); 
      } 

      foreach (Word.Table table in doc.Tables) 
      { 
       foreach (Word.Row wRow in table.Rows) 
        foreach (Word.Cell cell in wRow.Cells) 
        { 
        } 
      } 

     } 
     finally 
     { 
      if (doc != null) 
      { 
       bool saveChanges = false; // temporary not save any changes 
       app.Quit(ref saveChanges, ref missing, ref missing); 
      } 
     } 
Questions connexes