2010-08-18 40 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); 
      } 
     } 
相關問題