利用 LotusScript 灵活操作 Lotus Notes 富文本域

陈 斌, 高级 软件工程师, IBM
陈 云, 软件工程师, IBM
 
简介: 本文介绍了如何利用 LotusScript. 来灵活操作 Lotus Notes 富文本域(Rich Text Field)里的内容,并提供了几个示例程序来进行展示。要求读者有 LotusScript. 编程经验并能熟练使用 Lotus Domino Designer。
 
 

引言

一直以来,Lotus Notes 的富文本域都是使用非常频繁的,几乎在任何 Domino 应用程序中,都会用到富文本域。Lotus Notes 富文本域的功能也非常强大,除了支持普通的文本以外,还支持图片、表格、嵌入对象、Http 链接、Notes 链接、附件等等众多的类型。但是有个问题一直长期困扰着 LotusScript. 开发人员,那就是对 Notes 富文本域里面的各种类型的内容的灵活操作很困难,其实 Domino 在不断升级的过程中,已经增加了许多新的 LotusScript. 类来操作 Notes 富文本域了,但是很多 LotusScript. 开发人员对此并不熟悉。本文将介绍如何使用这些类来灵活操作富文本域。

操作 Notes 富文本域相关的 LotusScript. 类

和操作 Notes 富文本域相关的 LotusScript. 类包括:

  • NotesRichTextNavigator 富文本域的导航器,用来访问富文本域中的各种元素;
  • NotesRichTextRange 表示富文本域内容的一个范围,可以包括多个元素;
  • NotesRichTextDocLink 表示富文本域内容的文档链接;
  • NotesEmbeddedObject 表示嵌入式对象或者文件附件;
  • NotesRichTextSection 表示富文本域中的一个区段;
  • NotesRichTextTable 表示富文本域中的表格;
  • NotesRichTextStyle. 表示富文本的各种属性;
  • NotesRichTextParagraphStyle. 表示富文本段落的各种属性;
  • NotesColorObject 表示一种颜色。

使用示例

下面我们通过一个程序来分析各个类的使用方法。

首先我们建立一个空白的 Domino 应用程序,然后建立一个名为“test”的表单,这个表单中只有一个名为“Body”的富文本域,然后在缺省视图里面建立一个 Action 名为“test”,代码如下。这段程序将生成一个文档,文档中包含一个富文本域,并在富文本域中生成各种元素。


