zoukankan      html  css  js  c++  java
  • 利用 LotusScript 灵活操作 Lotus Notes 富文本域

    陈 斌, 高级软件工程师, IBM
    刘 芳 (liufang4@cnooc.com.cn), 资深互联网工程师, 中国海洋石油总公司
    陈 云, 软件工程师, IBM

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

    本文的标签:  lotusscript, 应用开发

    发布日期: 2010 年 8 月 02 日
    级别: 初级
    访问情况 : 3131 次浏览
    评论: 0 (查看 | 添加评论 - 登录)

    平均分 4 星 共 12 个评分 平均分 (12个评分)
    为本文评分

    引言

    一直以来,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 的强大功能,通过灵活运用适当的类,可以完成很多我们认为不能完成的功能,希望本文对读者有所启发和帮助。



    下载

    描述 名字 大小 下载方法
    本文样例代码 test.nsf 1 MB HTTP

    关于下载方法的信息


    参考资料

    学习

    讨论

    作者简介

    陈斌是来自 IBM CSTL 的高级软件开发工程师,现在负责 Lotus Domino for IBM i 的开发、支持以及团队领导工作。

    刘芳,中国海洋石油总公司资深互联网工程师, 对 SAP 及 Domino 开发有丰富的经验

    陈云是来自 IBM CSTL 的软件开发工程师,现在从事 Lotus Domino for IBM i 的开发和支持工作。

  • 相关阅读:
    pair
    非整除集合
    集合 set
    实现字通配符*
    vector
    矩阵及其初等变换
    求数组中连续子数组(最少有一个元素)的最大和。
    最长上升序列(Lis)
    st表求区间最大值
    [Noip2015] 信息传递
  • 原文地址:https://www.cnblogs.com/hannover/p/2249712.html
Copyright © 2011-2022 走看看