C#单词互操作-特定语言中的拼写检查
本文关键字:检查 语言 单词 互操作 | 更新日期: 2023-09-27 18:29:26
对于我的一个客户,我需要强制使用某种语言进行拼写检查。
我浏览了MSDN文档,发现在活动文档中调用CheckSpelling()
方法时,它将调用拼写检查。此方法具有自定义词典的参数。
我的问题是,我找不到关于那些词典的任何信息,也找不到如何使用它们。
此外,当然还有另一种方法可以做到这一点。
有人能把我推向正确的方向吗?
找到了我的解决方案:
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;
感谢@Adriano的所有帮助!
拼写检查器使用文本的语言来选择规则和词典(请查看此处查看其工作原理)。
您必须根据需要设置文本语言,然后SC将使用该语言。点击此链接了解更多详细信息:
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.language.aspx
我最近一直在处理这个问题,我想在已经给出的答案基础上再加一点。
要获得文档中某种语言的拼写错误列表,请执行以下操作:
// 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所指出的,关键是首先指定文档内容的语言,然后您可以访问给定语言的拼写错误。我已经测试过这个(WordInteropneneneba API第15版,Office2013),它是有效的。
如果你也想得到每个拼写错误的单词的建议,我建议你看看我之前对这个问题的回答:https://stackoverflow.com/a/14202099/700926
在这个答案中,我提供了示例代码以及相关文档的链接,以了解如何做到这一点。特别是,该示例介绍了如何使用word Interop对(您选择的)特定语言中的给定单词进行拼写检查。该示例还介绍了如何访问Word返回的建议。
最后,我有几个注意事项:
- 与目前公认的答案(你自己的)相比,这种方法要快得多,因为它不必遍历每个单词。我一直在使用Word Interop编写报告(100多页),相信我,你不想坐等迭代完成
- 有关
SpellingErrors
属性的信息可以在此处找到 - 关于
ProofreadingError
对象不存在的信息可以在这里找到
访问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;
}
}