利用 LotusScript 實現用 Lotus Domino 的數據生成圖形化的 Excel 報表

引言

總所周知,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 圖形化報表的要點和技巧

  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 自身報表功能不強是個很大的補充,通過這種方法,可以輕鬆開發出很多功能強大的報表程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章