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

    操作 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. 表格格式 

 

 

本文摘自IBM技术支持文档,原文地址:请点击这里

转载于:https://www.cnblogs.com/haitunzhilian/archive/2010/09/10/1823315.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值