C # Word Interop - проверка орфографии на определенном языке - PullRequest
4 голосов
/ 28 марта 2012

Для моего клиента мне нужно принудительно проверить орфографию на определенном языке.

Я изучил документацию MSDN и обнаружил, что при вызове метода CheckSpelling() в активном документе он вызывает проверку орфографии. Этот метод имеет параметры для пользовательских словарей.

Моя проблема в том, что я не могу найти ничего об этих словарях или о том, как их использовать.

Также существует вероятность того, что, конечно, есть другой способ сделать это.

Кто-нибудь может подтолкнуть меня в правильном направлении?

Ответы [ 4 ]

4 голосов
/ 30 марта 2012

Нашли мое решение:

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 голосов
/ 07 января 2013

Я работал с этим в последнее время и думал, что добавлю немного к уже полученным ответам.

Чтобы получить список орфографических ошибок в документе для определенного языка, выполните следующие действия:

// 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 можно найти здесь .
  • Информацию о несуществовании ProofreadingError объекта можно найти здесь .
2 голосов
/ 28 марта 2012

Средство проверки орфографии использует язык текста для выбора правил и словарей (посмотрите здесь , чтобы проверить, как это работает).

Вы должны установитьтекстовый язык на то, что вам нужно, и тогда SC будет использовать этот язык.Перейдите по этой ссылке для более подробной информации:

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

0 голосов
/ 15 ноября 2014

Никогда не используйте оператор foreach при доступе к объекту Office. Большинство объектов 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;
        }

    }
...