清单 1. 生成各种元素
Sub Click(Source As Button)

    Dim s As New NotesSession

    Dim db As NotesDatabase

    Dim doc As NotesDocument

    Set db  =  s.CurrentDatabase

    Set doc = New NotesDocument(db)

    doc.Form. = "test"

    Dim rtf As NotesRichTextItem 

    Set rtf = doc.CreateRichTextItem ("Body")

    

    '生成一个文本段落并设置其字体大小,颜色等属性

    Dim style. As NotesRichTextStyle. Set style. = s.CreateRichTextStyle. Dim pstyle. As NotesRichTextParagraphStyle. Set pstyle. = s.CreateRichTextParagraphStyle. Dim color As NotesColorObject

    Set color  = s.CreateColorObject

    style.FontSize = 20

    style.Bold = True

    pstyle.Alignment = ALIGN_LEFT

    pstyle.FirstLineLeftMargin = RULER_ONE_INCH

    Call color.SetRGB(123, 234, 123) 

    style.NotesColor = color.NotesColor

    Call rtf.AppendStyle(style)

    Call rtf.AppendParagraphStyle(pstyle)

    Call rtf.AppendText("这是一个文本段落,靠左对齐。")

    Call rtf.AddNewline(1)

    

    '生成一个数据库链接,链接到当前数据库

    Call rtf.AppendDocLink(db, "链接到当前数据库", "当前数据库")

    

    '生成一个包含一个表格的区段

    Call rtf.AppendStyle(style)

    Call rtf.BeginSection("这是一个区段", style, color, True)

    Call rtf.AppendText("这是区段的开始")

    iRow% = 3

    iCol% = 3

    style.NotesColor = COLOR_BLUE

    Call rtf.AppendStyle(style)

    '添加一个3X3的表格

    Call rtf.AppendTable(iRow%, iCol%)    

    Call rtf.AppendText("这是区段的结束")

    Call rtf.EndSection

    Dim nav As NotesRichTextNavigator

    Set nav = rtf.CreateNavigator

    Call nav.FindFirstElement(RTELEM_TYPE_TABLECELL) 

    style.FontSize=16

    style.Bold=False

    Call rtf.AppendStyle(style)

    For i% = 1 To iRow%

        For j% = 1 To iCol%

            Call rtf.BeginInsert(nav)

            Call rtf.AppendText("行 " & i% & ", 列 " & j%)

            Call rtf.EndInsert

            Call nav.FindNextElement(RTELEM_TYPE_TABLECELL)

        Next

    Next

    

    '添加一个附件

    Call rtf.EmbedObject(EMBED_ATTACHMENT, "", "C:\Documents and Settings\All Users\

        Documents\My Pictures\Sample Pictures\Water lilies.jpg")

    

    Call doc.Save(True,True)

End Sub

下面的图片是运行这个程序后生成的文档截图:


图 1. 程序生成文档图
图 1. 程序生成文档图

下面将分析一下这个程序中使用的一些方法。

  • NotesSession.CreateRichTextStyle:创建一个 NotesRichTextStyle. 对象。
  • NotesSession.CreateRichTextParagraphStyle:创建一个 NotesRichTextParagraphStyle. 对象。
  • NotesSession.CreateColorObject:创建一个 NotesColorObject 对象。

    需要注意的是 NotesRichTextStyle,NotesRichTextParagraphStyle. 和 NotesColorObject 这三种对象是不能用 New 来创建的,因为这三个类没有 New() 方法,只能通过 NotesSession 来创建。

  • NotesRichTextItem.AppendStyle:在当前位置插入一个格式对象,该位置以后的格式都使用这种格式,直到插入了另外一个格式。
  • NotesRichTextItem.AppendParagraphStyle:在当前位置插入一个段落格式对象,该位置以后的段落格式都使用这种格式,直到插入了另外一个段落格式。
  • NotesRichTextItem.BeginSection:在富文本域中插入一个区段。
  • NotesRichTextItem.EndSection:区段结束,必须和 BeginSection 配对使用。

    在两个方法之间可以通过各种 append 方法添加各种元素。插入区段的时候,区段总是在富文本域的最后。还需要注意的是不能创建一个包含富文本域中已有的元素的区段,通过 BeginSection 方法创建的区段总是空的,区段的内容需要通过程序自己添加。

  • NotesRichTextItem.CreateNavigator:创建一个富文本域导航器对象 NotesRichTextNavigator。

    创建一个富文本域导航器只能使用这种方法,NotesRichTextNavigator 也没有 new 方法。也可以 NotesRichTextRange.Navigator 属性来得到一个 NotesRichTextNavigator 对象。

  • NotesRichTextNavigator 类是用来灵活访问操作富文本域里的内容的最重要的一个类,通过它的一些方法,可以方便的访问到各种富文本域中的元素。

    导航器对象 NotesRichTextNavigator 会维护一个当前位置,任何在富文本域中的 get 或者 find 的操作都可能会改变这个当前位置。导航总发生在同一种类型的元素中,主要通过 find 和 get 两类方法来访问相应的元素,找到需要的元素后,再通过 get 方法来取得这个元素。下表列出了这些方法。


表 1. 方法列表
方法名 描述
FindFirstElement 将当前位置移动到指定类型的第一个元素
FindNextElement 将当前位置移动到指定类型的下一个元素
FindLastElement 将当前位置移动到指定类型的最后一个元素
FindNthElement 将当前位置移动到指定类型的第 n 个元素
FindFirstString 将当前位置移动到第一个指定字符串的开头
FindNextString 将当前位置移动到下一个指定字符串的开头
GetElement 返回当前位置的元素
GetFirstElement 返回第一个指定类型的元素
GetLastElement 返回最后一个指定类型的元素
GetNextElement 返回下一个指定类型的元素
GetNthElement 返回第 n 个指定类型的元素

NotesRichTextItem.BeginInsert:将插入位置从富文本域结尾处改为指定元素的开始或者结尾处。

NotesRichTextItem.EndInsert:将插入位置重置到富文本域的结尾处,需要和 BeginInsert 配对使用。

在两个方法之间可以通过各种 append 方法添加各种元素。我们来看看 BeginInsert 的具体使用方法:

Call notesRichTextItem.BeginInsert( element, [ after ] )

参数说明

element:可以是 NotesEmbeddedObject, NotesRichTextDocLink, NotesRichTextNavigator, NotesRichTextRange, NotesRichTextSection, 或者 NotesRichTextTable,表示该对象的位置 . 如果是 NotesRichTextNavigator 则表示此 NotesRichTextNavigator 对象所表示的当前位置。

After:布尔型可选参数,True 表示插入位置在元素的末尾,False(缺省值)表示插入位置在元素的开头。

通过上面的简单的例子,我们可以看到如何利用 LotusScript. 来操作富文本域,下面我们通过另外一个例子来展示如何利用 LotusScript. 来实现一个简单的类似 Word 中将一段文本和表格互相转换的功能,主要展示的是如何利用 NotesRichTextRange 类来操作富文本域中的文本段落。

首先建一个表单 test,表单中创建一个 Body 的富文本域,然后创建一个表单操作名为 Text2Table,完成将文本转化为表格的功能。代码如下:


清单 2 将文本转化为表格
Sub Click(Source As Button)

    Dim s As New NotesSession

    Dim ws As New NotesUIWorkspace

    Dim uidoc As NotesUIDocument

    Set uidoc = ws.CurrentDocument

    Dim doc As NotesDocument

    Set doc = uidoc.Document

    Dim rtf As NotesRichTextItem

    Set rtf = doc.GetFirstItem("Body")

    '设定分隔符为空格

    delimiter$ =  " "

    rowcount% = 0

    colcount% =  0

    Dim rtnav As NotesRichTextNavigator

    Set rtnav = rtf.CreateNavigator

    Dim rtrange As NotesRichTextRange

    Dim rows() 

    Dim paraArray As Variant

    Dim paraStr As String

    Dim firstTime As Boolean

    firstTime = True

    

    If rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL) Then

        Msgbox "表格已经存在!"

        Exit Sub

    End If

    If rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH) Then

        Set rtrange = rtf.CreateRange

        Do

            '设置文本范围的开始为rtnav所指向的位置

            Call rtrange.SetBegin(rtnav)

            '取得该位置的文本段落

            paraStr = rtrange.TextParagraph

            paraArray = Split(paraStr)

            '通过firstTime来判断文本段落的格式是否能转化为表格

            If firstTime Then

                colcount% = Ubound(paraArray)

                firstTime = False

            Else

                If colcount% <> Ubound(paraArray) Then

                    Msgbox "文本无法转化为表格!"

                    Exit Sub

                End If

            End If

            '定义动态数组来保存所有的文本段落

            Redim Preserve rows(rowcount%)

            rows(rowcount%) = paraArray

            rowcount% = rowcount% + 1

        Loop While rtnav.FindNextElement(RTELEM_TYPE_TEXTPARAGRAPH)

    Else

        Messagebox "富文本域中没有文本"

        Exit Sub

    End If

    '将富文本域值清空

    rtf.Values = ""

    rowcount% = rowcount% - 1

    '插入表格,并将保存的文本依次插入相应的表格单元

    Dim row As Variant

    Call rtf.AppendTable(rowcount%+1, colcount%+1)

    Call rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL)

    For i% = 0 To rowcount%

        row = rows(i%)

        For j% = 0 To colcount%

            Call rtf.BeginInsert(rtnav)

            Call rtf.AppendText(row(j%))

            Call rtf.EndInsert

            Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)

        Next

    Next

    '保存文档并重新打开以刷新

    Call doc.Save(True, True)

    Call uidoc.Close(True)

    Call ws.EditDocument(False,doc)

    

