利用 LotusScript 实现用 Lotus Domino 的数据生成图形化的 Excel 报表

利用 LotusScript 实现用 Lotus Domino 的数据生成图形化的 Excel 报表

简介: Lotus Domino 的功能十分强大,利用 Lotus Designer 可以开发出非常复杂,功能强大的各种 Domino 应用程序。本文将介绍利用 LotusScript. 实现用 Domino 的数据生成图形化的 报表Excel ,并将 Excel 报表集成到 Domino 应用中。

引言

总所周知,Lotus Domino 的功能十分强大,利用 Lotus Designer 可以开发出非常复杂,功能强大的各种 Domino 应用程序。但是 Domino 自己不能生成像 Microsoft Excel 那样的功能丰富的报表,特别是图形化的报表。本文将介绍利用 LotusScript. 实现用 Domino 的数据生成图形化的 Excel 报表,并将 Excel 报表集成到 Domino 应用中。整个过程 Excel 应用程序都不会出现,最终用户在前台只会看到 Domino 应用程序,所有和 Excel 的交互都将在后台完成。

OLE 技术,全称为对象连接与嵌入技术,是一种面向对象的技术,通过定义和实现应用程序作为对象彼此连接的机制,完成应用程序之间的集成。OLE 是在客户应用程序间传输和共享信息的一组综合标准,基于组件对象模型 (COM),现在已经广泛应用于电子表格,字处理,财务软件,项目管理软件等等。

CreateObject 函数和 GetObject 函数

在 LotusScript. 中要创建或者得到 OLE 对象,需要使用 CreateObject 函数或者 GetObject 函数。

CreateObject 函数:

创建一个指定类型的 OLE 对象

语法

CreateObject (className)

参数

className 是一个 appName.appClass 格式的字符串,表示要创建的对象的类型,比如“WordPro.Application”。appName 表示支持 OLE 的应用程序名,appClass 表示要创建的对象的类型

返回值返回一个 OLE 对象的引用

用法

在 LotusScript. 中要用 Set 来把 CreateObject 函数返回的对象引用赋值给一个变体类型(Variant)的变量。

如果该类型的应用程序还没有运行,CreateObject 函数会先启动这个应用程序然后再创建 OLE 对象。OLE 对象引用只在应用程序运行时有效,如果在使用 OLE 对象引用时应用程序退出了,LotusScript. 将抛出一个运行时错误。每一种 OLE 对象都有其自己定义和提供的一套类,通过这些类就可以操作该种应用程序。


示例

Sub Initialize 
	'创建一个 Word.Application 对象
	 Set MyApp = CreateObject ("Word.Application") 
	'设置该对象的 Visible 属性为 True 
	 MyApp.Visible = True 
 End Sub

GetObject 函数:

打开一个应用程序文件包含的 OLE 对象或者返回一个当前活动的指定类型的 OLE 对象。

语法

GetObject ( [pathName] [ , className ] )

参数

pathName 一个包含全路径文件名的应用程序文件或者为空。该应用程序必须支持 OLE。如果为空字符串 (“”) 或者省略,则必须制定 className,并且会返回当期活动的对象。

className 同 CreateObject 的 className 参数。但是可以省略,如果省略,则更具 pathName 来决定返回的 OLE 对象。

返回值返回一个 OLE 对象的引用

用法同 CreateObject


示例

Sub Initialize
    Dim myDoc As Variant
    '从文件得到WordPro.Document对象。 
    Set mydoc = getobject("d:\wordpro\docs\test.lwp","WordPro.Document")
    ' 调用WordPro.Document 对象的Print方法。
    myDoc.Print
End Sub

  1. 确认 Excel 已经正常安装。
  2. 要了解 VBA 相关的代码,可以通过录制宏来生成相应的 VBA 代码,然后在生成的 VBA 代码中修改成自己的代码。这样可以快速的了解要完成某项功能的 VBA 函数,再结合帮助就可以快速了解完成相关功能的函数调用。
  3. 如果用 LotusScript. 直接生成一个图表并且精细调整图表的格式,需要很多和格式调整相关的代码,并且如果以后要再调整格式也需要改代码,这样很不方便。可以直接先用 Excel 画一个已经调整好格式的图表,保存为一个模板以附件方式放到 Domino 应用程序中,然后在需要生成图表的时候解开并打开这个 Excel 表,将相应的数据写入 Excel 表,这样图表就自动生成了,并且要调整格式也很容易。

