c# - Word Com 互操作 : Iterating all the ranges of a Word document in c#

标签 c# com-interop

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

    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 会引发异常:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Word.Shape'.

最佳答案

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

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

关于c# - Word Com 互操作 : Iterating all the ranges of a Word document in c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24909515/

相关文章:

.net - COM可调用包装程序和.NET对象生存期

c# - 带有 COM 互操作的 Resharper 提示 "Cannot access internal constructor"

c# - 根据集合中现有对象的属性,使用 LINQ 将对象插入集合中

c# - 远程服务器返回错误 : (500) Internal Server Error. GetRequest() C#

c# - 如果在使用 pdfbox.net 时使用 process.start 运行,IKVM 找不到提供程序

c# - 如何查找和替换文件中的文本

c# - 通过 COM 将 C++ 中的复杂对象传递给 C#

c# - C#中_bstr_t的等价物是什么

.Net Com Interop 创建实例缓慢

c# - 使用AudioRender设备作为AudioGraph UWP的输入