Добрый день! В делфи 7 существовали хорошие компоненты для работы с Excel и Word’ом. Куда исчезли эти компоненты в новых версиях delphi линейки XE? Где их взять, как установить, чтобы работать с ними?
задан 16 июл 2013 в 11:06
IntegralALIntegralAL
2,6895 золотых знаков58 серебряных знаков104 бронзовых знака
Пользуюсь NativeXLS — хорошие и мощьные классы. Шустро работают, поддерживают формулы, изображения почти все что есть в Excel. Поддерживают как xls, так и xlsx.
Ещё есть XLSReadAndWriteII, ими не пользовался.
ответ дан 31 июл 2013 в 21:25
Вопрос снимается. Оказывается, при установке этот компонент по умолчанию почему-то не подключился. Если кому-то поможет: Component->InstallPackages->Microsoft Office XP Server.
ответ дан 16 июл 2013 в 11:07
IntegralALIntegralAL
2,6895 золотых знаков58 серебряных знаков104 бронзовых знака
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).
Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:
uses ComObj; var Word: variant; [...] procedure CreateWord(const Visible: boolean); begin Word:=CreateOleObject('Word.Application'); Word.Visible:=Visible; end;
Всё достаточно просто. Далее мы можем работать с объектом следующим образом:
- Создавать документ Word с нуля
- Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.
Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.
Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:
[...] Word.Documents.Add [...]
и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:
[...] Word.Documents.Add(TamplatePath:string); [...]
Чтобы получить список всех открытых в данный момент документов Word можно воспользоваться следующим листингом:
[...] var List: TStringList; i: integer; begin List:=TStringList.Create; for i:=1 to Word.Documents.Count do List.Add(Word.Documents.Item(i).Name); end; [...]
Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:
Word.Documents.Item(index).Activate
где index — номер документа в коллекции.
Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.
Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:
[...] Word.ActiveDocument.Range.InsertBefore('Hello World'); Word.ActiveDocument.Range.InsertAfter('текст после Hello World'); Word.ActiveDocument.Range.InsertAfter('окончание строки в документа'); [...]
При выполнении этих трех операции Range содержал весь документ.
Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:
var MyRange: variant; begin MyRange:=WordActiveDocument.Range(50,100); MyRange.InsertBefore('Привет');//всё, что было после 50-го символа сдвинулось вправо end;
Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:
[...] ShowMessage(Word.ActiveDocument.Range.Text) //весь текст в документе [...]
Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.
Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.
[...] ShowMessage(Word.ActiveDocument.Words.Item(Word.ActiveDocument.Words.Count).Text) [...]
В данном случае я вывел на экран последнее слово в документе.
Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.
2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.
Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:
var FilePath: string; [...] Word.Documents.Open(FilePath) [...]
Метод Open можно вызывать с несколькими аргументами:
- FileName: string — путь и имя файла;
- ConfirmConversions: boolean — False — не открывать диалоговое окно «Преобразование файла» при открытии файла, формат которого не соответствует формату Word (doc или docx)
- ReadOnly:boolean — True — открыть документ в режиме «Только для чтения»
- AddToRecentFiles: boolean — True, чтобы добавить документ в список недавно открытых документов.
- PasswordDocument: string — пароль для открытия документа
- PasswordTemplate: string — пароль для открытия шаблона
- Revert : boolean — True, чтобы вернуться к сохраненному документу, если этот документ открывается повторно.
- WritePasswordDocument: string — пароль для сохранения измененного документа в файле
- WritePasswordTemplate:string — пароль для сохранения изменений в шаблоне
- Format:integer — формат открываемого документа.
Обязательным параметром метода Open является только FileName, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:
[...] Word.Documents.Open(FileName:=FilePath, ReadOnly:=true) [...]
В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.
Что касается последнего аргумента — Format, то он может принимать целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.
Теперь, когда документ открыт его необходимо преобразовать. Обычно я делаю следующим образом: в тех местах документа, в которые необходимо вставить текст я расставляю либо закладки, либо простые строки текста, например, обрамленные символом $ или #. И затем просто выполняю поиск и замену подстрок следующим образом:
function FindAndReplace(const FindText,ReplaceText:string):boolean; const wdReplaceAll = 2; begin Word.Selection.Find.MatchSoundsLike := False; Word.Selection.Find.MatchAllWordForms := False; Word.Selection.Find.MatchWholeWord := False; Word.Selection.Find.Format := False; Word.Selection.Find.Forward := True; Word.Selection.Find.ClearFormatting; Word.Selection.Find.Text:=FindText; Word.Selection.Find.Replacement.Text:=ReplaceText; FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll); end;
Приведенная выше функция позволяет провести поиск и замену текстового фрагмента во всём документе. Для того, чтобы ограничить возможности пользователя при работе с шаблоном документа я обычно ставлю на необработанный файл пароль, а после обработки — пароль снимаю и сохраняю документ с другим названием в необходимую директорию.
Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet
3.1
8
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
1 / 1 / 0 Регистрация: 18.05.2011 Сообщений: 9 |
|
1 |
|
25.05.2011, 08:30. Показов 6972. Ответов 12
Доброго времени суток! Не могу найти в Delphi 2009 компонент для работы с Word, подскажите плз где его взять и как утановить? можно полное название написать файла, пригодного для установки
0 |
1 / 1 / 0 Регистрация: 18.05.2011 Сообщений: 9 |
|
14.06.2011, 16:46 [ТС] |
2 |
Народ, уже месяц прошёл, мне уже горит прям, теперь использую Делфи 2010. Как работать с Word? какими компонентами и тд.. подскажите плз
0 |
16 / 16 / 3 Регистрация: 14.06.2011 Сообщений: 64 |
|
14.06.2011, 17:45 |
3 |
Подключай в uses Word2000.
0 |
2184 / 1254 / 143 Регистрация: 28.04.2010 Сообщений: 4,592 |
|
14.06.2011, 17:51 |
4 |
а что через com не как?
0 |
2 / 2 / 1 Регистрация: 08.12.2010 Сообщений: 14 |
|
14.06.2011, 19:37 |
5 |
ищи в яндексе модуль Myword и будет тебе счастье.
0 |
1 / 1 / 0 Регистрация: 18.05.2011 Сообщений: 9 |
|
14.06.2011, 19:41 [ТС] |
6 |
Благодарю всех кто откликнулся!.
0 |
Sam2503 1 / 1 / 0 Регистрация: 18.05.2011 Сообщений: 9 |
||||
19.06.2011, 16:19 [ТС] |
7 |
|||
Myword нашёл. ПРи попытки сделать что либо, либо открыть файл, или создать, всё средствами данного модуля, постоянно ошибка: invalid variant operation. В чём причина? приложил найденный файл. Пишу например:
появляется ошибка
0 |
1 / 1 / 0 Регистрация: 18.05.2011 Сообщений: 9 |
|
19.06.2011, 16:22 [ТС] |
8 |
Найденный модуль
0 |
kamika 2 / 2 / 1 Регистрация: 08.12.2010 Сообщений: 14 |
||||||||
19.06.2011, 16:55 |
9 |
|||||||
Ну во первых, не нужно писать myword
Ну и на по следок пример:
Все работает
1 |
2 / 2 / 1 Регистрация: 08.12.2010 Сообщений: 14 |
|
20.06.2011, 19:19 |
10 |
Ни ответа ни привета…
0 |
1 / 1 / 0 Регистрация: 18.05.2011 Сообщений: 9 |
|
20.06.2011, 19:23 [ТС] |
11 |
Приношу извинения..пока не было возможности заняться программой.
0 |
2 / 2 / 1 Регистрация: 08.12.2010 Сообщений: 14 |
|
20.06.2011, 19:26 |
12 |
не чего страшного, попробуешь, отпишись
0 |
1 / 1 / 0 Регистрация: 18.05.2011 Сообщений: 9 |
|
22.06.2011, 21:54 [ТС] |
13 |
Благодарю, kamika, вы мне очень помогли, похоже
0 |
Наглядный пример— MS Office. Зачем самому создавать систему генерации
отчетов, деловых диаграмм или алгоритм линейной оптимизации. Все уже есть в MS
Office, кроме того, есть механизмы использования всего этого богатства,
называемые OLE Automation. Только в Help нужно заглянуть… И тут выступает проза
жизни. Написать самому оказывается быстрее, чем найти в колоссальной по объему
системе помощи нужную информацию. Кроме того, тут даже есть элемент комизма.
Нужный вам раздел системы помощи при обычной установке, как правило, не
инсталлируется. В общем, кладезь мудрости, засыпанный второстепенной информацией
и к тому же, лежащий на дистрибутивном диске. А если очень хочется, или
постановка задачи явно требует? Приведенный далее материал— попытка дать
«быстрый старт» программисту, на которого взвалили такой выгодный заказ. Речь
пойдет о «связке» Delphi-Word, однако, многое из ранее изложенного применимо ко
многим другим приложениям Microsoft (Excel, Internet Explorer и т. д.), которые
поддерживают OLE Automation.
Для того чтобы из Delphi можно было обращаться к методам и свойствам,
предоставляемым Word (используя раннее связывание OLE Automation), необходимо
установить библиотеку типов Word. Библиотека типов объявляет в
стандартизированном виде все методы и свойства Automation Server, которые могут
быть использованы любым совместимым средством программирования, включая Delphi.
Для того чтобы использовать в Delphi библиотеку типов Word в меню «Project» ->
«Import Type Library» необходимо выбрать файл msword8.olb, находящийся в
каталоге Microsoft Office и подкаталоге «Office». При этом будет создан файл
«Word_TLB.pas», в котором содержимое библиотеки типов представлено на языке
object pascal. Будут созданы также файлы библиотек «Office_TLB.pas» и
«VBIDE_TLB.pas», на которые ссылается библиотека типов. Эти файлы необходимо
сохранить в каталоге «Imports». Теперь достаточно в секцию «uses» нового модуля
добавить «Word_TLB» для работы с Word посредством OLE Automation.
Подробную информацию о предоставляемых приложениями Office методах и свойствах
можно найти в файлах vba*.hlp. Учтите только, что по умолчанию они не
устанавливаются. Для их установки для каждой программы необходимо явно указать
наличие файлов справки по Visual Basic или выполнить полную установку.
Следует отметить также, что в Delphi версии 5 есть стандартные методы для работы
в Word. Это модули Word97 и Word2000, которые уже содержат в себе библиотеку
типов Word.
Открытие Word через OLE Automation
В библиотеке типов определен касс «CoApplication», который реализует интерфейс с
Word-ом. Для создания из своей программы экземпляра Word необходимо вызвать
метод «CoApplication.Create». Этот метод возвращает ссылку на интерфейс типа
«_Application». Интерфейс «_Application» предоставляет интерфейс «Documents», в
котором определены два метода доступа к документам: «Add» и «Open».
Оба эти метода возвращают указатель на интерфейс «_Document». При вызове методам
можно передавать параметры «OLEVariant». Многие параметры, передаваемые методам
Word, являются необязательными (optional). Необязательные параметры, тем не
менее, должны быть включены в обращения к методам, но могут быть определены как
неинициализированные (Unassigned), чтобы указать, что они не используются. Для
неиспользуемых параметров можно использовать переменную Delphi 4 называемую
EmptyParam.
uses Word_TLB; procedure StartWord(var WordApp: _Application; var WordDoc: _Document); var SaveChanges: OleVariant; begin try WordApp := CoApplication.Create; WordDoc := WordApp.Documents.Add(EmptyParam, EmptyParam); WordApp.Visible := True; except if (Assigned(WordApp)) then begin SaveChanges := wdDoNotSaveChanges; WordApp.Quit(SaveChanges, EmptyParam, EmptyParam); end; end;
Как подключиться к загруженной копии Word
Для подключения к исполняемой копии Word можно использовать команду
«GetActiveOleObject». Она возвращает переменную с именем «IDispatch», содержащую
указатель на работающее приложение Word. После этого у него можно с помощью
«QueryInterface» запросить указатель на объект «_Application».
GetActiveOleObject генерирует исключение, если запрашиваемый объект не
существует в Running Object Table (ROT). Поэтому вызов его необходимо делать
внутри блока «try..except».
uses Word_TLB; procedure StartWord(var WordApp: _Application); var SaveChanges: OleVariant; begin try GetActiveOleObject('Word.Application').QueryInterface(_Application, WordApp); except WordApp := nil; end if (UnAssigned(WordApp)) then try WordApp := CoApplication.Create; WordApp.Visible := True; except if (Assigned(WordApp)) then begin SaveChanges := wdDoNotSaveChanges; WordApp.Quit(SaveChanges, EmptyParam, EmptyParam); end; end; end;
Получение информации из Word
Если кто-то не помнит — Word когда-то был текстовым процессором, поэтому из
уважения к его истории в нем эти функции все еще присутствуют. Информацию из
Word можно получить через интерфейс «IdataObject». Для получения указателя на
этот интерфейс необходимо использовать функцию «QueryInterface».
Документы Word поддерживают стандартные форматы CF_TEXT и CF_METAFILEPICT так же
как ряд других специфических форматов, включая RTF и structured storage. Для
стандартных форматов используются константы значений переменной «cfFormat», но
для других форматов нужно делать запрос, используя функцию «EnumFormatEtc». Эта
функция возвратит список обеспечиваемых форматов. Требуемый формат из этого
списка затем передается функции «GetData» интерфейса «IDataObject». Значение
cfFormat для одинаковых форматов может различаться на разных компьютерах,
поэтому всегда должно находиться с помощью функции «EnumFormatEtc». Для
подробной информации относительно методов интерфейса «IdataObject» можно
обратиться к файлам помощи по программированию в Win32.
uses Word_TLB; function GetRTFFormat(DataObject: IDataObject; var RTFFormat: TFormatEtc): Boolean; var Formats: IEnumFORMATETC; TempFormat: TFormatEtc; cfRTF: LongWord; Found: Boolean; begin try OleCheck(DataObject.EnumFormatEtc(DATADIR_GET, Formats)); cfRTF := RegisterClipboardFormat('Rich Text Format'); Found := False; while (not Found) and (Formats.Next(1, TempFormat, nil) = S_OK) do if (TempFormat.cfFormat = cfRTF) then begin RTFFormat := TempFormat; Found := True; end; Result := Found; except Result := False; end; end; procedure GetRTF(WordDoc: _Document); var DataObject: IDataObject; RTFFormat: TFormatEtc; ReturnData: TStgMedium; Buffer: PChar; begin if (Assigned(WordDoc)) then try WordDoc.QueryInterface(IDataObject, DataObject); if GetRTFFormat(DataObject, RTFFormat) then begin OleCheck(DataObject.GetData(RTFFormat, ReturnData)); //RTF is passed through global memory Buffer := GlobalLock(ReturnData.hglobal); //Buffer is a pointer to the RTF text //Insert code here to handle the RTF text (ie. save it, display it etc.) GlobalUnlock(ReturnData.hglobal); end; except ShowMessage('Error while getting RTF'); end; end;
Закрытие Word
Быстрое закрытие без сохранения изменений приведено далее:
var SaveChanges: OleVariant; begin SaveChanges := wdDoNotSaveChanges; Word.Quit(SaveChanges, EmptyParam, EmptyParam);
Другие возможные варианты для параметра «SaveChanges» — это «wdSaveChanges»
(сохранить изменения) и «wdPromptToSaveChanges» (запросить у пользователя
необходимость сохранения изменений).
Второй параметр используется для документов не Word формата. Возможные значения
«wdOriginalDocumentFormat» (сохранить в исходном формате), «wdPromptUser»
(запросить формат у пользователя) или «wdWordDocument» (сохранить как документ
Word).
The last parameter should be set to True if you want the document to be routed
to the next recipient in line.
Последний параметр должен быть установлен в «True», если вы хотите, чтобы
документ был направлен следующему получателю по маршруту.
Создание нового документа
В Word 97 на основании шаблона «Normal»:
Word.Documents.Add(EmptyParam, EmptyParam);
Если Вы хотите, чтобы новый документ был основан на шаблоне отличном от
«Normal», передайте имя (и путь) шаблона как первый параметр. Если необходимо
открыть новый документ как шаблон, передайте «True» для второго параметра.
В Word 2000, метод «Documents.Add» имеет два дополнительных параметра, для типа
документа и определения, должен ли документ быть видимым на экране. Внимание!
Использование этого метода с Word 97 вызовет исключение. Если необходима
совместимость с Word 97, можно использовать метод «Documents.AddOld» из
библиотеки Word 2000. Он имеет такие же параметры, как и метод «Add» из Word 97.
Открытие существующего документа
В Word 97:
var FileName: OleVariant; begin FileName := 'C:My DocumentsОткрываемый файл.doc'; Word.Documents.Open(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Необязательные параметры задают следующие свойства:
ReadOnly (третий параметр, по умолчанию False); PasswordDocument (пятый параметр);
Format (последний параметр дает возможность выбрать конвертор для файла).
В Word 2000 метод «Documents.Open» имеет два дополнительных параметра, для
расшифровки и определения,— должен ли документ быть видимым на экране. Как и в
случае с методом «Add» при использовании его в Word 97 вызывается исключение,
поэтому для совместимости нужно использовать метод «Documents.OpenOld». Он имеет
такие же параметры, как и метод «Open» из Word.
Закрытие документа
var SaveChs: olevariant; begin SaveChs := wdSaveChanges; Word.ActiveDocument.Close(SaveChs, EmptyParam, EmptyParam);
Параметры имеют те же значения, что и в случае метода «Word.Close», с одним
неприятным исключением: при передаче значения «wdPromptToSaveChanges» метод
останавливается. Поэтому запрос пользователю нужно сделать самостоятельно.
Вставка текста
var S: Selection; ... S :=Word.Selection; S.TypeText(Вставляемый текст'); S.TypeParagraph; S.TypeParagraph; S.TypeText('Текст после пустой строки');
Если выставить свойство «Application.Options.ReplaceSelection» в «True»,
выделенный текст будет заменяться новым.
Форматирование текста
var S: Selection; ... S := Word.Selection; {вывод фразы полужирным шрифтом} S.Font.Bold := integer(True); S.TypeText('Be bold!'); S.Font.Bold := integer(False); S.TypeParagraph; {прописным шрифтом} S.Font.Italic := integer(True); S.TypeText('Be daring!'); S.Font.Italic := integer(False);
Особых пояснений не требуется, единственно, что следует помнить о свойстве «Application.Options.ReplaceSelection»,
чтобы новый текст случайно не затер старый.
Переход к закладке по имени
var What : OLEVariant; Name : OLEVariant; begin What := wdGoToBookmark; Name := 'Имя закладки'; App.Selection.GoTo_(What, EmptyParam, EmptyParam, Name);
Очень полезный метод. Позволяет превратить Word в генератор писем или отчетов. В
заготовке письма проставляем закладки, затем из программы переходим к ним и
вставляем нужный текст, например из базы данных. Второй необязательный параметр—
счетчик. С помощью него можно организовать переход не по имени, а по номеру
закладки.
Создание и доступ к таблицам
Создать таблицу можно следующим образом (проверялось в Word 97):
var Doc: _Document; T: Table; begin Doc := Word.ActiveDocument; T := Doc.Tables.Add(Word.Selection.Range, 5, 3); T.Cell(1, 1).Range.Text := 'January'; T.Cell(1, 2).Range.Text := 'February'; T.Cell(1, 3).Range.Text := 'March'; T.Columns.Width := 72; // in points
Получение содержимого ячейки происходит так:
Caption := T.Cell(1, 3).Range.Text;
Учтите, что работа с таблицами в Word происходит очень медленно, а в Word 2000
чрезвычайно медленно. Поэтому, если в результирующем документе просто нужно
быстро поместить таблицу, то можно, например, разместить текст, разделенный
запятыми (или другим разделителем), а затем преобразовать его в таблицу. Сделать
это можно так:
const Line1 = 'January,February,March'; Line2 = '31,28,31'; Line3 = '31,59,90'; var R: Range; Direction, Separator, Format: OleVariant; begin Doc := Word.ActiveDocument; R := Word.Selection.Range; Direction := wdCollapseEnd; R.Collapse(Direction); R.InsertAfter(Line1); R.InsertParagraphAfter; R.InsertAfter(Line2); R.InsertParagraphAfter; R.InsertAfter(Line3); R.InsertParagraphAfter; Separator := ','; Format := wdTableFormatGrid1; R.ConvertToTable(Separator, EmptyParam, EmptyParam, EmptyParam, Format, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Заключение
Приведенная ранее информация позволит вам передавать в Word информацию и
генерировать или заменять документы. Существует также возможность получать из
Word некоторые события для их обработки, но они позволяют только отследить
открытие/закрытие документов, самого Word и активацию OCX-элементов. Поэтому не
думаю, что вам это пригодится, хотя, если народ пожелает…
Автор: Антончук Сергей
Самая
грубая ошибка будет выявлена, лишь когда
программа
пробудет
в производстве по крайней мере полгода.
Из
законов Мэрфи
Разработчики
Delphi позаботились о том,
чтобы сделать удобной работу по
СОМ-технологии с наиболее часто
встречающимися программами, и Word,
разумеется, входит в это число. При
установке Delphi 6 инсталлятор
задает вопрос, для какой версии Word
(97 или 2000) устанавливать компоненты
связи с СОМ-сервером. Принципиальной
разницы между версиями Word
с точки зрения СОМ-технологии нет: все,
что работает в 97-й версии, будет работать
и в 2000, и в XP (Delphi
7 имеет специальные компоненты для Word
XP).
Рис. 4 – Зависший
Word в списке процессов.
Для
подключения к основным СОМ-серверам на
закладке «Servers» палитры компонентов
имеются компоненты для Word,
Excel, PowerPoint,
Access, Outlook,
и т.д. ().
Рис. 5 – Страница
Servers палитры компонентов
в Delphi.
Следует
отметить, что для подключения к СОМ-серверу
вовсе необязательно использовать
предлагаемые компоненты. Скажем, для
работы с AutoCAD в Delphi
нет соответствующего компонента, но
это нисколько не помешает нам подключиться
к нему (см. п. 7).
Поместим
на форму невизуальные компоненты
WordApplication,
WordDocument,
WordFont
и WordParagraphFormat.
Их функции представлены на Рис. 6.
Компонент WordApplication
обеспечивает собственно подключение
к Word, открытие и сохранение
документов. Компонентов типа WordDocument
может быть несколько, каждый из них
соответствует одному документу, открытому
в Word. Компоненты WordFont
и WordParagraphFormat
отвечают за форматирование текущего
абзаца и текущего шрифта в документе.
Для
задания параметров, передаваемых
непосредственно методам СОМ-сервера,
используется специальный тип данных
OLEVariant.
Если мы работаем только с компонентами
вроде WordFont
и WordParagraphFormat,
тип данных OLEVariant
не нужен. Но при прямом вызове методов
объектов Word без него не
обойтись.
Рис. 6 – Функции
компонентов управления Word’ом.
Поэтому
заведем в нашей процедуре переменную
par
типа OLEVariant.
Далее подключаем компонент WordApplication1
к серверу вызовом его метода Connect,
создаем новый пустой документ, добавив
элемент список документов
(WordApplication1.Documents.Add)
и присвоив ссылку на новый документ
компоненту WordDocument1.
Встроенные константы EmptyPar
используются для
обозначения пустого параметра – в рядке
случаев метод объекта COM-сервера
требует указания множества параметров,
которые нам не нужны, и вместо них можно
просто написать EmptyPar.
Добавление
текста, таблиц, графики в документ
выполняется не совсем обычным образом.
В Word применено понятие
выделенного фрагмента
(selection), сокращенно ВФ. ВФ – это или
выделенная блоком часть документа, если
такое выделение присутствует, или
положение текстового курсора в документе
(так называемая точка вставки). В нашем
случае ВФ – это положение курсора.
Объект Selection
относится к компоненту WordApplication,
а не WordDocument,
так как вводить текст можно только в
один активный документ.
Простейший
способ добавить текст – использовать
метод WordApplication1.selection.InsertAfter(текст).
Переход на новую строчку выражается
символом с кодом 13. Далее документ
сохраняется в файл с указанным именем,
Word закрывается и наша
программа отключается от СОМ-сервера.
Следует
иметь в виду, что работа с СОМ-сервером
– дело небыстрое. Вывод даже простого
отчета может занять несколько десятков
секунд. Поэтому желательно информировать
пользователя о ходе процесса и о его
завершении.
procedure
TForm1.Button1Click(Sender: TObject);
var
par:OLEVariant;
begin
//
подключение к Word
WordApplication1.Connect;
//
Создание
нового
документа
и
подключение
к
нему
WordDocument1 WordDocument1.ConnectTo(WordApplication1.Documents.Add
(EmptyParam,EmptyParam,EmptyParam,EmptyParam));
// Добавление
текста
в
Word
WordApplication1.selection.InsertAfter(‘Результаты
работы
гениальной
программы
студента
Б.
Гейтса’+#13);
par:=ExtractFilePath(Application.ExeName)+’out.doc’;
//
Сохранение документа
WordDocument1.SaveAs(par);
//
Закрытие документа в Word
WordDocument1.Close;
//
Завершение работы с документом
WordDocument1.Disconnect;
//
Закрытие Word
WordApplication1.Quit;
//
Завершение сеанса работы с Word
WordApplication1.Disconnect;
MessageDlg(‘Вывод
отчета завершен’,mtInformation,[mbOK],0)
end;
Соседние файлы в папке 2 семестр
- #
- #
- #
- #