Большинство разработчиков 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 выполните следующие шаги.
- Откройте приложение и нажмите клавиши ALT + F11. Откроется Редактор Visual Basic.
- В меню 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
Объект документа содержит множество методов, которые вы можете просмотреть. Однако прежде, чем вы начнете вводить текст в этот документ, следует подумать о местонахождении курсора. Даже в том случае, когда вы выполняете действия с документом программным способом, приложение 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.nsf | 1MB | HTTP |
- Примите участие в обсуждении материала на форуме.
-
Оригинал статьи: Integrating IBM Lotus Notes with Microsoft Office using LotusScript and automation (EN).
-
Посетите Web-страницу продуктов IBM Lotus Notes and Domino (EN) на ресурсе developerWorks® Lotus.
Майк Маруни (Mike Maroney) – инженер по программному обеспечению в подразделении технической поддержки продуктов семейства IBM Lotus. Он является сертифицированным разработчиком Lotus Notes, начиная с версии 3, и создал ряд реальных приложений с использованием приемов, описанных в этой статье. Указанные приложения применяются в компаниях из разных стран, входящих в список Fortune 500. Вы можете обратиться к нему по следующему адресу: maroney@us.ibm.com.