Автоматизация документов WORDDelphi , Технологии , OLE Automation MSOffice
Оформил: DeeCo Автор: Клименко Константин 1. Для чего и для когоВ настоящий момент везде, или почти везде, для работы с текстовыми документами используется Word от Microsoft. Причем, когда читаешь в объявлениях о приеме на работу программиста в фирму не занимающейся разработкой ПО, то с уверенностью можно сказать, что необходим человек, умеющий работать с офисным пакетом (Word, Excel, Access) от вышеупомянутой фирмы. Поэтому данным материалом хотелось бы показать, как можно в некоторых случаях упростить работу с текстовым редактором Word. Для этого не обязательны знания Delphi на профессиональном уровне, достаточно уметь создавать динамически подключаемые библиотеки (DLL) и знать основы VBA для Word. К тому же макроязыки используются не только в пакете от Microsoft, слышал, что аналог VBA есть и в StarOffice.2. Как подключить DLL в VBA Любая программа может вызвать функцию из DLL, которая написана на Delphi, независимо от того, написана она на Си, Visual Basic или VBA. Первый вопрос, который может волновать - как это сделать в VBA для Word?Для вызова DLL в VBA для Word существует специальная функция: [Public | Private]Declarefunction name Lib "libname"[Alias "aliasname"][([arglist])][as type]Описание функции:
Желательно в VBA создать функцию для вызова DLL. В нашем примере это функция WordTest , которая вызывается MACROBUTTON-ом ({ MACROBUTTON WordTest Кликни здесь }(Вставка => Поле => Автоматизация документа)). 3. Как в Delphi создать DLL Ответ на этот вопрос можно найти во многих справочниках и учебниках по Delphi. Я лишь приведу исходный текст библиотеки.На форме находятся следующие компоненты: Edit1 и Button1, причем Button1.ModalResult = mrOk. Листинг библиотеки (PrjWTest.dpr): library PrjWTest; uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, UnitWTest in 'UnitWTest.pas' {FormWTest}; var //Это наша форма MyForm: TFormWTest; {*********************Test************************************} function Test: PChar; export; stdcall; var TmpStr: string; begin TmpStr := ''; //Вызываем форму if MyForm.ShowModal = mrOk then begin //Считываем текст с Edit TmpStr := MyForm.Edit1.Text; end; //Желательно указать конец строки TmpStr := TmpStr + #0; //Возвращаем текст Test := PChar(TmpStr); end; {*********************MyTest************************************ Данную функцию вызываем из Word} function MyTest(N: Byte): PChar; export; stdcall; begin //Посылаем в Edit число, полученное из Word MyForm.Edit1.Text := IntToStr(N); //Вызываем вспомогательную функцию MyTest := Test; end; {*********************MyTest************************************ Создаем форму} procedure CreateForm; export; stdcall; begin MyForm := TFormWTest.Create(Application); end; {*********************MyTest************************************ Освобождаем форму} procedure FreeForm; export; stdcall; begin MyForm.Free; end; exports CreateForm Index 1, MyTest Index 2, FreeForm Index 3; //{$R *.RES} begin { Application.Initialize; Application.CreateForm(TFormGsk, FormGsk); Application.CreateForm(TDataModule2, DataModule2); Application.CreateForm(TFormListBoxs, FormListBoxs); Application.CreateForm(TFormCreateSk, FormCreateSk); Application.CreateForm(TFormAddKontr, FormAddKontr); Application.Run;} end.При вызове функции MyTest вызывается наша форма, в Edit помещается переданное число, функция возвращает текст из Edit. Полученную DLL желательно поместить в папку Windows. 4. Проблемы, возникающие при передаче данных. В данной части хотелось бы обратить внимание на некоторые особенности передачи данных из Delphi в VBA.Во-первых, если передаете текст, то тип передаваемой функции должен быть Pchar, т.к. VBA не понимает типа String. Во-вторых, VBA все равно при выводе текста в документ выдаст ерунду. Поэтому ниже привожу листинг функции, преобразующей полученный текст в "нормальный". //Приводим полученный текст в "нормальный" текстовый вид function StrToStr(St as string) as string Dim EndStr as Long //Определяем количество символов до конца строки EndStr = InStr(1, St, Chr$(0)) if EndStr <> 0 then //Вырезаем и возвращаем нужную информацию StrToStr = Left(St, EndStr - 1) else StrToStr = "" end if endfunctionВ-третьих, лучше создавать и освобождать формы отдельными функциями, особенно это видно при работе с базами. //Подключаемые функции в DLL Declare Sub CreateForm Lib "PrjWTest"() Declarefunction MyTest Lib "PrjWTest"(ByVal Ns as Byte) as string Declare Sub FreeForm Lib "PrjWTest"()5. Как вставлять текст в Word.Это тоже можно найти в справочниках и учебниках по VBA. Но все же приведу несколько советов по этому вопросу. Если строку необходимо вставить в определенное место в тексте, то делаем закладку: Вставка=>Закладка в меню Word. Но лучше использовать две закладки: начало текста и конец. Это может понадобиться в случае замены старого текста на новый (обновление данных). Далее листинг этих функций: //Переходим к метке Label Sub GotoBookMark(label as string) Selection.goto What := wdGoToBookmark, Name := label with ActiveDocument.Bookmarks .DefaultSorting = wdSortByName .ShowHidden = False end with end Sub //Вставляет текст NK между закладками BeginBookM и EndBookM Sub NewTxt(BeginBookM as string, EndBookM as string, NK as string) //Переходим к первой закладке GotoBookMark(BeginBookM) //Выделяем старый текст между закладками Selection.Extend //Переходим к второй закладке GotoBookMark(EndBookM) //Отступаем чтобы не захватить закладку Selection.MoveLeft unit := wdCharacter, Count := 1 //Заменяем старый текст на новый Selection.TypeText Text := NK end SubИ напоследок, листинг основной функции VBA - WordTest, которая вызывает DLL и вставляет текст между закладками: Sub WordTest() Dim S1, S2 as string //Загружаем DLL и форму CreateForm //Считываем данные с Edit S1 = MyTest(1) S2 = S1 //Преобразуем в нормальный текст S2 = StrToStr(S2) //Вставляем текст между закладками NewTxt "BeginTest", "EndTest", S2 //Удаляем формы и выгружаем DLL FreeForm Exit Sub end SubИсходники программы и документа прилагаются — AutoWrd.zip (127 K). Автоматизация документов WORD: создание динамически подключаемых библиотек (DLL) для упрощения работы с текстовым редактором Word. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: OLE Automation MSOffice ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |