1. 程式人生 > >VB開啟Excel檔案

VB開啟Excel檔案

    用EXCEL物件讀取EXCEL檔案中資料.然後通過ADODB連線SQL進和匯入
    下面是EXCEL物件的詳解

1 前言

    做為一種簡捷、系統的 Windows應用程式開發工具,VB具有強大的資料處理功能,提供了多種資料訪問方法,可以方便地存取Microsoft SQL Server、Oracle、XBase等多種資料庫,被廣泛應用於建立各種資訊管理系統。但是,VB缺乏足夠的、符合中文習慣的資料表格輸出功能,雖然使用Crystal Report控制元件及 Crystal Reports程式可以輸出報表,但操作起來比較麻煩,中文處理能力也不理想。Excel在表格方面有著強大的功能,我們可以用VB編寫直接控制Excel操作的程式,方法是用VB的OLE自動化技術獲取Excel的控制控制代碼,從而直接控制Excel的一系列操作。本文結合自己的實踐和體會,談談如何在VB6.0應用程式中呼叫Exce12000,供大家參考。

2 Excel物件模型

    為了在VB應用程式中呼叫Excel,必須要了解Excel物件模型。Excel物件模型描述了Excel的理論結構,所提供的物件很多,涉及VB呼叫Excel時最可能用到的物件有:(見Microsoft Excel物件的文章)

3 呼叫Excel

    在VB應用程式中呼叫Excel,實質是將Excel作為一個外部物件來引用,由Excel物件模型提供能從VB應用程式內部來程式化操縱的物件以及相關的屬性、方法和事件。

3.1 在VB工程中新增對Excel型別庫的引用

    為了能從VB應用程式中訪問Excel豐富的內部資源,使Excel應用程式執行得更快,需要在VB工程中新增對Excel型別庫的引用。具體步驟如下:
    1) 在VB應用程式中呼叫Excel,你的計算機系統中必須安裝Excel。從VB5“工程”選單中選擇“引用”;
    2) 在“引用”對話方塊中選擇Excel型別庫:"Microsoft Excel9.0 Object Library"


    3) 單擊左邊小方框,使之出現“√”符號;
    4) 按“確定”退出。

3.2 引用Application物件

    Application物件是Excel物件模型的頂層,表示整個Excel應用程式。在VB應用程式中呼叫Excel,就是使用Application物件的屬性、方法和事件。為此,首先要宣告物件變數:
  Dim VBExcel As Object
    或直接宣告為Excel物件:
  Dim VBExcel As Excel.Application
    在宣告物件變數之後,可用CreateObject函式或GetObject函式給變數賦值新的或已存在的Application物件引用。

1)用CreateObject函式生成新的物件引用:
  Set VBExcel=CreateObject ("Excel.Application")
    字串“Excel.Application”是提供Excel應用程式的程式設計ID,這個變數引用Excel應用程式本身。

2)用GetO場ect函式開啟已存在的物件引用:
  Set AppExcel=GetObject("Temp.XLS")
    上面語句開啟檔案Temp.XLS。

3)Application物件常用的屬性、方法

Visible屬性,    取True或False,表明Excel應用程式是否可見。
Left,Top屬性,   Excel視窗的位置;
Height, Width屬,性Excel視窗的大小;
WindowState屬性,指定視窗的狀態;
Quit方法,       退出Microsoft Excel;
Calculate方法,  重新計算所有開啟的工作簿、工作表或單元格。
Evaluate方法,   求值數學表示式並返回結果。

3.3 使用Excel應用程式

    下面分類給出其中常用的屬性和方法。
1)使用工作薄
    Workbook物件代表Excel應用程式中當前開啟的一個工作簿,包含在Workbooks集合中。可以通過Workbooks集合或表示當前活動工作簿的Active Workbook物件訪問Workbook物件。

常用的方法有:
Add方法:     建立新的空白工作簿,並將其新增到集合中。
Open方法:    開啟工作簿。
Activate方法:啟用工作簿,使指定工作簿變為活動工作簿,以便作為Active Workbook物件使用。
Save方法:    按當前路徑和名稱儲存現有工作簿(如是首次儲存,則將其儲存到預設名稱中,如BOOK1.XLS)。
SaveAs方法:  首次儲存工作簿或用另一名稱儲存工作簿。
Close方法:   關閉工作簿。
PrintOut方法:列印工作簿,語法為:
    PrintOut (from, To, Copies, Preview, Printer, ToFile, Collate)
    可選引數:
    From:列印的起始頁號,如省略將從起始位置開始列印。
    To:列印的終止頁號,如省略將列印至最後一頁。
    Copies:要列印的份數,如省略將只打印一份。
    Preview:如果為True則Excel列印指定物件之前進行列印預覽。如果為False或省略則立即列印該物件。
    Printer:設定活動印表機的名稱。
    ToFile:如果為True則列印輸出到檔案。
    Collate:如果為True則逐份列印每份副本。
    下面語句將活動工作簿的2到5頁列印3份:
    ActiveWorkbook.PrintOut From:=2 To 5 Copies:=3

2)使用工作表
    Sheets集合表示工作簿中所有的工作表。可以通過Sheets集合來訪問、啟用、增加、更名和刪除工作表。一個Worksheet物件代表一個工作表。

常用的屬性、方法有:
Worksheets屬性:返回Sheets集合。
Name屬性:      工作表更名。
Add方法:       建立新工作表並將其新增到工作簿中。
Select方法:    選擇工作表。
Copy方法:      複製工作表。
Move方法:      將指定工作表移到工作簿的另一位置。
Delete方法:    刪除指定工作表。
PrintOut方法:  列印工作表。

    示例:將C盤工作簿中的工作表複製到A盤工作簿中:
    Dim VBExcel As Excel.Application
    Set VBExcel=CreateObject("Excel.Application")
    With VBExcel
        Workbooks.Open "C:\Temp\Ex1.XLS"
        Workbooks.Open"A:\Ex2.XLS"
        Workbooks("Ex1.XLS").Sheets ("Sales").Copy
        Workbooks("Ex2.XLS")
        Workbooks("Ex2.XLS").Save
        Workbooks("Ex1.XLS").Close
        Workbooks("Ex2.XLS").Close
        Quit
    End With

3)使用單元範圍
Range物件,    代表工作表的某一單元格、某一行、某一列、某一選定區域或者某一三維區域。
常用的屬性、方法有:
Range屬性:    Range (arg)其中arg為A1樣式符號,表示單個單元格或單元格區域。
Cells屬性:    Cells (row, col )(其中row為行號,col為列號)表示單個單元格。
ColumnWidth屬性:  指定區域中所有列的列寬。
Rowl3eight屬性:   指定區域中所有行的行寬。
Value屬性:    指定區域中所有單元格的值(預設屬性)。
Formula屬性:  指定單元格的公式,由A1--樣式引用。
Select方法:   選擇範圍。
Copy方法:     將範圍的內容複製到剪貼簿。
C1earContents方法:    清除範圍的內容。
Delete方法:           刪除指定單元範圍。

4)使用圖表
Chart物件,  代表工作簿中的圖表。該圖表既可為嵌人式圖表(包含於ChartObject物件中)也可為分立的圖表工作表。
常用方法有:
Add方法:        新建圖表工作表,返回Chart物件。
PrineOut方法:   列印圖表。
ChartWizard方法:修改給定圖表的屬性,其語法為:
    ChartWizard(Source, Gallery, Format, P1otBy, CategoryLabels, SeriesLabels, HasLegend, Title, CategoryTitle, ValueTitle, ExtraTitle)
    其中:
    Source:包含新圖表的源資料的區域。如省略,將修改活動圖表工作表或活動工作表中處於選定狀態的嵌人式圖表。
    Gallery:圖表型別,其值可為下列常量之一:xlArea, x1Bar, xlColumn, xlLine, x1Pie, xlRadar,x1XYScatter,         xlCombination, x13DArea, x13Dbar,x13DColumn, x13DLine, x13Dpie,x13 Dsurface,xlDoughnut或xlDefaultAutoFormat。
    Format:內建自動套用格式的編號。如省略,將選擇預設值。
    P1otBy:指定系列中的資料是來自行(xlRows)還是列(xlColumns)。
    CategoryLabels:表示包含分類標誌的源區域內行數或列數的整數。
    SeriesLabels:表示包含系列標誌的源區域內行數或列數的整數。
    HasLegend:若指定True,則圖表將具有圖例。
    Title:圖表標題文字。
    CategoryTitle:分類軸標題文字。
    ValueTitle:數值軸標題文字。
    ExtraTitle:三維圖表的系列軸標題,或二維圖表的第二數值軸標題。
    可組合使用Add方法和ChartWizard方法,以建立包含工作表中資料的圖表工作表。下例基於工作表“Sheetl”中單元格區域“A1:A20”中的資料生成新的折線圖並列印。
    With Charts.Add
        ChartWizard source:=Worksheets ("sheet1").Range_
            ("a1:a20"),gallery:=xlLine, title:=“折線圖表”
        Printout
    End With

5)使用Excel工作表函式
    在VB語句中可使用大部分的Excel工作表函式,可通過WorksheetFunction物件呼叫Excel工作表函式。下面的Sub過程用Min工作表函式求出指定區域中單元格的最小值,並通過訊息框顯示結果值。
    Sub UserFunction()
        Dim myRange As Range
        Set myRange=Worksheets ("Sheet1").Range("B2:F10")
        answer=Application.WorksheetFunction.Min(myRange)
        MsgBox answer
    End Sub
    如果使用以區域引用為引數的工作表函式,必須指定一個Range物件。如可用Match工作表函式對A1:A10區域的所有單元格進行搜尋。
    Sub FindFirst()
        myVar=Application.WorksheetFunction.Match_
            (9,orksheets( 1).Range("A1:A10"),0)
        MsgBox myVar    
    End Sub
    要在單元格中插人工作表函式,可將該函式指定為對應於Range物件的Formula屬性值。在以下示例中,將當前工作簿Sheetl內A1:B3區域的Formula屬性指定為RAND工作表函式(此函式產生二個隨機數)。
    Sub InsertFormula()
        Worksheets ("Sheet1" ).Range("A1:B3").Formula="RAND()"
    End Sub
    以上簡要介紹了Excel物件模型中部分物件及其屬性和方法,更詳細的資訊可參閱Excel 2000幫助中的“Microsoft Excel Visual Basic參考”一節的內容。實際上,Microsoft Office家族的Word,PowerPoint, Access和Project等應用程式都可以在VB應用程式中呼叫,其原理和步驟完全相同,只是其物件模型有所不同而已。

4、示例:
    首先建立一個窗體(FORM1),在窗體中加入一個DATA控制元件和一按鈕,引用Microsoft office/9.shtml' target='_blank' >Excel型別庫:從"工程"選單中選擇"引用"欄;選擇Microsoft Excel 9.0 Object Library;選擇"確定"。

    在FORM的LOAD事件中加入:
    Data1.DatabaseName = 資料庫名稱
    Data1.RecordSource = 表名
    Data1.Refresh
    在按鈕的CLICK事件中加入
    Dim Irow, Icol As Integer
    Dim Irowcount, Icolcount As Integer
    Dim Fieldlen() "存欄位長度值
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add
    Set xlSheet = xlBook.Worksheets(1)
    With Data1.Recordset.MoveLast
        If .RecordCount < 1 Then
            MsgBox ("Error 沒有記錄!")
            Exit Sub
        End If
        Irowcount = .RecordCount "記錄總數
        Icolcount = .Fields.Count "欄位總數
        ReDim Fieldlen(Icolcount).MoveFirst
        For Irow = 1 To Irowcount + 1
            For Icol = 1 To Icolcount
                Select Case Irow
                Case 1 "在Excel中的第一行加標題
                    xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1).Name
                Case 2 "將陣列FIELDLEN()存為第一條記錄的欄位長
                    If IsNull(.Fields(Icol - 1)) = True Then
                        Fieldlen(Icol) = LenB(.Fields(Icol - 1).Name)
                    Else
                        Fieldlen(Icol) = LenB(.Fields(Icol - 1))
                    End If
                    xlSheet.Columns(Icol).ColumnWidth = Fieldlen(Icol)
                    xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1)
                Case Else
                    Fieldlen1 = LenB(.Fields(Icol - 1))
                    If Fieldlen(Icol) < Fieldlen1 Then
                        xlSheet.Columns(Icol).ColumnWidth = Fieldlen1
                        Fieldlen(Icol) = Fieldlen1
                    Else
                        xlSheet.Columns(Icol).ColumnWidth = Fieldlen(Icol)
                    End If
                    xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1)
                End Select
            Next
            If Irow <> 1 Then
                If Not .EOF Then .MoveNext
            End If
        Next
        With xlSheet
            .Range(.Cells(1, 1), .Cells(1, Icol - 1)).Font.Name = "黑體"
            .Range(.Cells(1, 1), .Cells(1, Icol - 1)).Font.Bold = True
            .Range(.Cells(1, 1), .Cells(Irow, Icol - 1)).Borders.LineStyle = xlContinuous
        End With
        xlApp.Visible = True
        xlBook.Save
        Set xlApp = Nothing
    End With