全面簡述VB.NET excel對象原理
用過VB的程序設(shè)計人員都知道,要想用VB輸出復(fù)雜的表格來,是十分困難的。能不能用VB.NET excel對象呢?最近筆者為單位開發(fā)“土工試驗數(shù)據(jù)整理”的某個模塊時,涉及到復(fù)雜數(shù)據(jù)表格的輸出問題,經(jīng)過筆者的摸索,用VB調(diào)用EXCEL,取得了很好的效果。本文從編程實踐的角度對使用VB控制EXCEL的技術(shù)作簡要說明。
1. EXCEL的對象模型
如果一個應(yīng)用程序支持自動化技術(shù),那么其它的應(yīng)用就可以通過其暴露的對象,對它進(jìn)行控制,控制程序稱為客戶機,而被控制的一方就稱為服務(wù)器,被控制的對象就是Active對象。VB正是通過EXCEL顯露的各級對象來控制EXCEL工作的。每個對象都有各自的方法和屬性,通過方法可以實現(xiàn)對對象的控制,而屬性則可以改變對象的各種狀態(tài)。
理解EXCEL的對象模型是對其編程的基礎(chǔ)。EXCEL是以層次結(jié)構(gòu)組織對象的,其對象模型中含有許多不同的對象元素,這些對象元素就是VB.NET excel對象可以操縱的。在EXCEL對象的層次結(jié)構(gòu)中,最頂層是Application對象,是Excel本身。從該對象開始往下依次是:
- .workbooks對象集,是Application對象的下層,其指的是Excel的工作簿文件。
- .worksheets對象集,是Workbooks對象集的下層,它表示的是Excel的一個工作表。
- .Cells和Range對象,它們是worksheets對象的下層,它則指向Excel工作表中的一個或多個單元格。
以上介紹的四個對象是VB.NET excel對象中最重要也是用得最多的對象,而且從上面的介紹中也不難看出,要控制Excel中的某個具體對象,如某個工作簿中某一表格中的單元格,就必須從Excel層次結(jié)構(gòu)對象的最上層即Application對象開始遍歷。
2 .Excel對象的使用
application對象的使用
如前所述,Application對象位于Excel層次結(jié)構(gòu)對象的最上層,它代表的是Excel自身,我們的應(yīng)用程序理應(yīng)從Application對象的建立開始。VB控制Excel的啟動方式有幾種,在這里我們使用了API調(diào)用,可以確保目前系統(tǒng)中只有一個Excel副本在運行,程序代碼和說明如下:
- Option Explicit
- Public xlapp As Object‘Excel對象
- Public xlbook As Object‘工作簿
- Public xlsheet As Object‘工作表
- Declare Function FindWindow Lib "user32" Alias _
- "FindWindowA" (ByVal lpClassName As String, _
- ByVal lpWindowName As Long) As Long
- Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
- (ByVal hwnd As long,ByVal wMsg As Long, ByVal wParam As Long, lParam_
- As Any) As_ Long
以上是公有變量和API函數(shù)應(yīng)在模塊中聲明。
- Sub GetExcel()
- Dim MyXL As Object '用于存放Microsoft Excel 引用的變量。
- Dim ExcelWasNotRunning As Boolean '用于最后釋放的標(biāo)記。
- On Error Resume Next '延遲錯誤捕獲。
- '不帶第一個參數(shù)調(diào)用 Getobject 函數(shù)將返回對該應(yīng)用程序的實例的引用。
- '如果該應(yīng)用程序不在運行,則會產(chǎn)生錯誤。
- Set MyXL = GetObject(, "Excel.Application")
- If Err.Number <> 0 Then ExcelWasNotRunning = True
- Err.Clear '如果發(fā)生錯誤則要清除 Err 對象。
- '檢測 Microsoft Excel。如果 Microsoft Excel 在運行,則將其加入運行對象表。
- DetectExcel'該過程檢測并登記正在運行的 Excel
- '設(shè)置其 Application 屬性,顯示 Microsoft Excel。
- '然后使用 MyXL 對象引用的 Windows 集合,顯示包含該文件的實際窗口。
- MyXL.Application.Visible = True
- MyXL.Parent.Windows(1).Visible = True
- '如果在啟動時,Microsoft Excel 的這份副本不在運行中,
- '則使用 Application 屬性的 Quit 方法來關(guān)閉它。
- '注意,當(dāng)試圖退出 Microsoft Excel 時,
- '標(biāo)題欄會閃爍,并顯示一條消息詢問是否保存所加載的文件。
- If ExcelWasNotRunning = True Then
- MyXL.Application.Quit
- End If
- Set MyXL = Nothing '釋放對該應(yīng)用程序和電子數(shù)據(jù)表的引用。
- End Sub
- '該過程檢測并登記正在運行的 Excel。
- Sub DetectExcel()
- Const WM_USER = 1024
- Dim hwnd As Long
- '如果 Excel 在運行,則該 API 調(diào)用將返回其句柄。
- hwnd = FindWindow("XLMAIN", 0)
- If hwnd = 0 Then '0 表示沒有 Excel 在運行。
- Exit Sub
- Else
- 'Excel 在運行,因此可以使用 SendMessage API'函數(shù)將其放入運行對象表。
- SendMessage hwnd, WM_USER + 18, 0, 0
- End If
- End Sub
有了Application對象,就可以非常方便地訪問Excel應(yīng)用程序中的其它對象,以及這此對象的屬性和方法。
【編輯推薦】