QTP對Excel的操作(EOM)


1. EOM -> Excel Automation Object Model 即Excel自動化模型對象

在自動化測試中,我們常利用Excel對數據跟腳本進行分離,也就是平常所說的數據驅動。當然了,QTP自帶的dataTable也很好用,但是作為一個自動化攻城獅怎么能不會EOM呢。

下面看一段我寫的代碼,里面包含了一些基本操作。我寫的注釋也比較詳細,相信通過閱讀代碼一定不難理解:

Dim fileName,filePath
Dim excelApp,fso,sheet,shell
Set excelApp = CreateObject("excel.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
fileName = "d:\1.xls"
filePath = "d:\1"
excelApp.Visible = True
excelApp.Workbooks.Add '新增一個workbook
excelApp.Save fileName '保存workbook
excelApp.Quit  '關閉
excelApp.Workbooks.Open fileName  '打開之前保存的excel文件
excelApp.Visible = True '一旦關閉之后,visible又變成了false,需要重置為true
Set sheet = excelApp.Sheets.Add  '新增一個sheet
sheet.name = "sunyu"  '給新增的sheet命名
sheet.cells(1,1) = "hello world"

'下面這段SendKeys的功能是另存為功能,原先的文件還是存在的,此時保存的文件將是xlsx文件
'有人會問為什么不用excelApp.Save 這個方法,我試過在用這個方法時會遇到問題
'大概是因為vbs創建的xls文件保存時會遇到格式的問題,而且save是保存,不是另存為
'關於這一點如果有知道的朋友可以告訴我原因 我的郵箱dieinthemoon@163.com
shell.SendKeys "^s"
shell.SendKeys filePath
shell.SendKeys "{ENTER}"
shell.SendKeys "%Y"

'MsgBox  excelApp.Workbooks.Count '進程中xls的數量;同時讓程序停止一下,看看運行中的效果
excelApp.Quit
'刪除掉后綴為xls的文件,避免下次運行時沖突
If fso.FileExists(fileName) Then
    fso.DeleteFile fileName
End If
Set excelApp = Nothing
Set fso = Nothing
Set shell = Nothing
Set sheet = Nothing

需要注意的是,我使用的Office2007來測試的。用2010應該也不會有問題,前提是你建立的文件后綴必須是.xls,如果你創建文件時后綴改成.xlsx的話,就會出問題。此時你無法打開你建立的xlsx文件,我在網上也找了一些資料,但是還沒有發現好的解決辦法。這里我采用了shell.SendKeys "^s",會默認為另存為功能,自動保存為xlsx格式的文件,並且此時文件是可以打開不會報錯的。

這是直接創建xlsx文件后試圖打開文件時的錯誤截圖:

正常運行后得到的效果圖如下,里面正確輸入了數據,並且sheet名字已經改了。

或許你編碼的時候發現sheet對象並不能“點”出方法來,有個比較實用的技巧,打開excel,然后點ALT+F11,你可以在里面“點”出你想要的方法來,接下來就復制粘貼吧。

 

2. 動態運行並加載宏代碼

宏的主要用途是可以讓用戶自行定義一些操作,並通過計算機進行自動化,省去用戶很多繁瑣重復的操作。

首先在之前的那個excel里加入一段宏代碼,功能很簡單,彈出一個msgbox

 

然后在QTP里直接調用:

Set exc = CreateObject("excel.application")

exc.Workbooks.Open "d:\1.xlsm"

Set sheet = exc.Sheets.Item(1)

sheet.sy

exc.ActiveWorkbook.Close

exc.Quit

Set exc = Nothing

Set sheet = Nothing

 

這里我打開的是一個xlsm格式的文件,這是一個包含宏運算格式的excel文件。程序很簡單,只是為了說明excel宏里面的所有方法函數都是可以通過QTP來調用的。

 

動態加載宏方式一:字符串加載方式

Set exc = CreateObject("excel.application")

Set book = exc.Workbooks.Add

Set module = book.VBProject.VBComponents.Item("ThisWorkBook")

Dim newCode

newCode = "Function sy()" + vbnewline

newCode = newCode + "msgbox ""hello sunyu"""+ vbnewline

newCode = newCode + "End Function"

module.CodeModule.AddFromString newCode

book.sy

book.Close false

exc.Quit

Set exc = nothing

 

注釋1:第一遍執行,出現錯誤如下:

這是需要在excel里設置的,具體的將Trust Center里的下列選項勾選上就可以了:

 

再次運行,得到結果”hello sunyu”。

注釋2:book.Close false ,這句代碼中false代表不保存就關閉。

 

動態加載宏方式二:文本文件加載方式

Set exc = CreateObject("excel.application")

Set book = exc.Workbooks.Add

Set module = book.VBProject.VBComponents.Item("ThisWorkBook")

module.CodeModule.AddFromFile "d:\sy.bas"

book.sy

book.Close false

exc.Quit

Set exc = nothing

 

BAS格式的文件時Excel導出的宏文件格式,運行這段代碼前先把函數sy保存在一個BAS文件,放在D盤中,然后動態調用即可。由於我們之前已經把”Trust access to the VBA project object model”這個選項選上了,所以我們此次運行腳本沒有遇到錯誤,但是這樣每次都手工去做的話,我們的腳本移植能力就太差了,換一台電腦我們的腳本就會出錯,還需要再次去設置,這就違背了我們自動化的初衷。

我們可以在腳本里對這個操作進行初始化,利用WSH對象去操作注冊表:

 

Set shell = CreateObject("WScript.shell")

'寫入注冊表,設置對VBProject為信任

shell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security\AccessVBOM",1,"REG_DWORD"

Set exc = CreateObject("excel.application")

Set book = exc.Workbooks.Add

Set module = book.VBProject.VBComponents.Item("ThisWorkBook")

module.CodeModule.AddFromFile "d:\sy.bas"

book.sy

book.Close false

exc.Quit

Set exc = nothing

'釋放注冊表,以保證下次執行時沒有問題

shell.RegDelete "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security\AccessVBOM"

Set shell = nothing

如下圖,AccessVBOM是VBProject信任開關,1為信任,0為不信任,默認值為0

 

數字簽名和宏安全設置都有相應的設置: 以office 2002為例: HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Excel\Security中有三個鍵值: Level:宏安全等級,1為低,3為高,其它為中,默認值為3; AccessVBOM(這是office2002開始才有的):信任對於VBE的訪問(XP中才有的),1為信任,0為不信任,默認值為0; DontTrustInstalledFiles:信任所有安裝的加載宏和模板,0為信任,1為不信任,默認值為0; HKEY_CURRENT_USER\Software\Microsoft\VBA\Trusted中存放的就是信任的數字簽名,默認值為無可信任數字簽名,可以有多種數字簽名。 不同版本設置稍有不同。

在注冊表中分別對應 版本 主鍵

97: 在HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel下

2000: 在HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Excel下

2002: 在HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Excel下

2003: 在HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel下

2007: 在HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel下,

一般來說,初次安裝這些鍵值都為空,只有涉及到操作時才會創建。 用操作注冊表的方法可以實現“宏安全”設置,但不能進行對“VBE訪問信任”設置。

 

3. 利用ADO打造Excel數據庫

首先在D盤里創建一個Excel表格如下:

需要說明的是,ADO操作Excel數據源的話,會默認每個Sheet為一張表,而第一行即為字段名,從第二行開始為字段值。

 

之前我的博客里有講過怎樣連接mysql的數據庫了,excel的連接方法非常相似,可以參考我之前的文章:

http://www.cnblogs.com/ryansunyu/archive/2012/09/06/2673861.html

這里就不多說了,直接貼代碼

Dim strConn,strSql

Dim conn,connRst

strConn ="DSN=test;DBQ=D:\1.xlsx;DefaultDir=D:;DriverId=1046;FIL=excel 12.0;MaxBufferSize=2048;PageTimeout=5;"

strSql = "select * from [sunyu$]"

Set conn = CreateObject("adodb.Connection")

conn.Open strConn

Set connRst = conn.Execute(strSql)

While Not connRst.EOF

msgbox connRst.Fields("userName")

connRst.MoveNext

Wend

Set conn = nothing

Set connRst = nothing

 

效果是遍歷了userName這一例里的所有值。后續我會利用Dictionary對象將Excel數據庫讀取的對象封裝起來,這樣使用會更方便。

歡迎您關注我的博客:http://www.cnblogs.com/ryansunyu/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM