项目上有个UAT的case的checkpoint 需要比较系统里webtable 里跟exported 到excle 文件的数据是否一致。
想想了,传统的方法是将webtable的数据取出来存在另一个excle文件里,然后在异步比较2个excle 文件数据是否相同。
但是这个方法效率太低,想到之前项目上用到利用excel 的内置公式比较数据,并将差异的数据标上不同的颜色。
不多说,上代码:
Sub CompareExcel(strPath,dicData) Dim oExcel,oWorkbook,oSheet,i,key Set oExcel=CreateObject("Excel.Application") On error resume next :err.clear Set oWorkbook=oExcel.workbooks.open(strPath) Set oSheet=oWorkbook.sheets(1) If err.number<>0 Then err.clear Exit sub End If On error goto 0 oExcel.DisplayAlerts=False Dim colums:colums=oSheet.usedRange.Columns.Count Dim rows:rows=oSheet.usedRange.rows.Count ' Dim end_pos:end_pos=start_pos+dicData.count Dim countRow:countRow=dicData.count Dim countCloumn:countCloumn=ubound(dicData(1))+1 ' Dim new_start_pos:new_start_pos=US1567_To_letter(colums+1) Dim new_start_pos:new_start_pos=rows+2 ' Dim new_end_pos:new_end_pos=US1567_To_letter(colums+countCloumn) Dim new_end_pos:new_end_pos=US1567_To_letter(countCloumn) Dim index:index=new_start_pos for each key in dicData.keys oSheet.range("A"&index&":"&new_end_pos&index).value=dicData(key) index=index+1 Next Dim range1:range1="A2"&":"&US1567_To_letter(colums)&rows ' Dim range2:range2=new_start_pos&"2"&":"&new_end_pos&(countRow+1) Dim range2:range2="A"&new_start_pos&":"&new_end_pos&(countRow+new_start_pos-1) oSheet.range("A"&(new_start_pos-1)).value="From RM WebTable Data:" ' oSheet.range("A"&(new_start_pos-1)&":"&new_end_pos&(new_start_pos-1)).value="From RM WebTable Data:" ' oSheet.range("A"&(new_start_pos-1)&":"&new_end_pos&(new_start_pos-1)).mergecells=true ' oSheet.listobjects.add(1, oSheet.range(range2), false, 1).name = "table1" ' oSheet.listobjects("table1").tablestyle = "TableStyleMedium16" oSheet.range(range1).select oSheet.range(range1).FormatConditions.add 2,,"=A2 <>"&"A"&new_start_pos oSheet.range(range1).FormatConditions(1).setfirstpriority oSheet.range(range1).FormatConditions(1).interior.color = 65535 oSheet.range(range1).FormatConditions(1).stopiftrue = false oSheet.range(range2).select oSheet.range(range2).FormatConditions.add 2,,"=A2 <> "&"A"&new_start_pos oSheet.range(range2).FormatConditions(1).setfirstpriority oSheet.range(range2).FormatConditions(1).interior.color = 65535 oSheet.range(range2).FormatConditions(1).stopiftrue = false oSheet.range("A1").select oSheet.cells.entirecolumn.autofit oWorkbook.save oWorkbook.Close Set oSheet=Nothing Set oWorkbook=Nothing Set oExcel=nothing End Sub
将页面的webtable的每一行数据作为一位数组放在dic 对象里,利用QTP EOM 操作excle文件,将数据一行一行写到 exported 的excle 文件里,动态的插入 FormatConditions。比较数据的过程丢给Excle。
最后将比较之后的文件以超链接的方式插到QTP的report里。
tips:
很奇怪的是网上关于qtp 对excle 读写数据都是cells(1,1).value 这个方法,一个单元格一个单元格的读写数据,这样效率实在太低。
其实有更好的方法:
1.可以一行一行的读写数据 eg. worksheet.range("A1":"F1").value
2.甚至可以一次性操作所有数据 eg.worksheet.usedrange.value
这2个方式读的时候是返回2维数组。写的时候可以1维数组写入。