Использование LotusScript и средств автоматизации для интеграции IBM Lotus Notes с Microsoft Office

Изучите новые приемы, которые вы сможете применить к приложениям пакета Microsoft Office, таким как Microsoft Excel, для публикации информации в базе данных IBM Lotus Notes в разных форматах.

Майк Маруни, инженер по программному обеспечению, IBM  

Майк Маруни (Mike Maroney) – инженер по программному обеспечению в подразделении технической поддержки продуктов семейства IBM Lotus. Он является сертифицированным разработчиком Lotus Notes, начиная с версии 3, и создал ряд реальных приложений с использованием приемов, описанных в этой статье. Указанные приложения применяются в компаниях из разных стран, входящих в список Fortune 500. Вы можете обратиться к нему по следующему адресу: maroney@us.ibm.com.



16.07.2009

Введение

Потребность в публикации

Большинство разработчиков Lotus Notes знакомо с ограничениями на публикацию в Lotus Notes. В своей деятельности вы могли неоднократно сталкиваться с необходимостью решения таких задач как составление стандартных писем на основе данных из приложений Lotus Notes, создание отчетов с определенным форматированием, поддержка таких функций как сводные таблицы, и т.д. Это примеры задач, которые невозможно решить стандартными средствами Lotus Notes.

Один из способов решения подобных задач, который часто упускают из виду, состоит в использовании пакета Microsoft Office для публикации информации, хранящейся в базах данных Lotus Notes. Концепции, представленные в этой статье, могут быть применены для совместного использования данных с другими приложениями (такими, например, как Lotus SmartSuite®). Тем не менее, основное внимание этого документа направлено на публикацию с помощью приложения Microsoft Word.

Требования и ограничения

Для использования кода, приведенного в листингах этого документа, у вас должно быть установлено соответствующее приложение (в указанных примерах в качестве такого приложения используется Microsoft Word). Все приведенные примеры написаны как активизируемые пользователем агенты, исполняющиеся на локальной системе.

Две представленные в этом документе методики создания ссылок на другие приложения не поддерживаются при использовании операционных систем OS/2, UNIX®, Linux® и Macintosh.

И, наконец, корпорация Microsoft не рекомендует (и не поддерживает) использование OLE-автоматизации на серверной стороне. Вместо этого вы можете рассмотреть возможность публикации своего контента с использованием XML-файлов в форматах с открытым исходным кодом. Для получения дополнительной информации обратитесь к документу Microsoft Support Article 257757 (EN).

Допущения

В данной статье предполагается, что вы знакомы с LotusScript® и с концепцией объектных моделей.

Для просмотра объектной модели приложения Microsoft Office выполните следующие шаги.

  1. Откройте приложение и нажмите клавиши ALT + F11. Откроется Редактор Visual Basic.
  2. В меню View выберите пункт Object Browser. Этот шаг позволяет просмотреть полный список объектов и ассоциированные с ними свойства и методы. В данную статью включены примеры фрагментов кода. Кроме того, предоставляется «учебная» база данных, которую вы сможете загрузить.

Начало работы

Создание ссылок на приложения Microsoft Office

Первый шаг в реализации совместного использования данных Lotus Notes и других приложений состоит в получении ссылки на целевое приложение. В языке LotusScript имеются две функции, которые обеспечивают эту возможность:

CreateObject( className )
GetObject( pathName, [ className ] )

По каждой из этих функций вы можете найти дополнительную информацию, включая примеры, в справочной базе данных Lotus Domino® Designer Help:

http://www.ibm.com/developerworks/lotus/documentation/ (EN)

Функция CreateObject создает ссылку на объект OLE-автоматизации, представленный параметром className. Ниже приведены имена некоторых классов Microsoft Office:

  • Word.Application
  • Excel.Application
  • Access.Application
  • PowerPoint.Application
  • MSProject.Application

Каждое приложение предназначено для определенной цели и может быть использовано для публикации информации различными способами. Например, приложение Microsoft Excel может использоваться для публикации данных о продажах и для создания таблиц. Приложение Microsoft Project может использоваться для демонстрации задач на временной шкале.

Как указывалось выше, основное внимание этой статьи концентрируется на использовании приложения Microsoft Word для публикации данных. Для запуска и создания программного дескриптора для приложения Microsoft Word используйте следующий код:

Dim wordApp as Variant
Set wordApp = CreateObject(“Word.Application”)
wordApp.Visible = True

Функция GetObject предоставляет ссылку на уже исполняемое приложение. Параметр pathName может быть пустой строкой или может ссылаться на какой-либо файл. Если вы ссылаетесь на файл, то параметр className не требуется, поскольку необходимая информация определяется типом файла.

В обеих функциях вы получаете ссылку на указанное вами приложение. С этого момента вы можете начать контролировать это приложение посредством LotusScript, выполняя такие действия как создание или открытие документов, пересылка текста, форматирование текста и т.д.

Последняя строка предыдущего фрагмента кода делает приложение видимым. В общем случае этот шаг выполняется после того, как ваш код закончит исполняться, однако он может оказаться полезным в процессе разработки и при проведении отладки. Если приложение является видимым, вы можете осуществить пошаговое прохождение по каждой строке программного кода в соответствии с порядком его исполнения.

Создание нового документа Microsoft Word

Продолжая предыдущий фрагмент кода, вы можете передать текст в приложение Microsoft Word, используя для этого язык LotusScript. Сначала, однако, вам необходимо получить ссылку на новый документ в приложении Word. Воспользуйтесь следующим кодом:

Dim wordDoc as Variant
Set wordDoc = wordApp.Documents.Add()

Во второй строке осуществляется переход вниз по объектной модели Microsoft Word от объекта приложения к набору документов в этом приложении. Теперь воспользуйтесь методом add, который создает новый документ и возвращает ссылку на него.

Наилучший источник для доступных объектов и ассоциированных с ними методов и свойств – это целевое приложение. В качестве примера запустите приложение Microsoft Word, а затем выберите в меню Сервис – Макрос – Редактор Visual Basic (или нажмите клавиши Alt + F11). После того как этот Редактор откроется, выберите в меню View – Object Browser (или нажмите клавишу F2). Выберите объект Application, который является объектом верхнего уровня, после чего на правой панели будут показаны ассоциированные с этим объектом члены (рисунок 1).

Рисунок 1. Object Browser
Рисунок 1. Object Browser

Использование метода select

Объект документа содержит множество методов, которые вы можете просмотреть. Однако прежде, чем вы начнете вводить текст в этот документ, следует подумать о местонахождении курсора. Даже в том случае, когда вы выполняете действия с документом программным способом, приложение Microsoft Word ведет себя так, как будто человек взаимодействует с ним «в ручном режиме».

Например, когда вы создаете новый документ в Microsoft Word, курсор демонстрируется в верхней строке страницы. То же самое происходит, когда вы создаете документ программным способом. Поэтому, давайте рассмотрим метод Select.

Dim cursor as Variant
Set cursor = wordApp.Selection

Приведенные выше две строки кода реализуют ссылку на объект Selection. Теперь вы можете использовать объект Selection для ввода текста в документ «печатным» образом.

Ввод текста «печатным» образом

Объект Selection включает метод TypeText, который используется для передачи последовательности символов в документ, начиная с текущего местоположения курсора:

cursor.TypeText(“Hello, world!”)

Этот код передает широко применяемую текстовую строку «Hello, world!» в активный документ, начиная с текущего местоположения курсора.

Форматирование

При необходимости форматирования текста в приложении Microsoft Word вы выбираете нужный фрагмент текста, после чего применяете к нему нужные изменения форматирования. Предположим, вы хотите выделить жирным шрифтом строку «Hello, world!», которую вы только что ввели:

wordDoc.Paragraphs(1).Range.Select
cursor.Font.Bold = True

Первая строка кода выбирает первый параграф в вашем документе. Вторая строка применяет форматирование жирным шрифтом к выбранному фрагменту.

Использование закладок

Приложение Microsoft Word имеет опцию под названием Закладка (Bookmark), с помощью которой пользователь может создавать метки для различных позиций в своем документе. Эта опция позволяет пользователю быстро перейти к нужному месту посредством выбора в меню пунктов Правка – Перейти... В качестве разработчика вы также можете использовать эту опцию для рационализации перемещений по документу и ссылок на него.

В коде, показанном в листинге 1, сначала вы создаете три секции, потом создаете закладку для каждой из них, а затем используете эти закладки для указания мест, где вы хотите вставить текст.

Листинг 1. Создание и использование закладок
For counter = 1 To 3
	selection.typetext "This is Section Header " & Cstr(counter)
	selection.typeparagraph
	selection.typeparagraph
	selection.moveup
	selection.moveup
	selection.expand wdParagraph
	Set bookmarks(counter) = worddoc.bookmarks.add("SectionHeader" & 
	Cstr(counter), selection.range)
	selection.moveend wdStory
	selection.collapse wdCollapseEnd
Next

