我正在使用Com Interop处理.Net Framework 4.0项目,我必须使用Word文档中的文本迭代所有范围。我根据this和this文章使用以下代码。虽然在大多数情况下它可以正常工作,但是当您有一组形状或在页眉或页脚内部具有形状的画布时会出现一些问题。在这些情况下,如果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 .__ ComObject'的COM对象。接口 键入' Microsoft.Office.Interop.Word.Shape'。
答案 0 :(得分:0)
删除所有Bin和Obj文件夹。在项目中包含 Microsoft.Office.Interop.Word.dll 文件作为参考,以重新生成互操作相关的类。在某处定义 Shape 类,以便运行时访问它:
[GuidAttribute("000209A0-0000-0000-C000-000000000046")]
public interface Shape