End Sub

再建立一个表单操作名为 Table2Text,完成将表格转化为文本的功能。代码如下:


清单 3 将表格转化为文本
Sub Click(Source As Button)

    Dim s As New NotesSession

    Dim ws As New NotesUIWorkspace

    Dim uidoc As NotesUIDocument

    Set uidoc = ws.CurrentDocument

    Dim doc As NotesDocument

    Set doc = uidoc.Document

    Dim rtf As NotesRichTextItem

    Set rtf = doc.GetFirstItem("Body")

    

    delimiter$ =  " "

    Dim rtnav As NotesRichTextNavigator

    Set rtnav = rtf.CreateNavigator

    Dim rtrange As NotesRichTextRange

    Set rtrange = rtf.CreateRange

    Dim tbl As NotesRichTextTable

    Dim rowcount As Integer

    Dim colcount As Integer

    

    If rtnav.FindFirstElement(RTELEM_TYPE_TABLE) Then

        Set tbl = rtnav.GetElement

        rowcount = tbl.RowCount - 1

        colcount = tbl.ColumnCount - 1

        Redim data(rowcount, colcount)

        For i% = 0 To rowcount

            For j% = 0 To colcount

                Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)

                Call rtrange.SetBegin(rtnav)

                If j% = colcount Then

                    Call rtf.AppendText(rtrange.TextParagraph )

                Else

                    Call rtf.AppendText(rtrange.TextParagraph & delimiter$)

                End If

            Next

            If i% < rowcount Then

                '生成新的段落

                Call rtf.AddNewline(1)

            End If

        Next

    Else

        Messagebox "富文本域中没有表格"

        Exit Sub

    End If

    

    Call tbl.Remove

    Call doc.Save(True, True)

    Call uidoc.Close(True)

    Call ws.EditDocument(False,doc)    

End Sub

运行结果如下图:


图 2. 文本格式
图 2. 文本格式

图 3. 表格格式
图 3. 表格格式 

总结

通过以上本文的介绍和示例及代码分析,相信读者对如何操作 Notes 富文本域已经有了了解,我们可以看到 LotusScript. 的强大功能,通过灵活运用适当的类,可以完成很多我们认为不能完成的功能,希望本文对读者有所启发和帮助。

你可能感兴趣的:(script)