selection.goto wdGoToBookmark, , , "SectionHeader1"
selection.movedown
selection.typetext "This text is associated with the first section...."
selection.goto wdGoToBookmark, , , "SectionHeader2"
selection.movedown
selection.typetext "This text is associated with the second section...."
selection.goto wdGoToBookmark, , , "SectionHeader3"
selection.movedown
selection.typetext "This text is associated with the third section...."

И, наконец, вы следуете за процессом, начинающимся с самого высокого уровня объектной модели, и прокладываете свой путь вниз. С помощью переменных Variant вы получаете ссылки на разные объекты, которые вы часто используете. Рассмотрите полный код, показанный в листинге 2. Вы можете скопировать и вставить этот код в своего агента, после чего с помощью отладчика LotusScript осуществить пошаговое прохождение по нему, чтобы увидеть, как он работает.

Листинг 2. Пример программного кода «HelloWorld!»
‘Dimension the variables
Dim wordApp as Variant
Dim wordDoc as Variant
Dim cursor as Variant

‘Get references to OLE objects
On Error Resume Next
Set wordApp = GetObject(“Word.Application”)
If wordApp Is Nothing Then
	Set wordApp = CreateObject(“Word.Application”)
End If
wordApp.Visible = True
Set wordDoc = wordApp.Documents.Add()
Set cursor = wordApp.Selection

‘Pass text to the new document and format it
cursor.TypeText(“Hello, world!”)
wordDoc.Paragraphs(1).Range.Select
cursor.Font.Bold = True

Более сложные примеры

В трех следующих разделах описывается использование более сложных функций приложения Microsoft Word, включая таблицы, диалоговые окна и стандартные письма. Вы можете использовать таблицы, чтобы организовать свою информацию; кроме того, таблицы применяются при составлении стандартных писем. Диалоговые окна позволяют вам получить входную информацию от пользователя. Например, вы можете предложить пользователю указать, где должен быть сохранен какой-либо файл.

Создание и использование таблиц

Таблицы в Microsoft Word предлагают вам возможность согласовать и организовать свои данные. В случае составления стандартных писем вы задаете источник данных, в качестве которого обычно используется документ с таблицей. Каждая строка в этой таблице представляет собой запись, а каждый столбец – поле.

Пример в листинге 3 показывает добавление новой таблицы с одной строкой и семью столбцами. Каждый столбец заполнен именем поля.

Листинг 3. Вставка таблицы
	Set tbl = worddoc.tables.add(selection.range, 1, 7)
	'Set up the header row of the table
	With tbl
		.cell(1, 1).select
		selection.typetext "Title"
		.cell(1, 2).select
		selection.typetext "FirstName"
		.cell(1, 3).select
		selection.typetext "LastName"
		.cell(1, 4).select
		selection.typetext "OfficeStreetAddress"
		.cell(1, 5).select
		selection.typetext "OfficeCity"
		.cell(1, 6).select
		selection.typetext "OfficeState"
		.cell(1, 7).select
		selection.typetext "OfficeZip"
		.rows.last.select
	End With

Для повышения наглядности вы также можете отформатировать эту таблицу. В приложении Microsoft Word для измерения применяются так называемые «пункты». Для упрощения своей работы вы можете создать функцию, которая будет переводить дюймы в пункты, умножая число дюймов на 72 (один дюйм составляет 72 пункта). Код, показанный в листинге 4, использует такую функцию для настройки ширины столбца. В этом примере также используется константа с именем wdAdjustNone, имеющая значение 0. Хотя это встроенная константа приложения Microsoft Word, вы должны декларировать свои собственные константы.

Листинг 4. Настройка ширины столбца
	'Format column widths
	With tbl
		.columns(1).setwidth InchesToPoints(.6), wdAdjustNone
		.columns(2).setwidth InchesToPoints(1), wdAdjustNone
		.columns(3).setwidth InchesToPoints(1), wdAdjustNone
		.columns(4).setwidth InchesToPoints(1.6), wdAdjustNone
		.columns(5).setwidth InchesToPoints(1), wdAdjustNone
		.columns(6).setwidth InchesToPoints(1), wdAdjustNone
		.columns(7).setwidth InchesToPoints(1), wdAdjustNone
	End With

Использование общих диалоговых окон

Microsoft Word обеспечивает свободный доступ к общим диалоговым окнам, таким как Сохранить как… (Save As). Вы можете использовать их, вызывая метод Word.Application.Dialogs.Show и указывая, какое окно вы хотите отобразить. Например, в следующем фрагменте кода демонстрируется диалоговое окно Save As, которое позволяет пользователям указать, где и c каким именем файла они хотят сохранить свой документ.

rc = wordobj.dialogs(wdDialogFileSaveAs).Show

