2011-01-05 1 views

답변

7

는 여기에 대해가는 훨씬 짧은 방법 (VBA하지만 C#을 포팅 할 수 있습니다) :

public static List<ContentControl> GetAllContentControls(Document wordDocument) 
{ 
    if (null == wordDocument) 
    throw new ArgumentNullException("wordDocument"); 

    List<ContentControl> ccList = new List<ContentControl>(); 

    // The code below search content controls in all 
    // word document stories see http://word.mvps.org/faqs/customization/ReplaceAnywhere.htm 
    Range rangeStory; 
    foreach (Range range in wordDocument.StoryRanges) 
    { 
    rangeStory = range; 
    do 
    { 
     try 
     { 
     foreach (ContentControl cc in rangeStory .ContentControls) 
    { 
    ccList .Add(cc); 
    } 
     } 
     catch (COMException) { } 
     rangeStory = rangeStory.NextStoryRange; 

    } 
    while (rangeStory != null); 
    } 
    return ccList; 
} 

감사

: 여기
Sub GetCCs() 
    Dim d As Document 
    Set d = ActiveDocument 
    Dim cc As ContentControl 
    Dim sr As Range 
    Dim srs As StoryRanges 
    For Each sr In d.StoryRanges 
     For Each cc In sr.ContentControls 
      ''# do your thing 
     Next 
    Next 
End Sub 
-1

이 작업을 수행하는 올바른 방법입니다
+3

이렇게하면 _all_ 콘텐츠 컨트롤을 찾을 수 있다고 보장 할 수 없습니다. 내 테스트에서는 내 머리글의 텍스트 상자 안에 두 개의 콘텐트 컨트롤이 없습니다. –

4

예 Lars Holm, 맞습니다. 머리글과 바닥 글의 텍스트 상자 안의 콘텐츠 컨트롤이 누락되었습니다. 여기에 대한 완벽한 해결책은 다음과 같습니다.

/// <summary> 
/// Get all content controls contained in the document. 
/// </summary> 
/// <param name="wordDocument"></param> 
/// <returns></returns> 
public static List<ContentControl> GetAllContentControls(Document wordDocument) 
{ 
    if (null == wordDocument) 
     throw new ArgumentNullException("wordDocument"); 

    List<ContentControl> ccList = new List<ContentControl>(); 

    // The code below search content controls in all 
    // word document stories see http://word.mvps.org/faqs/customization/ReplaceAnywhere.htm 
    Range rangeStory; 
    foreach (Range range in wordDocument.StoryRanges) 
    { 
     rangeStory = range; 
     do 
     { 
      try 
      { 
       foreach (ContentControl cc in range.ContentControls) 
       { 
        ccList.Add(cc); 
       } 

       // Get the content controls in the shapes ranges 
       foreach (Shape shape in range.ShapeRange) 
       { 
        foreach (ContentControl cc in shape.TextFrame.TextRange.ContentControls) 
        { 
         ccList.Add(cc); 
        } 

       } 
      } 
      catch (COMException) { } 
      rangeStory = rangeStory.NextStoryRange; 

     } 
     while (rangeStory != null); 
    } 
    return ccList; 
} 

감사합니다.