C#Word Interop - 使用某种语言进行拼写检查

时间:2012-03-28 08:18:45

标签: c# ms-word office-interop

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

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

我的问题是我找不到关于这些词典或如何使用它们的任何内容。

此外,还有可能有另一种方法可以做到这一点。

有人能帮助我朝正确的方向发展吗?

4 个答案:

答案 0 :(得分:4)

找到我的解决方案:

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

评论后编辑

由于我的activedocument在变量中,我似乎失去了静态Range属性。我通过以下方式找到了一份工作。 (lan是我的变量,我保留了我的WdLanguageId)

object start = activeDocument.Content.Start;
object end = activeDocument.Content.End;

activeDocument.Range(ref start, ref end).LanguageID = lan;

感谢@Adrianno提供所有帮助!

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

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

// 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);

正如Adriano所指出的,关键是首先指定文档内容的语言,然后您可以访问给定语言的拼写错误。我已经测试了这个(Word Interop API版本15,Office 2013),它可以工作。

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

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

最后,我有几点注意事项:

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

答案 3 :(得分:0)

访问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;
        }

    }