Что нового

Проверка орфографии с помощью словаря MS Word

Suppir

Продвинутый
Добрый день!

У меня есть слово в переменной $var = 'Муницыпального'.
Нужно в фоновом режиме запустить Word и проверить, если ли такое слово в словаре Word'а. Если есть, то вернуть 1, если нет, то вернуть 0.

Пишу:

Код:
#include <Word.au3>

$var = 'Муницыпального'
FileDelete(@ScriptDir & "\Test.doc")
$oWordApp = _WordCreate (@ScriptDir & "\Test.doc", 0, 0)
$oDoc = _WordDocGetCollection ($oWordApp, 0)
$oDoc.Range.insertAfter ($var)
$oWordApp.ActiveDocument.CheckSpelling

_WordQuit ($oWordApp, -1)



Появляется окно проверки орфографии Word'а. Но мне не нужно это окно. Нужно, чтобы скрипт просто вернул 1 или 0, в зависимости от того, знает ли такое слово Word или нет. Как это сделать?
 

madmasles

Модератор
Глобальный модератор
Suppir,
У меня это окно все равно появляется, если слово с ошибкой. Корявое решение, лучше его не применять. :smile:
Код:
#include <Word.au3>

;$sWord = 'Муниципального'
$sWord = 'Муницыпального'
If FileExists(@TempDir & '\Test.doc') Then
	FileDelete(@TempDir & '\Test.doc')
EndIf
$oWordApp = _WordCreate(@TempDir & "\Test.doc", 0, 0)
$oDoc = _WordDocGetCollection($oWordApp, 0)
$oDoc.Range.insertAfter($sWord)
Run(@AutoItExe & ' /AutoIt3ExecuteLine  "If WinClose(WinWait(''Орфография'', '''', 3)) Then FileClose(FileOpen(@TempDir & ''\Error.www'', 2))"')
$oWordApp.ActiveDocument.CheckSpelling()
_WordQuit($oWordApp, 0)
Sleep(250)
If FileExists(@TempDir & '\Error.www') Then
	FileDelete(@TempDir & '\Error.www')
	MsgBox(16, 'Error', 'Есть ошибка: ' & $sWord)
Else
	MsgBox(64, 'Info', 'Нет ошибки: ' & $sWord)
EndIf
If FileExists(@TempDir & '\Test.doc') Then
	FileDelete(@TempDir & '\Test.doc')
EndIf
 

Yuri

AutoIT Гуру
Наткнулся, как 1С-ники решили.
Проверка правописания и орфографии.
Код:
ТекстДляПроверки = "Данный текст садержит как минемум три ошипки !";

Процедура КнопкаВыполнитьНажатие(Кнопка)
   // Создадим объект MS Word, он должен быть установлен  
   Попытка
      Word = Новый COMОбъект("Word.Application");
   Исключение
      Предупреждение("Microsoft Word не установлен!",,"Ошибка!");
      Возврат;
   КонецПопытки;
   
   НетОшибок = Word.CheckSpelling(ТекстДляПроверки);
   Если НетОшибок Тогда // Все правильно  
      Сообщить("Нет ошибок");
###################################################################### 
[color=blue]дальше можно не смотреть (и так получили значение - Нет ошибок)[/color]
######################################################################
   Иначе // текст содержит ошибки. Проверим каждое слово и выведем ошибочные.  
      Док = Word.Documents.Add(); // Создадим новый документ  
      Область = Док.Range(0,0); // Получим пустую область в начале документа  
      Область.I_nsertBefore(ТекстДляПроверки); // Добавим в документ текст  
      Для каждого Слово Из Область.Words Цикл
         СловоДляПроверки = СокрЛП(Слово.Text);
         НетОшибок = Word.CheckSpelling(СловоДляПроверки);
         Если НЕ НетОшибок Тогда // Слово ошибочно  
            // покажем возможные замены неправильного слова  
            СтрокаВариантов = "";
            // Получим варианты правописания  
            Варианты = Слово.GetSpellingSuggestions( ,1, ,0);
            Для каждого Вариант Из Варианты Цикл
               СтрокаВариантов = СтрокаВариантов + ", " + Вариант.Name;
            КонецЦикла;
            СтрокаВариантов = ". Варианты замены: " + Сред(СтрокаВариантов, 2);
            Сообщить("Ошибка в слове: " + СловоДляПроверки + СтрокаВариантов);
         КонецЕсли;
      КонецЦикла;
   КонецЕсли;
   Док.Close(0,,); // закроем документ без сохранения wdDoNotSaveChanges  
   Word.Quit(); // закроем Word  
КонецПроцедуры
Использование в этом направлении объекта MS Word из 1С,
близко для AutoIt, мне так кажется, почти как из VBS.
 

madmasles

Модератор
Глобальный модератор
Suppir,
У меня работает:
Код:
#include <Word.au3>

Global $oWord
Dim $aWord[6] = [5, 'Муниципального', 'Муницыпального', 'ошипка', 'ошибка', 'ашибка']

OnAutoItExitRegister('_Exit')

For $i = 1 To $aWord[0]
	ConsoleWrite($aWord[$i] & @TAB & _Check_Error($oWord, $aWord[$i]) & @LF)
Next

Func _Check_Error(ByRef $o_Word, $s_Text)
	Local $f_Result
	If Not $s_Text Then Return 1
	If Not IsObj($o_Word) Then
		$o_Word = _WordCreate('', 0, 0)
		If @error Then Return SetError(1)
	EndIf
	$f_Result = $o_Word.CheckSpelling($s_Text)
	Return Number($f_Result)
EndFunc   ;==>_Check_Error

Func _Exit()
	If IsObj($oWord) Then
		_WordQuit($oWord, 0)
	EndIf
EndFunc   ;==>_Exit
 
Автор
S

Suppir

Продвинутый
madmasles

Работает, спасибо!! :laugh:


Добавлено:
Сообщение автоматически объединено:

Еще один момент. Если вдруг получится сделать.

Можно ли подать в Word массив слов, чтобы он "заучил" их как правильные?
 

madmasles

Модератор
Глобальный модератор
Suppir [?]
Можно ли подать в Word массив слов, чтобы он "заучил" их как правильные?
Как добавить вспомогательный словарь в Microsoft Word.
У меня на 2003 работает:
Код:
$sNewWord = 'madmasles'

$sDicFile = @AppDataDir & '\Microsoft\Proof\CUSTOM.DIC'

$sText = FileRead($sDicFile)
If Not StringInStr($sText, $sNewWord & @CRLF) Then
	FileWriteLine($sDicFile, $sNewWord)
Else
	MsgBox(16, 'Error', 'Уже есть')
EndIf
 
Автор
S

Suppir

Продвинутый
Полезная штука, не знал о такой.
 
Автор
S

Suppir

Продвинутый
OffTopic:
Как говорится, век живи - век учись :ok: (это я про себя)



Добавлено:
Сообщение автоматически объединено:

Аналог на Perl. Может быть кому-нибудь пригодится:

Код:
use Win32::OLE;
$word = CreateObject Win32::OLE 'Word.Application';
$word->{'Visible'} = 0;
@words = ("Муниципального", "МуницЫпального", "Закон", "Зокон");
foreach (@words){
    my $result = $word -> CheckSpelling($_);
    print "$_ - $result\n";
}
$word->Quit;
 
Верх