【问题标题】:Distinguishing Table of Contents in Word document区分 Word 文档中的目录
【发布时间】:2011-07-08 09:41:19
【问题描述】:

有谁知道在以编程方式遍历 word 文档时,如何判断段落是否构成目录的一部分(或者实际上是构成字段一部分的任何其他内容)。

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

【问题讨论】:

    标签: vba ms-word fieldcodes


    【解决方案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 取决于它的创建方式,有时它周围有一个类似内容控制的区域,可能需要您编写额外的检测和删除代码.

    【讨论】:

    • 谢谢,这正是我所需要的——我试过了,你的代码有效,让我可以很好地删除目录。实际上,我稍微简化了您的代码,因为我不打算保存文档,因此不需要选择范围以在最后恢复它 - 只需在我阅读后使用 SaveChanges:=False 关闭文档我需要的文字。
    【解决方案2】:

    这不能保证,但如果 TOC 使用标准 Word 样式(很有可能),并且如果没有人添加自己的样式并以“TOC”为前缀,则可以。这是一种粗略的方法,但可行。

    Dim parCurrentParagraph As Paragraph
    
    If Left(parCurrentParagraph.Format.Style.NameLocal, 3) = "TOC" Then
    
           '    Do something 
    
    End If
    

    【讨论】:

      【解决方案3】:

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

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

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

      我相信同样的技术也适用于表格。

      【讨论】:

      • 谢谢。但不幸的是,这个解决方案是不可能的,因为我无法控制 word 文档本身。我正在尝试从已经准备好的文档中提取信息,因此我必须使用其中已经存在的任何样式 - 这通常意味着标准 Word 样式。
      • 是否有任何一致的格式规则应用于 TOC?
      • 很遗憾,不,我正在处理的单词文档来自各种各样的来源,所以我不能依赖任何一致的格式规则。我基本上依靠样式来区分标题和标题等。我知道在文档样式不合适的情况下会偶尔产生不良结果-这是可以接受的。但是我可以使用一般原则来改进我想要的结果,并且能够区分段落是像目录这样的字段的一部分将是一个相当大的改进。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2013-06-06
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多