2013-05-22 99 views
0

我正在爲MS Word開發C#插件。我可以抓住當前文檔中所有的字 - 這是類似的東西:如何從ms word文檔的當前可見頁面獲取單詞?

app = (Word._Application)Application; // Application object comes on addin's connection 
foreach(Word.Word word in app.Application.Words) 
{ 
    doSmth(word); 
} 

我的問題,是如何抓住所有的字不是從整個文檔,但與當前活動頁面(用於用戶可見的)?

換句話說,我需要定義app.Application.ActiveDocument的活動頁面/段落,並用「主動」詞語做一些事情。

回答

3

有趣的問題。 [查看更新內容]

單詞的對象模型並沒有真正的「頁面」對象,因爲在添加和刪除內容時文檔的分頁不斷變化(或更改字體大小,紙張大小等)。所以,沒有「ActiveDocument.Pages(1)」的東西。

更重要的是,沒有簡單的方法可以確定當前顯示的頁面。部分原因是,這是因爲用戶不一定一次只能看到一個頁面。他可能正在查看一頁的結尾,並且可能會顯示下一頁的開頭或幾頁,這取決於他的查看設置。

如果我可以讓問題稍微容易些,那麼也許我可以用一種可以幫助你的方式來回答問題。讓我將「當前活動(對用戶可見)頁面」重新定義爲選擇所在的頁面。 (實際上,由於選擇可以跨越多頁,因此我們將其定義爲「所選活動端的頁面」)。

我還會回答使用VBA,因爲在VBA立即窗口中使用VBA更容易,並且在需要時轉換爲C#(它畢竟是同一個對象模型)是微不足道的。

單詞的Selection對象的屬性爲Range,如果您只是想要所有選定的單詞,那麼這將是微不足道的(Selection.Words!)。但是,如果我們想要所有的單詞,那麼我們需要努力一點。

首先,讓我們來看看哪個頁面(開始)是選中的。對於這一點,我們可以使用信息的方法:

pageNumber = Selection.Information(wdActiveEndPageNumber) 

所以,現在我們知道了什麼頁面我們感興趣的是我們現在需要獲得一個Range對象,包括網頁上的所有文本。我們需要分兩步進行 - 首先找到該範圍的開始和結束。

要查找範圍的開始,我們可以使用Goto函數,該函數返回一個表示一個指定項的開始Range對象:

startOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber).Start 

範圍的端部是的任一個開始下頁(減去一個字符,但我們不要狡辯),或文檔的末尾(如果我們在最後一頁):

If pageNumber = ActiveDocument.Content.Information(wdNumberOfPagesInDocument) Then 
    endOfRange = ActiveDocument.Content.End 
Else 
    endOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber + 1).Start 
End If 

現在,我們可以構造一個Range對象涵蓋的所有文字頁面:

Set pageRange = ActiveDocument.Range(startOfRange, endOfRange) 

...並從那裏我們可以得到的話:

Set words = pageRange.Words 

下面是一個使用上述技術報告活動頁面上的單詞數短的VBA宏:

Sub Test() 

    Dim pageNumber As Integer 
    Dim startOfRange As Integer 
    Dim endOfRange As Integer 
    Dim pageRange As Range 

    pageNumber = Selection.Information(wdActiveEndPageNumber) 

    startOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber).Start 

    If pageNumber = ActiveDocument.Content.Information(wdNumberOfPagesInDocument) Then 
     endOfRange = ActiveDocument.Content.End 
    Else 
     endOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber + 1).Start 
    End If 

    Set pageRange = ActiveDocument.Range(startOfRange, endOfRange) 

    MsgBox pageRange.Words.Count 

End Sub 

UPDATE 好的,事實證明有一個更簡單的方法來做到這一點。 Word有一個「特殊書籤」,指向當前頁面上的文本,所以這將與上述所有代碼一樣:

words = ActiveDocument.Bookmarks("\page").Range.Words 
+0

謝謝!你真的幫助了我。只有一個備註 - 在C#中訪問「page」書籤的單詞看起來像 'Application.ActiveDocument.Bookmarks.get_Item(「\\ Page」)。Range.Words'。 – Baurzhan

+3

如果您使用的是最新版本的C#/ .NET,並且只是說'書籤[@「\ page」]',那麼您應該能夠避免'get_Item'方法。 –

相關問題