如何获取文档中所有内容控件的列表?

问题描述:

我正在使用互操作,我想获得包含在word文档中的所有内容控件的列表(正文,形状,页眉,页脚......)。这是正确的和最好的方法来做到这一点:如何获取文档中所有内容控件的列表?

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

    List<ContentControl> ccList = new List<ContentControl>(); ; 
    // Body cc 
    var inBodyCc = (from r in wordDocument.ContentControls.Cast<ContentControl>() 
      select r); 
    ccList.AddRange(inBodyCc); 

    // cc within shapes 
    foreach (Shape shape in wordDocument.Shapes) 
    { 
    if (shape.Type == Microsoft.Office.Core.MsoShapeType.msoTextBox) 
    { 
     ccList.AddRange(WordDocumentHelper.GetContentControlsInRange(shape.TextFrame.TextRange)); 
    } 
    } 

    // Get the list of cc in the story ranges : wdFirstPageHeaderStory, wdFirstPageFooterStory, wdTextFrameStory (textbox)... 
    foreach (Range range in wordDocument.StoryRanges) 
    { 
    ccList.AddRange(WordDocumentHelper.GetContentControlsInRange(range)); 
    } 
    return ccList; 
} 

public static List<ContentControl> GetContentControlsInRange(Range range) 
{ 
    if (null == range) 
    throw new ArgumentNullException("range"); 

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

    foreach (ContentControl cc in range.ContentControls) 
    { 
    returnValue.Add(cc); 
    } 

    return returnValue; 
} 

问候。

下面是绕了一个更短的方式(VBA,但可以移植到C#):

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 

这里是这样做的正确方法:

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; 
} 

问候

+3

这不能保证找到_all_内容控件。在我的测试中,它错过了我头文本框中的两个内容控件。 – 2011-08-11 08:08:48

是拉尔斯霍尔姆,你是对的,在页眉和页脚的文本框内的内容控件丢失,这里是完整的解决方案:

/// <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; 
} 

Regards