В этом примере переменная rc получает возвращаемое значение вызова dialogs().Show. В таблице 1 показаны возможные возвращаемые значения.

Таблица 1. Возможные возвращаемые значения диалогового окна File - Save As
Возвращаемое значениеОписание
-2Кнопка Close
-1Кнопка OK
0 (zero)Кнопка Cancel
> 0 (zero)Командная кнопка: 1 – первая кнопка, 2 – вторая кнопка и так далее.

Создание стандартного письма

Microsoft Word обладает превосходными возможностями по составлению стандартных писем. Стандартное письмо генерируется посредством создания соответствующей формы и последующего связывания этой формы с документом – источником данных. Документ-источник содержит несколько записей (обычно в виде таблицы) и полей, которые вставляются в упомянутую выше форму. После завершения этой процедуры вы можете объединить данные в виде нового документа или послать их непосредственно на принтер.

Показанный в листинге 5 пример может быть использован для выбора документов о каких-либо лицах из адресной книги Lotus Notes Personal Address Book и последующего экспорта их в документ Microsoft Word – источник данных, используемый для заполнения формы стандартного письма.

ПРИМЕЧАНИЕ. Некоторые декларации переменных были удалены вследствие пространственных ограничений. Для получения полного исходного текста загрузите прилагаемый файл примера, ссылка на который указана в разделе Загрузка.

Листинг 5. Создание стандартного письма
Option Public
Option Explicit
%INCLUDE "LSCONST.LSS"

Dim w As notesuiworkspace
Dim uiview As notesuiview
Dim col As notesdocumentcollection, doc As notesdocument
Dim tbl As Variant
Dim maindoc As Variant
Dim path As String
Dim rc As Integer

Dim wordobj As Variant
Dim worddoc As Variant
Dim selection As Variant, range As Variant


Sub Initialize
	Set w = New notesuiworkspace
	Set uiview = w.currentview
	Set col = uiview.documents
	If col.count = 0 Then 
		Msgbox "No documents selected!", MB_OK + MB_ICONINFORMATION, "Error"
		End
	End If
	
	Set wordobj = createobject("Word.Application")
	wordobj.visible = True
	Set worddoc = wordobj.documents.add()
	Call worddoc.content.select()
	Set selection = wordobj.selection()
	Call selection.collapse()
	path = wordobj.Options.DefaultFilePath(wdDocumentsPath)
	
	Call CheckForExistingFiles
	
	Call FormatMailMergeSource
	
	Set doc = col.getfirstdocument
	Do Until doc Is Nothing
		Call PopulateData
		Set doc = col.getnextdocument(doc)
	Loop
	
	Msgbox "Your data source has been created.  You now need to identify 
	where you wish to save this file.", _
	MB_OK + MB_ICONINFORMATION, "Save the Data Source"
	rc = wordobj.dialogs(wdDialogFileSaveAs).Show
	If (rc = 0) Or (rc = -2) Then
		Msgbox "You have cancelled your mail merge.", 
		MB_OK + MB_ICONINFORMATION, "Operation Cancelled"
		End
	End If
	
	Call CreateMailMergeMain
	
End Sub

Sub FormatMailMergeSource()
	'Page layout
	With worddoc.pagesetup
		.topmargin = inchestopoints(.4)
		.bottommargin = inchestopoints(.4)
		.leftmargin = inchestopoints(.4)
		.rightmargin = inchestopoints(.4)
	End With
	Set tbl = worddoc.tables.add(selection.range, 1, 7)
	'Set up the header row of the table
	With tbl
		.cell(1, 1).select
		selection.typetext "Title"
		.cell(1, 2).select
		selection.typetext "FirstName"
		.cell(1, 3).select
		selection.typetext "LastName"
		.cell(1, 4).select
		selection.typetext "OfficeStreetAddress"
		.cell(1, 5).select
		selection.typetext "OfficeCity"
		.cell(1, 6).select
		selection.typetext "OfficeState"
		.cell(1, 7).select
		selection.typetext "OfficeZip"
		.rows.last.select
	End With
	'Format column widths
	With tbl
		.columns(1).setwidth InchesToPoints(.6), wdAdjustNone
		.columns(2).setwidth InchesToPoints(1), wdAdjustNone
		.columns(3).setwidth InchesToPoints(1), wdAdjustNone
		.columns(4).setwidth InchesToPoints(1.6), wdAdjustNone
		.columns(5).setwidth InchesToPoints(1), wdAdjustNone
		.columns(6).setwidth InchesToPoints(1), wdAdjustNone
		.columns(7).setwidth InchesToPoints(1), wdAdjustNone
	End With
	selection.collapse wdCollapseStart
