引言
总所周知,Lotus Domino 的功能十分强大,利用 Lotus Designer 可以开发出非常复杂,功能强大的各种 Domino 应用程序。但是 Domino 自己不能生成像 Microsoft Excel 那样的功能丰富的报表,特别是图形化的报表。本文将介绍利用 LotusScript 实现用 Domino 的数据生成图形化的 Excel 报表,并将 Excel 报表集成到 Domino 应用中。整个过程 Excel 应用程序都不会出现,最终用户在前台只会看到 Domino 应用程序,所有和 Excel 的交互都将在后台完成。
回页首
Object Linking and Embedding (OLE) 对象
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 |
回页首
利用 LotusScript 来生成 MicroSoft Excel 图形化报表的要点和技巧
下面通过两个示例来说明如何实现用 Domino 的数据生成图形化的 Excel 报表。
第一个示例:通过 Excel 生成一个简单的饼图并显示在 Domino 应用中。
在 ExcelTest.nsf 中已经存在一个视图 ExcelTest,其中包含了一些文档,每个文档包含人名和其年龄的信息,如下图:
图 1. 视图 ExcelTest
创建一个 Excel 文件,在 A1 到 G2 的矩形区域填写如下数据,然后创建一个饼图,设置其源数据为 A1 到 G2,然后可以设置饼图的其它属性。这个 Excel 文件将作为模板,可以在附件中找到这个模板 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. 生成的饼图
在上面的示例中,年龄段是固定的分为几类,因此在 Excel 模板中可以直接写好,然后可以直接选择好饼图的数据源,如果这个分类是动态的,则上面的办法就不行了,这时候需要用程序来设置一些 Excel 图表的属性。
第二个示例:通过 Excel 生成动态分类的图表并显示在 Domino 应用里面。
这个示例将统计每个中文姓氏的人数并生成统计图表。
创建一个 Excel 文件,然后创建一个图,设置好其属性,比如字体,颜色等,如下图。这个 Excel 文件将作为模板,可以在附件中找到这个模板 Chart2.xls。
图 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 图
回页首
小结
通常上面两个示例,可以发现利用 LotusScript 实现用 Domino 的数据生成图形化的 Excel 报表是很简单的,这样 Excel 被无缝的集成到 Domino 中,Excel 强大的报表功能都能用于 Domino 程序,这对 Domino 自身报表功能不强是个很大的补充,通过这种方法,可以轻松开发出很多功能强大的报表程序。