【问题标题】:Word Interop (COM) Style LanguageID not workingWord 互操作 (COM) 样式 LanguageID 不起作用
【发布时间】:2020-02-10 23:25:58
【问题描述】:

我有各种具有某些样式且 Style.LanguageID 不正确的文档。 我有一些代码应该遍历文档中的所有样式并将每个 LanguageID 设置为 EnglishUK。

已解决:

        oWord = CreateObject("Word.Application")
        If oWord IsNot Nothing Then
            oWord.Visible = False
            If oWord.Documents IsNot Nothing Then
                Try
                    oDocument = oWord.Documents.Open(strFilePath)
                Catch ex As Exception
                    iCouldntOpen += 1
                    bFailedToOpen = True
                End Try
                If Not bFailedToOpen Then
                    If oDocument IsNot Nothing Then
                        If oDocument.ReadOnly Then
                            iReadonly += 1
                        ElseIf oDocument.HasPassword Then
                            iPassword += 1
                        Else
                            For Each s As Style In oDocument.Styles
                              s.LanguageID = WdLanguageID.wdEnglishUK
                            Next

                            ' save the document
                            oDocument.Save()
                        End If

                        ' close the document
                        oDocument.Close()
                        oDocument = Nothing
                    End If
                    oWord.Quit()
                    oWord = Nothing

                    bFailedToOpen = False
                End If
            Else
                iUnknown += 1
            End If
        Else
            iUnknown += 1
        End If

【问题讨论】:

  • 能否请您再次检查您发布的错误消息?这没有任何意义(= 的右侧是什么)......另外,我怀疑Style.Count 除了错误之外返回任何东西;你的意思是oDocument.Styles.Count?那返回什么? s.NameLocal 有效吗?
  • 抱歉,我的意思是 oDocument.Styles.Count。 s.NameLocal 确实返回样式名称。错误实际上是“该属性在该对象上不可用。”
  • 所以,它适用于某些样式,但不是全部。某些样式没有 LanguageID 吗?如果是这样,您如何检查该属性是否存在?
  • 好的,我有一个怀疑,但需要更多信息:你能给我一些样式名称的例子吗?推理:样式可以基于其他样式,并将通过这些链接继承设置。我的想法是该属性不可用,因为它来自潜在风格 - 但这只是一个难以确认的猜测......
  • 列表样式(可能会有一种称为“无列表”)没有 LanguageId 属性,您不能分配给其中一种。因此,您可能至少需要测试特定的 wdStyleType 值以避免尝试为这些样式类型分配该属性。

标签: vb.net ms-word styles interop comexception


【解决方案1】:

使用 Style.Type 获取合适的样式。

    oWord = CreateObject("Word.Application")
    If oWord IsNot Nothing Then
        oWord.Visible = False
        If oWord.Documents IsNot Nothing Then
            Try
                oDocument = oWord.Documents.Open(strFilePath)
            Catch ex As Exception
                iCouldntOpen += 1
                bFailedToOpen = True
            End Try
            If Not bFailedToOpen Then
                If oDocument IsNot Nothing Then
                    If oDocument.ReadOnly Then
                        iReadonly += 1
                    ElseIf oDocument.HasPassword Then
                        iPassword += 1
                    Else
                        For Each s As Style In oDocument.Styles
                            Select Case s.Type
                                Case WdStyleType.wdStyleTypeCharacter, WdStyleType.wdStyleTypeParagraph, WdStyleType.wdStyleTypeTable
                                    s.NoProofing = False
                                    s.LanguageID = WdLanguageID.wdEnglishUK
                            End Select
                        Next

                        ' save the document
                        oDocument.Save()
                    End If

                    ' close the document
                    oDocument.Close()
                    oDocument = Nothing
                End If
                oWord.Quit()
                oWord = Nothing

                bFailedToOpen = False
            End If
        Else
            iUnknown += 1
        End If
    Else
        iUnknown += 1
    End If

【讨论】:

  • 请在此答案中包含已添加到问题中的代码。不要将答案放在问题中 - 这就是答案框的用途。这对其他有类似问题的人会更有帮助。混合问题和答案是令人困惑的。还请将问题回滚到之前的状态,以便对其他人有用。
【解决方案2】:

您正在将 Word 应用程序创建为后期绑定对象。这意味着您将无法在代码中访问 Word 智能感知。这具有如下含义

样式未定义。您没有定义对象样式是什么。由于后期绑定,您的代码无法确定您的意思是单词样式。因此,您看到的错误。

WdLanguageID.wdEnglishUK 是一个 Word 常量,其值为 2507 (&H809),但由于后期绑定,您的代码将不知道这一点,而您的值为 0。

正确定义 Style 和 WdEnglishUK 问题的解决方案。

【讨论】:

  • 在 VBA 中这可能是正确的,尽管使用 CreateObject 并且 很常见,并且在项目中引用了 Word 对象,这意味着 wd 常量将是正确解释。但在 VB.NET 中,我怀疑编译器会反对 WdLanguageID.wdEnglishUK,除非 OP 在其项目中引用了 Word 对象库。
  • @yokki。我的错误。正确限定对象的概念仍然适用,因为样式对象被假定为 Word 样式。即它应该被限定为 'Microsoft.Office.Interop.Word.Style' 以匹配 oDocument.Styles 迭代器。
  • 这并没有回答问题,充其量应该是评论...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多