End Sub

Sub PopulateData()
	tbl.rows.last.select
	selection.insertrowsbelow 1
	With tbl.rows.last
		.cells(1).range.insertafter doc.Title(0)
		.cells(2).range.insertafter doc.FirstName(0)
		.cells(3).range.insertafter doc.LastName(0)
		.cells(4).range.insertafter doc.OfficeStreetAddress(0)
		.cells(5).range.insertafter doc.OfficeCity(0)
		.cells(6).range.insertafter doc.OfficeState(0)
		.cells(7).range.insertafter doc.OfficeZip(0)
	End With
End Sub

Sub CreateMailMergeMain()
	Set maindoc = wordobj.documents.add()
	Call LinkMainAndSource
	Msgbox "Your main document has been created.  You now need to 
	identify where you wish to save this file.", _
	MB_OK + MB_ICONINFORMATION, "Save the Main Document"
	rc = wordobj.dialogs(wdDialogFileSaveAs).Show
	If (rc = 0) Or (rc = -2) Then
		Msgbox "You have cancelled your mail merge.", 
		MB_OK + MB_ICONINFORMATION, "Operation Cancelled"
		End
	End If
End Sub

Sub CheckForExistingFiles()
	If isFile(path & "\Source.doc") Then Kill path & "\Source.doc"
	If isFile(path & "\Main.doc") Then Kill path & "\Main.doc"
End Sub

Function isFile(Byval sFileName As String) As Integer
	Dim lFileLength As Long
	On Error Resume Next
	
	isFile = False
	If Dir$(sFileName, ATTR_NORMAL) <> "" Then
		lFileLength = Filelen(sFileName)
		If (lFileLength > 0) Then isFile = True
	End If
End Function

Sub LinkMainAndSource
	maindoc.MailMerge.OpenDataSource worddoc.path & "\" & 
	worddoc.name, False, False, True
End Sub

Function InchesToPoints(inches As Double) As Long
	InchesToPoints = inches*72
End Function

При генерации стандартного письма этот листинг опирался на некоторые из предыдущих разделов. Вы можете использовать подобный код при создании стандартных писем для отсылки клиентам сведений о новых продуктах, балансов текущих счетов или приглашений для участия в специальных программах.


Заключение

Описанные выше приемы могут быть использованы и при работе с другими приложениями пакета Microsoft Office, например, Microsoft Excel. Если у вас установлено соответствующее программное обеспечение, вы можете использовать подобные приемы для публикации информации базы данных Lotus Notes в различных форматах. Не забывайте, что в каждом приложении доступен обозреватель Object Explorer, который предоставляет ценную документацию об объектной модели с соответствующими примерами.


Благодарности

Автор выражает благодарность Джошу Шерману (Josh Sherman), сотруднику подразделения технической поддержки продуктов Lotus, за технический обзор данной статьи.


Приложение. Описание учебного приложения

В состав учебного приложения Lotus Notes, ссылка на которое включена в раздел «Загрузка» этой статьи, входят следующие агенты.

  • Базовый пример. Этот агент представляет собой вездесущий пример «Hello, world!», который посылает соответствующую текстовую строку в новый документ Microsoft Word.
  • Методы согласования. Часть A. Этот и следующий агенты работают совместно для демонстрации возможных приемов согласования. Агент A вводит порцию текста, форматирует ее, затем вставляет символ «новая строка» (hard return). Этот агент демонстрирует, как форматирование переносится вниз, на следующий параграф.
  • Методы согласования. Часть B. Этот и предыдущий агенты работают совместно для демонстрации возможных приемов согласования. Агент B вводит порцию текста, затем вставляет символ «новая строка», вводит следующую порцию текста, затем возвращается назад и форматирует исходный текст.
  • Пример использования закладок. Этот агент создает три секции и помечает их закладками, а впоследствии использует эти закладки для вставки текста.
  • Составление стандартных писем. Этот агент позволяет пользователю выбрать один или более документов Lotus Notes в базе данных People, а затем создает документ Microsoft Word – источник данных, создает главный документ, связанный с этим источником данных, и, наконец, генерирует стандартное письмо в Microsoft Word. Агент настраивает документ – источник данных и главный документ, после чего пользователь должен создать форму письма и вставить поля, используя для этого обычные процедуры составления стандартных писем в Microsoft Word.

Загрузка

ОписаниеИмяРазмер
Образец кодаMSOffice.nsf1MB

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus
ArticleID=413606
ArticleTitle=Использование LotusScript и средств автоматизации для интеграции IBM Lotus Notes с Microsoft Office
publish-date=07162009