技术开发 频道

LotusScript实现Excel报表自动生成和操作


用 LotusScript 访问 Excel

    LotusScript 除开可以访问 Notes 数据库当中的资源以外,还可以访问某些外部的文件资源。Excel? 是 Office? 家族当中一个重要成员,在数据记录和统计领域十分常用,其本身也是一款数据库软件。在 LotusScript 当中,实现了一些 OLE 接口来访问和操作 Excel,从而可以在 Notes 数据库当中实现对 Excel 文件的操作和访问。

    在 LotusScript 当中,提供了访问 Excel 文件,以及其他外部资源的方法,开发人员只需要简单的调用一些脚本函数,就可以方便的实现自动操作 Excel 的功能。下面,本文结合一个实例,一步一步的介绍用 LotusScript 访问和操作 Excel 的方法。

例子描述

    现在我们考虑一个简单的应用实例:有一个存放普通文档的数据库,不断会有人更新和添加一些文档在里面,现在需要给这个数据库添加一个代理程序,让它定期自动运行,例如一个礼拜运行一次,将这个礼拜当中新添加的文档的摘要内容取出来放到一个 Excel 文件里面,然后对这个报表进行单元格的自动对齐等操作,最后将这个 Excel 文件以电子邮件附件的形式发送到特定的若干地址当中去。

打开一个 Excel 对象

    运行这样的程序,必须在机器上安装 Excel,这样 LotusScript 才可以操作 Excel。这里,Notes 数据库只需要在一台机器(服务器)上运行即可,也就是说,只需要在服务器上面装上 Excel 程序就可以了。

    要打开一个 Excel 对象,需要用到 LotusScript 里面的 CreateObject 方法,这个方法打开一个 OLE 对象,我们可以在方法调用的时候指定对象类型:

xlApp As Variant '创建一个新的 Excel 应用实例,对应一个 Excel 文件 Set xlApp = CreateObject("Excel.application") '在这个 Excel 文件当中添加一个 Sheet xlApp.Workbooks.Add xlApp.Visible = True

    LotusScript 是一种语法比较松散的脚本语言,类似于 VB,为了避免代码的逻辑混乱,我们可以利用 LotusScript 里面的面向对象的特性,将处理 Excel 操作的代码统一写到一个类里面,这样既便于维护,也可以最大程度的避免代码冗余,提高代码的重用性。

    一般的,我们用 Script 库共享代码的方式来实现一个类:在 Domino Designer 的 “Script库” 里面点击“新建 LotusScript 库”就可以新建一个空的共享脚本,我们定名字为 “ExcelUtil”,希望在里面存放所有需要的 Excel 操作代码;然后,我们在(Declarations)方法里面写下全局的类定义如下:

Class ExcelReport Private xlApp As Variant '其他变量…… Sub new() '创建一个新的 Excel 应用实例,对应一个 Excel 文件 Set xlApp = CreateObject("Excel.application") '在这个 Excel 文件当中添加一个 Sheet xlApp.Workbooks.Add xlApp.Visible = True End Sub '其他方法可以往下继续添加…… End Class

    我们可以用类似 Java 的语言思想来看待这段类定义的代码:这个类的名称叫做 ExcelReport,意为一个类的实例对应于一个 Excel 文件,其中私有的变量 xlApp 对应 Excel 文件,构造函数 new() 则实现了 Excel 对象和 Sheet 的初始化。我们以后更多的操作方法可以追加在后面,实现更多的功能。

    有了这个共享的类,我们就可以考虑实现业务逻辑了。在 Domino Designer 的“代理”里面,按照本文前面提到的方式,我们创建一个简单的代理 “ReportGenerator”,然后,在(Options)方法里面,我们引入那个共享的类:

Use "ExcelUtil"

    这样就可以在这个代理里面使用共享的 ExcelReport 类了。随后,我们在 Initialize 方法里面通过 ExcelUtil 里面的类定义并初始化一个 Excel 对象:

'定义 ExcelReport 类的实例,表示一个 Excel 对象 Dim report As ExcelReport '调用构造函数,初始化 Set report = New ExcelReport

操作 Excel 对象

    对 Excel 对象的简单操作主要是通过调用上述 ExcelReport 类当中的 xlApp 变量的特定方法来实现的。

    我们都知道,Excel 文件的基本数据单元就是一个个的“单元格”,由于所有单元格默认都是为空且存在的,所以对单元格没有“添加”和“删除”操作(要删除一个单元格的内容,只要写入一个空字符串即可)。所以,简单说来,操作 Excel 文件,就是对单元格的定位与读写,而不是“增删改”模式。要定位一个单元格,只要知道 “sheet”、“row” 和 “column” 三个参数就可以了;而简单说来,单元格的内容可以统一认为是一个字符串。下面的函数实现了对一个单元格的读写:

Function insertData(intSheet As Integer,row As Integer,column As Integer,value As String) '1.定位单元格,在第一个 Excel 文件的第 intSheet 个(从1开始) ' sheet 里面的行列号为 row 和 column 的单元格 '2.用字符串 value 来填充单元格 xlApp.Workbooks(1).Worksheets( intSheet ).Cells( row , column ).Value = value End Function Function getData( intSheet As Integer , row As Integer , column As Integer ) As String '得到第一个 Excel 文件的第 intSheet 个(从1开始)sheet 里面的行列号为 row 和 column 的单元格的值 getData = xlApp.Workbooks(1).Worksheets( intSheet ).Cells( row , column ).Value End Function

    上述代码很简单,仅仅调用了一句 xlApp 对应 OLE 对象的方法就实现了定位与读写。当然,我们还需要对以上方法添加错误处理代码,具体关于错误处理的内容介绍超出了本文的范围,请参考 LotusScript 的相关资料。

    此外,我们应该注意到,通过上述方法创建的 Excel 对象还是在内存当中的,并没有保存为文件,我们需要添加一个保存文件的方法 “saveFile” 来保存它。最后,我们还应该为这个 ExcelReport 类实现一个退出的方法 “doQuit”,用来关闭和释放 Excel 对象的资源。

    这样,我们就得到了如下完整的 ExcelReport 类:

Class ExcelReport
Private xlApp As Variant
Sub new()
'创建一个新的 Excel 应用实例,对应一个 Excel 文件
        Set xlApp = CreateObject("Excel.application")
'在这个 Excel 文件当中添加一个 Sheet
        xlApp.Workbooks.Add
xlApp.Visible = True
End Sub
Function saveFile(strFilePath As String)
'保存 Excel 文件到硬盘指定位置
        xlApp.ActiveWorkbook.SaveAs( strFilePath )
End Function
Function insertData(intSheet As Integer,row As Integer,column As Integer,value As String)
On Error Goto err_hdl
'1.定位单元格,在第一个 Excel 文件的第 intSheet 个(从1开始)sheet 里面的
        '  行列号为 row 和 column 的单元格
        '2.用字符串 value 来填充单元格
        xlApp.Workbooks(1).Worksheets( intSheet ).Cells( row , column ).Value = value
Exit Function
err_hdl:
Print Error$ + "in cls: ExcelReport , method: insertData , at line " + Cstr( Erl )
Exit Function
End Function
Function getData( intSheet As Integer , row As Integer , column As Integer ) As String
On Error Goto err_hdl
'得到第一个 Excel 文件的第 intSheet 个(从1开始)sheet 里面的行列号为 row 和 column 的单元格的值
        getData = xlApp.Workbooks(1).Worksheets( intSheet ).Cells( row , column ).Value
Exit Function
err_hdl:
Print Error$ + "in cls: ExcelReport , method: getData , at line " + Cstr( Erl )
getData = ""
Exit Function
End Function
Function doQuit
'关闭资源
        xlApp.Quit
'资源释放
        Set xlApp = Nothing
End Function
End Class
观看专家视频讲座,了解人员协作信息,赢取免费试用软件。
0
相关文章