利用 LotusScript 灵活操作 Lotus Notes 富文本域
引言
一直以來(lái),Lotus Notes 的富文本域都是使用非常頻繁的,幾乎在任何 Domino 應(yīng)用程序中,都會(huì)用到富文本域。Lotus Notes 富文本域的功能也非常強(qiáng)大,除了支持普通的文本以外,還支持圖片、表格、嵌入對(duì)象、Http 鏈接、Notes 鏈接、附件等等眾多的類型。但是有個(gè)問(wèn)題一直長(zhǎng)期困擾著 LotusScript. 開發(fā)人員,那就是對(duì) Notes 富文本域里面的各種類型的內(nèi)容的靈活操作很困難,其實(shí) Domino 在不斷升級(jí)的過(guò)程中,已經(jīng)增加了許多新的 LotusScript. 類來(lái)操作 Notes 富文本域了,但是很多 LotusScript. 開發(fā)人員對(duì)此并不熟悉。本文將介紹如何使用這些類來(lái)靈活操作富文本域。
操作 Notes 富文本域相關(guān)的 LotusScript. 類
和操作 Notes 富文本域相關(guān)的 LotusScript. 類包括:
- NotesRichTextNavigator 富文本域的導(dǎo)航器,用來(lái)訪問(wèn)富文本域中的各種元素;
- NotesRichTextRange 表示富文本域內(nèi)容的一個(gè)范圍,可以包括多個(gè)元素;
- NotesRichTextDocLink 表示富文本域內(nèi)容的文檔鏈接;
- NotesEmbeddedObject 表示嵌入式對(duì)象或者文件附件;
- NotesRichTextSection 表示富文本域中的一個(gè)區(qū)段;
- NotesRichTextTable 表示富文本域中的表格;
- NotesRichTextStyle. 表示富文本的各種屬性;
- NotesRichTextParagraphStyle. 表示富文本段落的各種屬性;
- NotesColorObject 表示一種顏色。
使用示例
下面我們通過(guò)一個(gè)程序來(lái)分析各個(gè)類的使用方法。
首先我們建立一個(gè)空白的 Domino 應(yīng)用程序,然后建立一個(gè)名為“test”的表單,這個(gè)表單中只有一個(gè)名為“Body”的富文本域,然后在缺省視圖里面建立一個(gè) Action 名為“test”,代碼如下。這段程序?qū)⑸梢粋€(gè)文檔,文檔中包含一個(gè)富文本域,并在富文本域中生成各種元素。
清單 1. 生成各種元素
| Sub Click(Source As Button)Dim s As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentSet db = s.CurrentDatabaseSet doc = New NotesDocument(db)doc.Form. = "test"Dim rtf As NotesRichTextItem Set rtf = doc.CreateRichTextItem ("Body")'生成一個(gè)文本段落并設(shè)置其字體大小,顏色等屬性Dim style. As NotesRichTextStyle. Set style. = s.CreateRichTextStyle. Dim pstyle. As NotesRichTextParagraphStyle. Set pstyle. = s.CreateRichTextParagraphStyle. Dim color As NotesColorObjectSet color = s.CreateColorObjectstyle.FontSize = 20style.Bold = Truepstyle.Alignment = ALIGN_LEFTpstyle.FirstLineLeftMargin = RULER_ONE_INCHCall color.SetRGB(123, 234, 123) style.NotesColor = color.NotesColorCall rtf.AppendStyle(style)Call rtf.AppendParagraphStyle(pstyle)Call rtf.AppendText("這是一個(gè)文本段落,靠左對(duì)齊。")Call rtf.AddNewline(1)'生成一個(gè)鏈接,鏈接到當(dāng)前數(shù)據(jù)庫(kù)Call rtf.AppendDocLink(db, "鏈接到當(dāng)前數(shù)據(jù)庫(kù)", "當(dāng)前數(shù)據(jù)庫(kù)")'生成一個(gè)包含一個(gè)表格的區(qū)段Call rtf.AppendStyle(style)Call rtf.BeginSection("這是一個(gè)區(qū)段", style, color, True)Call rtf.AppendText("這是區(qū)段的開始")iRow% = 3iCol% = 3style.NotesColor = COLOR_BLUECall rtf.AppendStyle(style)'添加一個(gè)3X3的表格Call rtf.AppendTable(iRow%, iCol%) Call rtf.AppendText("這是區(qū)段的結(jié)束")Call rtf.EndSectionDim nav As NotesRichTextNavigatorSet nav = rtf.CreateNavigatorCall nav.FindFirstElement(RTELEM_TYPE_TABLECELL) style.FontSize=16style.Bold=FalseCall rtf.AppendStyle(style)For i% = 1 To iRow%For j% = 1 To iCol%Call rtf.BeginInsert(nav)Call rtf.AppendText("行 " & i% & ", 列 " & j%)Call rtf.EndInsertCall nav.FindNextElement(RTELEM_TYPE_TABLECELL)NextNext'添加一個(gè)附件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 |
下面的圖片是運(yùn)行這個(gè)程序后生成的文檔截圖:
圖 1. 程序生成文檔圖
下面將分析一下這個(gè)程序中使用的一些方法。
- NotesSession.CreateRichTextStyle:創(chuàng)建一個(gè) NotesRichTextStyle. 對(duì)象。
- NotesSession.CreateRichTextParagraphStyle:創(chuàng)建一個(gè) NotesRichTextParagraphStyle. 對(duì)象。
- NotesSession.CreateColorObject:創(chuàng)建一個(gè) NotesColorObject 對(duì)象。
需要注意的是 NotesRichTextStyle,NotesRichTextParagraphStyle. 和 NotesColorObject 這三種對(duì)象是不能用 New 來(lái)創(chuàng)建的,因?yàn)檫@三個(gè)類沒有 New() 方法,只能通過(guò) NotesSession 來(lái)創(chuàng)建。
- NotesRichTextItem.AppendStyle:在當(dāng)前位置插入一個(gè)格式對(duì)象,該位置以后的格式都使用這種格式,直到插入了另外一個(gè)格式。
- NotesRichTextItem.AppendParagraphStyle:在當(dāng)前位置插入一個(gè)段落格式對(duì)象,該位置以后的段落格式都使用這種格式,直到插入了另外一個(gè)段落格式。
- NotesRichTextItem.BeginSection:在富文本域中插入一個(gè)區(qū)段。
- NotesRichTextItem.EndSection:區(qū)段結(jié)束,必須和 BeginSection 配對(duì)使用。
在兩個(gè)方法之間可以通過(guò)各種 append 方法添加各種元素。插入?yún)^(qū)段的時(shí)候,區(qū)段總是在富文本域的最后。還需要注意的是不能創(chuàng)建一個(gè)包含富文本域中已有的元素的區(qū)段,通過(guò) BeginSection 方法創(chuàng)建的區(qū)段總是空的,區(qū)段的內(nèi)容需要通過(guò)程序自己添加。
- NotesRichTextItem.CreateNavigator:創(chuàng)建一個(gè)富文本域?qū)Ш狡鲗?duì)象 NotesRichTextNavigator。
創(chuàng)建一個(gè)富文本域?qū)Ш狡髦荒苁褂眠@種方法,NotesRichTextNavigator 也沒有 new 方法。也可以 NotesRichTextRange.Navigator 屬性來(lái)得到一個(gè) NotesRichTextNavigator 對(duì)象。
- NotesRichTextNavigator 類是用來(lái)靈活訪問(wèn)操作富文本域里的內(nèi)容的最重要的一個(gè)類,通過(guò)它的一些方法,可以方便的訪問(wèn)到各種富文本域中的元素。
導(dǎo)航器對(duì)象 NotesRichTextNavigator 會(huì)維護(hù)一個(gè)當(dāng)前位置,任何在富文本域中的 get 或者 find 的操作都可能會(huì)改變這個(gè)當(dāng)前位置。導(dǎo)航總發(fā)生在同一種類型的元素中,主要通過(guò) find 和 get 兩類方法來(lái)訪問(wèn)相應(yīng)的元素,找到需要的元素后,再通過(guò) get 方法來(lái)取得這個(gè)元素。下表列出了這些方法。
表 1. 方法列表
| FindFirstElement | 將當(dāng)前位置移動(dòng)到指定類型的第一個(gè)元素 |
| FindNextElement | 將當(dāng)前位置移動(dòng)到指定類型的下一個(gè)元素 |
| FindLastElement | 將當(dāng)前位置移動(dòng)到指定類型的最后一個(gè)元素 |
| FindNthElement | 將當(dāng)前位置移動(dòng)到指定類型的第 n 個(gè)元素 |
| FindFirstString | 將當(dāng)前位置移動(dòng)到第一個(gè)指定字符串的開頭 |
| FindNextString | 將當(dāng)前位置移動(dòng)到下一個(gè)指定字符串的開頭 |
| GetElement | 返回當(dāng)前位置的元素 |
| GetFirstElement | 返回第一個(gè)指定類型的元素 |
| GetLastElement | 返回最后一個(gè)指定類型的元素 |
| GetNextElement | 返回下一個(gè)指定類型的元素 |
| GetNthElement | 返回第 n 個(gè)指定類型的元素 |
NotesRichTextItem.BeginInsert:將插入位置從富文本域結(jié)尾處改為指定元素的開始或者結(jié)尾處。
NotesRichTextItem.EndInsert:將插入位置重置到富文本域的結(jié)尾處,需要和 BeginInsert 配對(duì)使用。
在兩個(gè)方法之間可以通過(guò)各種 append 方法添加各種元素。我們來(lái)看看 BeginInsert 的具體使用方法:
Call notesRichTextItem.BeginInsert( element, [ after ] )
參數(shù)說(shuō)明
element:可以是 NotesEmbeddedObject, NotesRichTextDocLink, NotesRichTextNavigator, NotesRichTextRange, NotesRichTextSection, 或者 NotesRichTextTable,表示該對(duì)象的位置 . 如果是 NotesRichTextNavigator 則表示此 NotesRichTextNavigator 對(duì)象所表示的當(dāng)前位置。
After:布爾型可選參數(shù),True 表示插入位置在元素的末尾,False(缺省值)表示插入位置在元素的開頭。
通過(guò)上面的簡(jiǎn)單的例子,我們可以看到如何利用 LotusScript. 來(lái)操作富文本域,下面我們通過(guò)另外一個(gè)例子來(lái)展示如何利用 LotusScript. 來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的類似 Word 中將一段文本和表格互相轉(zhuǎn)換的功能,主要展示的是如何利用 NotesRichTextRange 類來(lái)操作富文本域中的文本段落。
首先建一個(gè)表單 test,表單中創(chuàng)建一個(gè) Body 的富文本域,然后創(chuàng)建一個(gè)表單操作名為 Text2Table,完成將文本轉(zhuǎn)化為表格的功能。代碼如下:
清單 2 將文本轉(zhuǎn)化為表格
| Sub Click(Source As Button)Dim s As New NotesSessionDim ws As New NotesUIWorkspaceDim uidoc As NotesUIDocumentSet uidoc = ws.CurrentDocumentDim doc As NotesDocumentSet doc = uidoc.DocumentDim rtf As NotesRichTextItemSet rtf = doc.GetFirstItem("Body")'設(shè)定分隔符為空格delimiter$ = " "rowcount% = 0colcount% = 0Dim rtnav As NotesRichTextNavigatorSet rtnav = rtf.CreateNavigatorDim rtrange As NotesRichTextRangeDim rows() Dim paraArray As VariantDim paraStr As StringDim firstTime As BooleanfirstTime = TrueIf rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL) ThenMsgbox "表格已經(jīng)存在!"Exit SubEnd IfIf rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH) ThenSet rtrange = rtf.CreateRangeDo'設(shè)置文本范圍的開始為rtnav所指向的位置Call rtrange.SetBegin(rtnav)'取得該位置的文本段落paraStr = rtrange.TextParagraphparaArray = Split(paraStr)'通過(guò)firstTime來(lái)判斷文本段落的格式是否能轉(zhuǎn)化為表格If firstTime Thencolcount% = Ubound(paraArray)firstTime = FalseElseIf colcount% <> Ubound(paraArray) ThenMsgbox "文本無(wú)法轉(zhuǎn)化為表格!"Exit SubEnd IfEnd If'定義動(dòng)態(tài)數(shù)組來(lái)保存所有的文本段落Redim Preserve rows(rowcount%)rows(rowcount%) = paraArrayrowcount% = rowcount% + 1Loop While rtnav.FindNextElement(RTELEM_TYPE_TEXTPARAGRAPH)ElseMessagebox "富文本域中沒有文本"Exit SubEnd If'將富文本域值清空rtf.Values = ""rowcount% = rowcount% - 1'插入表格,并將保存的文本依次插入相應(yīng)的表格單元Dim row As VariantCall 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.EndInsertCall rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)NextNext'保存文檔并重新打開以刷新Call doc.Save(True, True)Call uidoc.Close(True)Call ws.EditDocument(False,doc)End Sub |
再建立一個(gè)表單操作名為 Table2Text,完成將表格轉(zhuǎn)化為文本的功能。代碼如下:
清單 3 將表格轉(zhuǎn)化為文本
| Sub Click(Source As Button)Dim s As New NotesSessionDim ws As New NotesUIWorkspaceDim uidoc As NotesUIDocumentSet uidoc = ws.CurrentDocumentDim doc As NotesDocumentSet doc = uidoc.DocumentDim rtf As NotesRichTextItemSet rtf = doc.GetFirstItem("Body")delimiter$ = " "Dim rtnav As NotesRichTextNavigatorSet rtnav = rtf.CreateNavigatorDim rtrange As NotesRichTextRangeSet rtrange = rtf.CreateRangeDim tbl As NotesRichTextTableDim rowcount As IntegerDim colcount As IntegerIf rtnav.FindFirstElement(RTELEM_TYPE_TABLE) ThenSet tbl = rtnav.GetElementrowcount = tbl.RowCount - 1colcount = tbl.ColumnCount - 1Redim (rowcount, colcount)For i% = 0 To rowcountFor j% = 0 To colcountCall rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)Call rtrange.SetBegin(rtnav)If j% = colcount ThenCall rtf.AppendText(rtrange.TextParagraph )ElseCall rtf.AppendText(rtrange.TextParagraph & delimiter$)End IfNextIf i% < rowcount Then'生成新的段落Call rtf.AddNewline(1)End IfNextElseMessagebox "富文本域中沒有表格"Exit SubEnd IfCall tbl.RemoveCall doc.Save(True, True)Call uidoc.Close(True)Call ws.EditDocument(False,doc) End Sub |
運(yùn)行結(jié)果如下圖:
圖 2. 文本格式
圖 3. 表格格式
?
總結(jié)
通過(guò)以上本文的介紹和示例及代碼分析,相信讀者對(duì)如何操作 Notes 富文本域已經(jīng)有了了解,我們可以看到 LotusScript. 的強(qiáng)大功能,通過(guò)靈活運(yùn)用適當(dāng)?shù)念?#xff0c;可以完成很多我們認(rèn)為不能完成的功能,希望本文對(duì)讀者有所啟發(fā)和幫助。
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的利用 LotusScript 灵活操作 Lotus Notes 富文本域的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 动态创建 Web 服务器控件模板
- 下一篇: 30天敏捷结果(2):用三个故事驱动你的