2010-08-18 38 views
2

我想遍历一个word文档的所有元素,并根据元素的类型(标题,句子,表格,图像,文本框,形状等)来处理该元素。我试图搜索任何可以代表办公室interop API中的文档元素的枚举器或对象,但未能找到任何。 API提供句子,段落,形状集合,但不提供可指向下一个元素的通用对象。 例如:如何使用Office Interop API枚举Word文档?

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

(请把它想象成一个word文档)


所以,现在我想一些普查员将首先给我<header of document>,然后在下一次迭代给我<plain text sentences>,然后<table with many rows,columns>等。 有谁知道我们如何才能做到这一点?可能吗?

我使用C#,Visual Studio 2005和Word 2003中

非常感谢

回答

4

,你没有简单的迭代器的原因是,Word文档可以远远比简单更复杂结构在您的问题中概述。

例如,一个文档可能有多个页眉和页脚以及第一页,偶数页和奇数页,包含多个不同页眉和页脚设置的部分,包含脚注,注释和修订以及诸如表格,文本框,图像和形状可以内联文本或浮动显示。总之,没有固定的元素序列。

你必须检查你的输入文档的复杂程度,并基于该分析结果决定如何遍历段落和附加的图像和形状等

+0

感谢很多解释。 所以基本上我们不能枚举文档元素。我问这个问题是因为我在处理单词表和不同形状时遇到问题。有时候,word API会从文档中跳过一些单词,从而导致我的程序失败。此外,API会给出错误的句子,如果句子是“作为高级程序员”,那么我会得到“工作为高级”。作为一个句子,'程序员'作为第二个。它应该是单个句子。我想避免这些问题。另外还有更多的interop API问题。 – Shekhar 2010-08-18 12:45:02

+0

@shekhar:当然你可以遍历内容,但不能以简单的方式。 Word可让您完全访问所有对象。关于句子分割,你需要考虑到这在自然语言处理中并不是一个微不足道的研究课题。 – 2010-08-18 12:49:57

+0

是否可以迭代内容?怎么做? – Shekhar 2010-08-18 12:52:35

3

例如:

 // 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); 
      } 
     } 
相关问题