Word Com Interop:在c#中迭代Word文档的所有范围

时间:2014-07-23 11:40:20

标签: c# com-interop

我正在使用Com Interop处理.Net Framework 4.0项目,我必须使用Word文档中的文本迭代所有范围。我根据thisthis文章使用以下代码。虽然在大多数情况下它可以正常工作,但是当您有一组形状或在页眉或页脚内部具有形状的画布时会出现一些问题。在这些情况下,如果foreach循环是组/画布的形状,我无法访问其中的形状。

    private void IterateRanges()
    {
        foreach (Range range in _document.StoryRanges)
        {
            var currentRange = range;
            do
            {
                if (RangeStoryTypeIsHeaderOrFooter(currentRange) &&
                    CurrentRangeHaveShapeRanges(currentRange))
                {
                    foreach (Shape shape in currentRange.ShapeRange)
                    {
                        if (shape.TextFrame.HasText == 0)continue;

                        var finalRange = shape.TextFrame.TextRange;

                        DoSomething(finalRange);
                    }
                }
                else
                {
                    DoSomething(currentRange);
                }

                currentRange = currentRange.NextStoryRange;
            } while (currentRange != null);
        }
    }

    private bool RangeStoryTypeIsHeaderOrFooter(Range range)
    {
        return (range.StoryType == WdStoryType.wdEvenPagesHeaderStory ||
                range.StoryType == WdStoryType.wdPrimaryHeaderStory ||
                range.StoryType == WdStoryType.wdEvenPagesFooterStory ||
                range.StoryType == WdStoryType.wdPrimaryFooterStory ||
                range.StoryType == WdStoryType.wdFirstPageHeaderStory ||
                range.StoryType == WdStoryType.wdFirstPageFooterStory);
    }

    private bool CurrentRangeHaveShapeRanges(Range range)
    {
        return range.ShapeRange.Count > 0;
    }

我尝试使用CanvasItemsGroupItems属性但没有成功。他们的成员无权访问TextRange财产。

        foreach (dynamic groupShape in shape.GroupItems)
        {
            var textRange = groupShape.TextFrame.TextRange;
        }

此外,显式地将groupShape强制转换为Shape会引发异常:

  

无法转换类型为' System .__ ComObject'的COM对象。接口   键入' Microsoft.Office.Interop.Word.Shape'。

1 个答案:

答案 0 :(得分:0)

删除所有Bin和Obj文件夹。在项目中包含 Microsoft.Office.Interop.Word.dll 文件作为参考,以重新生成互操作相关的类。在某处定义 Shape 类,以便运行时访问它:

[GuidAttribute("000209A0-0000-0000-C000-000000000046")]
public interface Shape