1. 程式人生 > >通過java呼叫VBS,再用VBS執行Excel中的巨集的例子

通過java呼叫VBS,再用VBS執行Excel中的巨集的例子

(一)  首先需要降低客戶端及伺服器端對於Excel的巨集的安全級別的要求,按照下述的圖示進行操作:

(1)進入巨集的安全級別設定功能

(2) 降低巨集的安全級別

(二)  按照下面程式碼編寫VBS程式碼

Option Explicit

Dim objXLApp

Dim objXLBook

Set objXLApp = WScript.CreateObject("Excel.Application")

‘注意以下的“e/data_test.xls”的位置需要修改為包含巨集的那個excel的實際位置

‘位置需要設定為絕對路徑

Set objXLBook = objXLApp.Workbooks.Open("e:/data_test.xls" )

‘doChangeExcel即為excel中的巨集方法的名稱

objXLApp.Run "doChangeExcel"

'objXLBook.Saved = True

objXLBook.Save

objXLBook.Close

Set objXLBook = Nothing

objXLApp.Quit

Set objXLApp = Nothing

WScript.Quit

(三)  以下是excel中的巨集,僅需要複製到excel的巨集中即可:

'author guoqiang

'date 2007-12-19

Sub doChangeExcel ()

    Dim count

    count = Sheets.count

    Debug.Print count

    For i = 1 To count

        'get the assigned sheet

        Sheets.Item(i).Select

        'get the name of the sheet

        SheetName = ActiveSheet.Name

        protected = ActiveSheet.ProtectContents

        'ptotected = True

        ActiveSheet.Select

        '---------------------------------------

        'if it is Trans_Xcpt sheet, then row 5 is autofilter

        If SheetName = "Trans_Xcpt" Then

            If protected = True Then

                ActiveSheet.Select

                ActiveSheet.Unprotect

                Rows("5:5").Select

                Selection.AutoFilter

            Else

                Rows("5:5").Select

                Selection.AutoFilter

                ActiveSheet.Protect

            End If

        '---------------------------------------

        'if it is MTD_IN sheet, then row 4 is autofilter

        ElseIf SheetName = "MTD_IN" Then

            If protected = True Then

                ActiveSheet.Select

                ActiveSheet.Unprotect

                Rows("4:4").Select

                Selection.AutoFilter

            Else

                Rows("4:4").Select

                Selection.AutoFilter

                ActiveSheet.Protect

            End If

        '---------------------------------------

        'if it is Net_Demand sheet, then row 4 is autofilter

        ElseIf SheetName = "Net_Demand" Then

            If protected = True Then

                ActiveSheet.Select

                ActiveSheet.Unprotect

                Rows("4:4").Select

                Selection.AutoFilter

            Else

                Rows("4:4").Select

                Selection.AutoFilter

                ActiveSheet.Protect

            End If

        '---------------------------------------

        'if it is A_Supply sheet, then row 4 is autofilter

        ElseIf SheetName = "A_Supply" Then

            If protected = True Then

                ActiveSheet.Select

                ActiveSheet.Unprotect

                Rows("4:4").Select

                Selection.AutoFilter

            Else

                Rows("4:4").Select

                Selection.AutoFilter

                ActiveSheet.Protect

            End If

        '---------------------------------------

        'if it is Special_Cell sheet, then row 4 is autofilter

        ElseIf SheetName = "Special_Cell" Then

            If protected = True Then

                ActiveSheet.Select

                ActiveSheet.Unprotect

                Rows("4:4").Select

                Selection.AutoFilter

            Else

                Rows("4:4").Select

                Selection.AutoFilter

                ActiveSheet.Protect

            End If

        '---------------------------------------

        'else, only protect or unprotect

        Else

            If protected = True Then

                ActiveSheet.Select

                ActiveSheet.Unprotect

            Else

                ActiveSheet.Select

                ActiveSheet.Protect

            End If

        End If

        Next i

End Sub

(四)  在java程式碼中進行執行(注意:僅僅支援windows2000以上的系統):

//TODO:其他的程式碼

//以下是執行VBS程式碼

//注意“E:/Temp/vbs.vbs”應該是正確的儲存的VBS程式碼的位置

Process process=Runtime.getRuntime().exec("cmd /c CScript E:/Temp/vbs.vbs");

//等待VBS執行完畢

process.waitFor();

//TODO: 其他的程式碼

注意:該巨集會自動判斷是否需要進行protect(巨集程式中假定protect和autofilter是一致的,即同時為true或者false)。