互操作:在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;
}
我尝试使用CanvasItems
和GroupItems
属性没有成功。它们的成员没有访问TextRange
属性的权限。
foreach (dynamic groupShape in shape.GroupItems)
{
var textRange = groupShape.TextFrame.TextRange;
}
同样,显式地将groupShape
强制转换为Shape会抛出一个异常:
无法强制转换'System '类型的COM对象。__ComObject'到接口类型"Microsoft.Office.Interop.Word.Shape"。
删除所有Bin和Obj文件夹。包括Microsoft.Office.Interop.Word.dll文件,作为项目中重新生成互操作相关类的参考。在某个地方定义Shape类,如下所示,以便运行时访问它:
[GuidAttribute("000209A0-0000-0000-C000-000000000046")]
public interface Shape