![]() ![]() ![]() ![]() ![]() |
Интеграция CA-Visual Objects с Microsoft Word и Excel | 3/4 |
Предпосылки и отличия от Excel.
Из моего личного опыта я знаю, что наиболее популярная интеграция CA-Visual
Object - это интеграция его с документом WORD. Программисты имеют
желание научится работать с этим документом, обрабатывать текст, хранящийс
в нем, печатать его на сетевом принтере и т.д. и т.п.
Сразу скажу, что методология, применяемая в данном случае точно така
же как при интеграции Excel в CA Visual Objects. Разница, естественно,
в представляемой информации. Ведь WORD это текстовый процессор,
а EXCEL - электронная таблица.
Использование DDE
Операция DDE выглядит точно также, как это было сделано до этого с Excel. Одна интересная особенность, правда, появляется при выполнении команды DDE. В качестве примера посмотрите, пожалуйста, на команду:
oIPCClient:Execute("Документ1", "","Вставить текст! {ENTER}")
Эта команда вделывает текст "Вставить текст!" в текущую позицию
курсора документа с названием "Документ1" и переводит курсор на
следующую строку. Обратите внимание - здесь не применяются квадратные скобки,
как это было в случае с Excel.
К сожалению, все что может сделать вышеупомянутая команда это вделать
некий текст в текущую позицию курсора. Как можно передвинуть курсор в другую
позицию? Ответ на этот вопрос очень простой - при помощи команд DDE никак.
Однако это возможно при установки закладки где текст должен быть вставлен.
Затем Вам следует выполнить метод Execute с макросом EditGoTo до упомянутой
закладки и вделывать текст.
Макроязык Word Basic
Microsoft Word поддерживает BASIC подобный макроязык именуемый WordBasic . С его помощью реализуются любые команды и операции с *.DOC файлами. Дл выполнения макрокоманды на Word Basic просто заключите имя этого макроса в квадратные скобки и вделайте его в команду DDE Execute:
oIPCClient:Execute(oTopic,"","[MyWordBasicMacro]")
Разница между версиями WORD
Есть небольшая разница между версиями WORD ранних версий и более поздних.
Но это совсем не так ощутимо, как в Excel. Word полностью поддерживает
все свои старые форматы - он совместим сверху вниз. Word 2.0 не поддерживает
файлы от Word 7.0. Версия 7 не поддерживает формат файлов от Word97 без
необходимого драйвера, который можно скачать с Site Microsoft. Поддержка
DDE слабо меняется от версии к версии. Версия 7.0 и выше 32 разрядная,
как и среда, в которой она работает. Нету версий 3-5 . Этот скачек обусловлен
соображениями уникальности номеров версий для DOS и Windows.
И последнее Word97 уже не поддерживает Word Basic, в качестве внутреннего
языка там используется VBA.
OLE и CA-Visual Objects 2.0
Вы можете легко использовать технологию OLE применительно к WORD. Лучше
всего сделать это через OLE автоматизацию. В качестве сервера выступает
сам WORD, а команды, которые он выполняет - это команды макроязыка Word
Basic. Как и прежде Вы вправе использовать автоматические объекты от Word
Basic, построенные при помощи класса OleAutoObject, так и сгенеренные классы,
по соответствующему интерфейсу. Последний вариант намного предпочтительнее,
так как сильно экономит время у конечного пользователя. Кроме того советую
Вам опять же использовать только часть сгенеренных методов - это сильно
экономит ресурсы.
OLE автоматизация.
METHOD Start() CLASS App LOCAL ow AS ShellWindow LOCAL oWordBasic AS WordBasic LOCAL sP, sPo AS STRING LOCAL sRet AS STRING LOCAL sCommand AS STRING // oWordBasic := WordBasic{} sP := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\TestWord.doc" sPo := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\_TWord.doc" sRet := "На этом месте было " // oWordBasic:FileOpen(sP,, 1) // oWordBasic:EditReplace("@001", "Это замена #1 текста @001", , , , , , , , TRUE) oWordBasic:EditReplace("@002", "Это замена #2 текста @002", , , , , , , , TRUE) oWordBasic:EditReplace("@003", "Это замена #3 текста @003", , , , , , , , TRUE) oWordBasic:EditReplace("@004", "Это замена #4 текста @004", , , , , , , , TRUE) oWordBasic:EditReplace("@005", "Ну как Вам это нравиться?", , , , , , , , TRUE) // WHILE TRUE oWordBasic:StartOfDocument() oWordBasic:EditFind("\[*\]", , , , , 1) IF oWordBasic:EditFindFound() != 0 //Если что-то нашли sCommand := oWordBasic:Selection() sCommand := SubStr3(sCommand, 2, Len(sCommand)-2) oWordBasic:EditClear() oWordBasic:Insert(sRet + "'" + sCommand + "'") ELSE //Если ничиго не нашли, то выход EXIT END IF END WHILE // oWordBasic:EditSelectAll() oWordBasic:UpdateFields() oWordBasic:LineUp(1, 0) oWordBasic:FileSaveAs(sPo) oWordBasic:Shell("WinWord") oWordBasic:DocClose(2) // oW := ShellWindow{SELF} oW:Show() SELF:Exec() // RETURN 0Этот пример открывает файл TestWord.doc . Это шаблон для замен текста внутри него. Программа ищет строки вида @001 и заменяет их. Кроме того программа ищет строки в тексте, ограниченные квадратными скобками и заменяет содержимое на это же содержимое с небольшой добавкой - "на этом месте было". После чего открывает Word и загружает в него скорректированный документ.
На этом можно было бы и завершить рассказ об интеграции Word и CA-Visual
Object, если бы не одна маленькая деталь. Дело в том, что механизм OLE
автоматизации очень универсален, я бы сказал через чур универсален. Настолько
универсален, что работает ну очень медленно. Как вы знаете за все в нашем
мире приходится платить, в том числе и за универсальность, тем более за
излишнюю. Да, при помощи OLE механизма Вы можете делать с документом WORD
все, что он сам с ним может делать. Но будьте любезны подождать некоторое
время. В связи с вышесказанным мною был разработан механизм заполнени
документа WORD значительно более шустрый.
Интеграция Word и CA Visual Object через RTF формат.
Механизм этот основан на том, что WORD поддерживает файлы формата RTF (Rich Text Forman). По сути своей это текстовый файл в котором информаци хранится в специальных тегах. Word может сохранить любой документ в формате RTF. Самое важное, что работа идет через обычный текстовый формат - что значительно удобнее. Для доступа к текстовым файлам мною была написана функция на языке С, которая находиться в DLL библиотеке VO32_UT. Исходные тексты этой библиотеки распространяются вместе со статьей. Формат функции:
fRepl(<ucpBlank>, <ucpOutBlank>, <ucpBase> [, <ucS>])
-> <uiSuccess>
<ucpBlank> - Имя бланка (RTF файла)
<ucpOutBlank> - Имя выходного бланка (RTF файла)
<ucpBase> - Имя базы данных со структурой:
<ucS> - Код символа идентификации (по умолчанию код символа @){"S", "C", 255, 0}}.; Строка замены
{{"N", "N", 3, 0}, ; Длина строки замены
Функция эта делает следующее. Берет входной бланк - RTF файл и производит
поиск в нем строк вида @001 ... @nnn. Если такая строка нашлась, то беретс
из нее номер (все, что после @). Этот номер воспринимается как номер записи
в базе данных <ucpBase>. По номеру записи из базы вытаскиваетс
строка замены и количество символов, которое она занимает и делается замена
в исходном файле. По завершению работы все изменения сохраняются в выходном
файле <ucpOutBlank>.
Прототип функции fRepl на языке VO выглядит:
_DLL FUNCTION fRepl(ucpBlank AS PSZ, ucpOutBlank AS PSZ, ucpBase AS PSZ, ucFiller AS BYTE) AS INT PASCAL:VO32_UT.fRepl
Естественно, что при выполнение программы необходимая библиотека VO32_UT.DLL
должна быть доступна. Кроме того, сама библиотека VO32_UT.DLL требует
для своей работы стандартную библиотеку из Borland C++ 5.01 CW3220.DLL.
Следующие шаги, как я предполагаю достаточно прозрачны. Организуем
базу данных указанной структуры, заполняем ее строками замещения. Делаем
через Word бланк для заполнения. Пишем элементарную процедуру на VO:
METHOD Start() CLASS App LOCAL ow AS ShellWindow LOCAL sP, sPo, sB AS STRING // sP := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\TestWord.rtf" sB := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\TestWord.dbf" sPo := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\_TWord.rtf" // IF fRepl(PSZ(sP), PSZ(sPo), PSZ(sB), 64) != 0 TextBox{NULL_OBJECT, "Плохо!"}:Show() END IF // WinExec(PSZ("c:\msoffice\winword\winword.exe "+sPo), SW_SHOW) // oW := ShellWindow{SELF} oW:Show() SELF:Exec() // RETURN 0Может это конечно и не последний писк ультрасовременной технологии, но работает приблизительно в 10 раз быстрее метода основанного на OLE.
![]() |
![]() |