区分Word文档中的目录

时间:2011-07-08 09:41:20

标签: vba ms-word fieldcodes

有没有人知道如何以编程方式迭代word文档,你可以判断一个段落是否构成了目录的一部分(或者实际上,是否构成了字段的一部分)。

我的理由是我有一个VB程序,它应该从文档中提取实质性文本的前几段 - 它是通过迭代Word.Paragraphs集合来实现的。我不希望结果包含目录或其他字段,我只想要人类会识别为标题,标题或普通文本段落的内容。但事实证明,如果有一个目录,那么不仅内容表本身而且内容表中的每一行都显示为Word.Paragraphs中的单独项目。我不想要这些,但是没有能够在Paragraph对象上找到任何可以让我区分的属性,所以忽略它们(我猜我需要解决方案也适用于其他字段类型,如表格当局的数字和表格,我还没有遇到,但我想可能会导致同样的问题)

3 个答案:

答案 0 :(得分:2)

这不能保证,但如果标准的Word样式被用于TOC(极有可能),并且如果没有人添加自己的样式前缀为" TOC"那么就可以了。这是一种粗略的方法,但可行。

Dim parCurrentParagraph As Paragraph

If Left(parCurrentParagraph.Format.Style.NameLocal, 3) = "TOC" Then

       '    Do something 

End If

答案 1 :(得分:1)

由于Word对象模型的局限性,我认为实现此目的的最佳方法是暂时删除TOC字段代码,遍历Word文档,然后重新插入TOC。在VBA中,它看起来像这样:

Dim doc As Document
Dim fld As Field
Dim rng As Range

Set doc = ActiveDocument

For Each fld In doc.Fields
    If fld.Type = wdFieldTOC Then
        fld.Select
        Selection.Collapse
        Set rng = Selection.Range 'capture place to re-insert TOC later
        fld.Cut
    End If
Next

迭代代码以提取段落然后

Selection.Range = rng
Selection.Paste

如果您使用.NET进行编码,则应该非常接近。此外,这应该适用于Word 2003及更早版本,但对于Word 2007/2010,TOC(取决于它的创建方式)有时会有一个类似于内容控件的区域,可能需要您编写其他检测和删除代码

答案 2 :(得分:0)

您可以为文档的每个部分创建自定义样式。

Custom styles in Word 2003 (not sure which version of Word you're using)

然后,在遍历段落集合时,您可以检查.Style属性,如果它等于您的TOCStyle,则安全地忽略它。

我相信同样的技术也适用于桌子。