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

发布于 2024-10-10 07:49:59 字数 1379 浏览 7 评论 0原文

我正在使用互操作,我想获取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;
}

问候。

I am using interop and I want to get the list of all content controls contained in word document (in the body, shapes, header, footer..). Is this the correct and the best way to do this :

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

Regards.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

帅气称霸 2024-10-17 07:49:59

这是一种更简短的方法(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

Here's a much shorter way of going about it (VBA, but can be ported to 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
少女的英雄梦 2024-10-17 07:49:59

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

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

问候

Yes Lars Holm,you are right, the content controls inside text boxs in header and footer are missing , here is the complete solution for this:

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

故人的歌 2024-10-17 07:49:59

这是执行此操作的正确方法:

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

问候

Here is the correct way to do this :

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

Regards

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文