下面通过两个示例来说明如何实现用 Domino 的数据生成图形化的 Excel 报表。

第一个示例:通过 Excel 生成一个简单的饼图并显示在 Domino 应用中。

在 ExcelTest.nsf 中已经存在一个视图 ExcelTest,其中包含了一些文档,每个文档包含人名和其年龄的信息,如下图:


图 1. 视图 ExcelTest
图 1. 视图 ExcelTest

创建一个 Excel 文件,在 A1 到 G2 的矩形区域填写如下数据,然后创建一个饼图,设置其源数据为 A1 到 G2,然后可以设置饼图的其它属性。这个 Excel 文件将作为模板,可以在附件中找到这个模板 Chart1.xls。


图 2. Chart1.xls 截图
图 2. Chart1.xls 截图

现在创建一个视图操作名为 Generate Chart1,功能是统计各个年龄段(20 以下,20~29,30~39,40~49,50~59,60 及以上)的人数的百分比并以 Chart1.xls 为模板生成 Excel 饼图,如果想生成不同的图表,只需要将模板中的图表格式类型改变并保存即可。代码如下:


清单 1

Sub Click(Source As Button)
    '定义一个数组来保存各个年龄段的人数
    Dim countArr(5) As Integer
    Dim s As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim db As NotesDatabase
    Set db = s.CurrentDatabase
    Dim vw As NotesView
    Set vw = db.GetView("ExcelTest")
    Dim doc As NotesDocument
    Set doc = vw.GetFirstDocument
    '计算各个年龄段人数
    While Not doc Is Nothing
        age% = Cint(doc.Age(0))
        If age%<20 Then
            countArr(0) = countArr(0) + 1
        Elseif age%>=20 And age%<30 Then
            countArr(1) = countArr(1) + 1
        Elseif age%>=30 And age%<40 Then
            countArr(2) = countArr(2) + 1
        Elseif age%>=40 And age%<50 Then
            countArr(3) = countArr(3) + 1
        Elseif age%>=50 And age%<60 Then
            countArr(4) = countArr(4) + 1
        Else            
            countArr(5) = countArr(5) + 1
        End If
        Set doc = vw.GetNextDocument(doc)
    Wend
    '生成Excel图表
    Call generateExcelChart1(countArr, "C:\Chart1.xls")
    
    Dim uiChartDoc As NotesUIDocument
    Set uiChartDoc = ws.ComposeDocument( "", "", "Chart" )
    uiChartDoc.GotoField("Body")
    '将生成的Excel图表粘贴到一个文档中
    Call uiChartDoc.Paste
End Sub

其中生成 Excel 图表的过程 generateExcelChart1() 代码如下:


清单 2

Sub generateExcelChart1(countArr As Variant, excelFileName As String)
    '定义Excel相关变量
    Dim excelApplication As Variant
    Dim excelWorkbook As Variant
    Dim excelSheet As Variant
    '创建Excel对象
    Set excelApplication = CreateObject("Excel.Application")    
    '将Excel程序设置为不可见
    excelApplication.Visible = False
    '打开模版文件
    Set excelWorkbook = excelApplication.Workbooks.Open(excelFileName)
    Set excelSheet = excelWorkbook.Worksheets("Sheet1")
    '为图表填充源数据
    excelSheet.Cells(2,2) = countArr(0)
    excelSheet.Cells(2,3) = countArr(1)
    excelSheet.Cells(2,4) = countArr(2)
    excelSheet.Cells(2,5) = countArr(3)
    excelSheet.Cells(2,6) = countArr(4)
    excelSheet.Cells(2,7) = countArr(5)
    '将生成的图表复制到剪贴板
    excelSheet.ChartObjects(1).Chart.ChartArea.Copy
    '不保存退出Excel应用程序
    excelWorkbook.Close False
    excelApplication.Quit
End Sub

在视图 ExcelTest1 中点击 Generate Chart1 操作,将在 Notes 中生成如下饼图:


图 3. 生成的饼图
图 3. 生成的饼图

