操作 Notes 富文本域相关的 LotusScript 类和操作 Notes 富文本域相关的 LotusScript 类包括:
- NotesRichTextNavigator 富文本域的导航器,用来访问富文本域中的各种元素;
- NotesRichTextRange 表示富文本域内容的一个范围,可以包括多个元素;
- NotesRichTextDocLink 表示富文本域内容的文档链接;
- NotesEmbeddedObject 表示嵌入式对象或者文件附件;
- NotesRichTextSection 表示富文本域中的一个区段;
- NotesRichTextTable 表示富文本域中的表格;
- NotesRichTextStyle 表示富文本的各种属性;
- NotesRichTextParagraphStyle 表示富文本段落的各种属性;
- NotesColorObject 表示一种颜色。
下面我们通过一个程序来分析各个类的使用方法。
首先我们建立一个空白的 Domino 应用程序,然后建立一个名为“test”的表单,这个表单中只有一个名为“Body”的富文本域,然后在缺省视图里面建立一个 Action 名为“test”,代码如下。这段程序将生成一个文档,文档中包含一个富文本域,并在富文本域中生成各种元素。
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
下面的图片是运行这个程序后生成的文档截图:
下面将分析一下这个程序中使用的一些方法。
- 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 方法来取得这个元素。下表列出了这些方法。
方法名 | 描述 |
---|---|
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,完成将文本转化为表格的功能。代码如下:
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,完成将表格转化为文本的功能。代码如下:
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
运行结果如下图:
本文摘自IBM技术支持文档,原文地址:请点击这里