【问题标题】:C# Word Interop - Spell Checking in a Certain LanguageC# Word Interop - 某种语言的拼写检查
【发布时间】:2014-11-15 19:20:10
【问题描述】:

对于我的一位客户,我需要强制使用某种语言进行拼写检查。

我浏览了MSDN文档,发现在活动文档中调用CheckSpelling()方法时,会调用拼写检查。此方法具有自定义字典的参数。

我的问题是我找不到有关这些词典或如何使用它们的任何信息。

当然还有其他方法可以做到这一点。

任何人都可以在正确的方向上帮助我吗?

【问题讨论】:

    标签: c# ms-word office-interop


    【解决方案1】:

    找到我的解决方案:

    foreach (Range range in activeDocument.Words)
    {
        range.LanguageID = WdLanguageID.wdFrenchLuxembourg;
    }
    

    评论后编辑

    由于我的活动文档在一个变量中,我似乎失去了静态 Range 属性。我通过执行以下操作找到了解决方法。 (lan 是我保存 WdLanguageId 的变量)

    object start = activeDocument.Content.Start;
    object end = activeDocument.Content.End;
    
    activeDocument.Range(ref start, ref end).LanguageID = lan;
    

    感谢@Adrianno 的所有帮助!

    【讨论】:

    • 正如评论中发布的那样,这可行,但如果您枚举所有范围,请检查性能。在大文档中,它可能非常慢!
    【解决方案2】:

    拼写检查器使用文本语言来选择规则和字典(查看here 以检查其工作原理)。

    您必须将文本语言设置为您需要的语言,然后 SC 将使用该语言。点击此链接了解更多详情:

    http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.language.aspx

    【讨论】:

    • 我尝试设置 activeDocument.Content.LanguageId 但 SC 没有选择它...
    • 你试过 ActiveDocument.Range.LanguageID = wdEnglishUS
    • 我不想要任何反馈什么的。我只想将SC的语言设置为预定义的语言...我的客户是法国人,法语有很多种。并且经常单词会检测到错误的...
    【解决方案3】:

    我最近一直在处理这个问题,并认为我会在已经给出的答案中添加一些内容。

    要获取文档中特定语言的拼写错误列表,请执行以下操作:

    // Set the proofing language
    myDocument.Content.LanguageID = WdLanguageID.wdDanish;
    
    // Get the spelling errors (returns a ProofreadingErrors collection)
    var errors = myDocument.SpellingErrors;
    
    // There is no "ProofreadingError" object -> errors are accessed as Ranges
    foreach (Range proofreadingError in errors)
        Console.WriteLine(proofreadingError.Text);
    

    正如阿德里亚诺所指出的,关键是首先指定文档内容的语言,然后您可以访问给定语言的拼写错误。我已经对此进行了测试(Word Interop API 版本 15,Office 2013),并且可以正常工作。

    如果你也想获得每个拼错单词的建议,我建议你看看我之前对该问题的回答:https://stackoverflow.com/a/14202099/700926

    在该答案中,我提供了示例代码以及相关文档的链接,以了解如何完成。特别是,该示例介绍了如何使用 Word Interop 对特定语言(您选择的)中的给定单词进行拼写检查。该示例还介绍了如何访问 Word 返回的建议。

    最后,我有几点说明:

    • 与当前接受的答案(您自己的)相比,这种方法要快得多,因为它不必遍历每个单词。我一直在使用 Word Interop 编写报告(100 多页),相信我,您不会想坐等迭代完成。
    • 有关SpellingErrors 属性的信息可以在here 找到。
    • 有关不存在 ProofreadingError 对象的信息可以在 here 找到。

    【讨论】:

      【解决方案4】:

      访问 Office 对象时切勿使用 foreach 语句。 Office 对象大部分是 COM 对象,使用 foreach 会导致内存泄漏。

      以下是一段工作代码

          Microsoft.Office.Interop.Word.ProofreadingErrors errorCollection = null;
      
          try
          {
              errorCollection = Globals.ThisAddIn.Application.ActiveDocument.SpellingErrors;
      
           // Indexes start at 1 in Office objects
              for (int i = 1; i <= errorCollection .Count; i++)
              {
                  int start =  errorCollection[i].Start;
                  int end = errorCollection[i].End;
      
              }
      
          }
          catch (Exception ex)
          {
              MessageBox.Show(ex.Message);
      
          }
          finally
          {
              // Release the COM objects here 
              // as finally shall be always called
      
              if (errorCollection != null)
              {
                  Marshal.ReleaseComObject(errorCollection);
                  errorCollection = null;
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        相关资源
        最近更新 更多