C# Word Interop - Проверка на правописа на определен език

За мой клиент трябва да наложа проверка на правописа на определен език.

Проучих документацията на MSDN и открих, че при извикване на метода CheckSpelling() в активния документ, той ще извика проверката на правописа. Този метод има параметри за персонализирани речници.

Проблемът ми е, че не мога да намеря нищо за тези речници или как да ги използвам.

Също така все още има възможност, разбира се, да има друг начин да направите това.

Може ли някой да ме тласне в правилната посока?


person Tom Ceuppens    schedule 28.03.2012    source източник


Отговори (4)


Намерих моето решение:

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 за цялата помощ!

person Tom Ceuppens    schedule 30.03.2012
comment
Както е публикувано в коментара, това работи, но проверете производителността, ако изброите всички диапазони. В голям документ може да е много бавно! - person Adriano Repetti; 02.04.2012

Проверката на правописа използва езика на текста, за да избира правила и речници (вижте тук, за да проверите как работи).

Трябва да зададете езика на текста на това, от което се нуждаете, и тогава SC ще използва този език. Следвайте тази връзка за повече подробности:

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

person Adriano Repetti    schedule 28.03.2012
comment
Опитах се да задам activeDocument.Content.LanguageId, но SC не го взе... - person Tom Ceuppens; 28.03.2012
comment
Опитахте ли с ActiveDocument.Range.LanguageID = wdEnglishUS - person Adriano Repetti; 29.03.2012
comment
Не искам обратна връзка или нещо подобно. Просто искам да задам езика на SC на предварително зададен език... Клиентът ми е французин и има много видове френски. И често думата открива грешната... - person Tom Ceuppens; 30.03.2012

Напоследък работя с това и реших да добавя малко към вече дадените отговори.

За да получите списък с правописни грешки в документа за определен език, ще ви помогне да направите следното:

// 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 може да бъде намерена тук.
  • Информация относно несъществуването на обект ProofreadingError може да бъде намерена тук.
person Lasse Christiansen    schedule 07.01.2013

Никога не използвайте оператори 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;
        }

    }
person Sujay Ghosh    schedule 15.11.2014