互操作:在c#中迭代Word文档的所有范围

本文关键字:文档 范围 Word 迭代 互操作 | 更新日期: 2023-09-27 18:14:16

我正在使用Com互操作的。net Framework 4.0项目上工作,我必须从Word文档中迭代文本的所有范围。基于这篇文章和这篇文章,我使用了以下代码。虽然在大多数情况下它可以正常工作,但当您有一组形状或在页眉或页脚内带有形状的画布时,会出现一些问题。在这些情况下,如果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 '类型的COM对象。__ComObject'到接口类型"Microsoft.Office.Interop.Word.Shape"。

互操作:在c#中迭代Word文档的所有范围

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

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