在上面的示例中,年龄段是固定的分为几类,因此在 Excel 模板中可以直接写好,然后可以直接选择好饼图的数据源,如果这个分类是动态的,则上面的办法就不行了,这时候需要用程序来设置一些 Excel 图表的属性。

第二个示例:通过 Excel 生成动态分类的图表并显示在 Domino 应用里面。

这个示例将统计每个中文姓氏的人数并生成统计图表。

创建一个 Excel 文件,然后创建一个图,设置好其属性,比如字体,颜色等,如下图。这个 Excel 文件将作为模板,可以在附件中找到这个模板 Chart2.xls。


图 4. Excel 图
图 4. Excel 图

还是在 ExcelTest.nsf 的视图 ExcelTest 中,创建一个视图操作名为 Generate Chart2,功能是根据 Domino 中的个人信息统计姓氏分布并生成统计图表,代码如下:


清单 3

Sub Click(Source As Button)
    '定义一个list来保存各个姓氏的人数
    Dim nameList List As Integer
    Dim s As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim db As NotesDatabase
    Set db = s.CurrentDatabase
    Dim vw As NotesView
    Set vw = db.GetView("ExcelTest")
    Dim doc As NotesDocument
    Set doc = vw.GetFirstDocument
    '计算各个姓氏人数
    While Not doc Is Nothing
        sName$ = Left(doc.Name(0), 1)
        If Iselement (namelist(sName$)) Then
            nameList(sName$) = nameList(sName$) + 1
        Else
            nameList(sName$) = 1
        End If
        Set doc = vw.GetNextDocument(doc)
    Wend
    '生成Excel图表
    Call generateExcelChart2(nameList, "C:\Chart2.xls")
    
    Dim uiChartDoc As NotesUIDocument
    Set uiChartDoc = ws.ComposeDocument( "", "", "Chart" )
    uiChartDoc.GotoField("Body")
    '将生成的Excel图表粘贴到一个文档中
    Call uiChartDoc.Paste
End Sub

其中生成 Excel 图表的过程 generateExcelChart1() 代码如下:


清单 4

Sub generateExcelChart2(nameList As Variant, excelFileName As String)
    '定义Excel相关变量
    Dim excelApplication As Variant
    Dim excelWorkbook As Variant
    Dim excelSheet As Variant
    '创建Excel对象
    Set excelApplication = CreateObject("Excel.Application")    
    '将Excel程序设置为不可见
    excelApplication.Visible = False
    '打开模版文件
    Set excelWorkbook = excelApplication.Workbooks.Open(excelFileName)
    Set excelSheet = excelWorkbook.Worksheets("Sheet1")
    '为图表填充源数据
    excelSheet.Cells(2,1) = "姓氏分布图"
    i% = 2
    Forall counter In nameList
        sName$ = Listtag(counter)
        excelSheet.Cells(1,i%) = sName$
        excelSheet.Cells(2,i%) = counter
        i% = i% + 1
    End Forall
    '设置图表的源数据
    Call excelSheet.ChartObjects("Chart 1").Chart.SetSourceData(
        excelSheet.Range(excelSheet.Cells(1, 1), excelSheet.Cells(2, i%)), 1)
    '将生成的图表复制到剪贴板
    excelSheet.ChartObjects(1).Chart.ChartArea.Copy
    '不保存退出Excel应用程序
    excelWorkbook.Close False
    excelApplication.Quit
End Sub

在视图 ExcelTest1 中点击 Generate Chart2 操作,将在 Notes 中生成如下图表,并且 Excel 在后台运行,整个过程用户不会知道这个操作和 Excel 有关。


图 5. Notes 中生成的 Excel 图
图 5. Notes 中生成的 Excel 图

通常上面两个示例,可以发现利用 LotusScript. 实现用 Domino 的数据生成图形化的 Excel 报表是很简单的,这样 Excel 被无缝的集成到 Domino 中,Excel 强大的报表功能都能用于 Domino 程序,这对 Domino 自身报表功能不强是个很大的补充,通过这种方法,可以轻松开发出很多功能强大的报表程序。

猜你喜欢

转载自blog.csdn.net/vera514514/article/details/9129113
0条评论
添加一条新回复