51Testing软件测试论坛

标题: 用QTP去加载Excel到Global的Datatable [打印本页]

作者: qdd6501    时间: 2011-2-21 10:39
标题: 用QTP去加载Excel到Global的Datatable
用QTP去加载Excel到Global的Datatable里去的时候一般的excel能加载进来,可是有些excel却加载进来了Global表里却没有看到数据,或者加载的时候会报错,然后qtp就死掉了,必须关掉进程才行。也不是这个excel太大的缘故,不知道是怎么回事了?
作者: qdd6501    时间: 2011-2-21 10:42
代码是这样的:           

               strDatafile = glbPREEXEC & "Exposure Report_0104release_6.xls"  ’这个路径取的是对的
        strSheetName = 1
        DataTable.ImportSheet strDataFile,1,1
        DataTable.GetSheet(1)
作者: lyscser    时间: 2011-2-21 12:13
本帖最后由 lyscser 于 2011-2-21 12:14 编辑

是EXCEL的Sheet过多导致的,这个问题比较常见,解决方法如下:

  1. '************************************************************************
  2. '设计说明: 用于将EXCEL中某个SHEET单独COPY出来到一个临时的文件中,从临时文件导入DATATABLE,避免SHEET过多导致的EXCEL出错
  3. '程序输入:
  4. '  1. appointedFile -- 原EXCEL
  5. '  2. appointedSheet -- 原EXCEL的SHEET
  6. '  3. newSheet -- 新的EXCEL临时SHEET
  7. '程序输出: 将指定路径下的指定EXCEL的指定SHEET导入DataTable
  8. '设计人员: 刘毅(LIUYI)
  9. '设计时间: 2008-11-05
  10. '调用举例: impXls "D:\test.xls","原始SHEET","新的SHEET"
  11. '************************************************************************
  12. Public Function impXls(appointedFile,appointedSheet,newSheet)
  13. On Error Resume Next
  14. Dim tmpName:tmpName = Environment.Value("SystemTempDir") & "\" & GenerateUniqueStr(30) & ".xls"
  15. Dim bolVal:bolVal = False

  16. Set fObject = CreateObject("Scripting.FileSystemObject")
  17. If  Not fObject.FileExists(appointedFile) Then
  18. Repor micFail,"参数文件不存在:",appointedFile
  19. Set fObject = Nothing
  20. Exit Function
  21. End If

  22. If fObject.FileExists(tmpName) Then
  23. fObject.DeleteFile(tmpName)
  24. End If

  25. Set ExcelApp = CreateObject("Excel.Application")
  26. ExcelApp.Application.Visible = False
  27. ExcelApp.DisplayAlerts = False
  28. Set newBook = ExcelApp.Workbooks.Open (appointedFile,False,True)
  29. newBook.Worksheets(appointedSheet).Copy
  30. Set tempBook = ExcelApp.ActiveWorkbook
  31. tempBook.SaveAs tmpName,1
  32. Set tempBook = Nothing
  33. ExcelApp.Quit
  34. Set ExcelApp = Nothing
  35. DataTable.AddSheet newSheet
  36. DataTable.ImportSheet tmpName,appointedSheet,newSheet

  37. If  fObject.FileExists(tmpName) Then
  38. fObject.DeleteFile(tmpName)
  39. End If

  40. bolVal = ErrorHandle()

  41. If  bolVal Then
  42. Reporter ReportEvent micPass,"impXls导入参数成功:","文件【" & appointedFile & "】的【" & appointedSheet & "】页已经导入到【" & newSheet & "】"  
  43. End If

  44. Set fObject = Nothing
  45. impXls = bolVal
  46. End Function
复制代码

作者: lyscser    时间: 2011-2-21 12:19
补充被调用函数一组:

  1. '************************************************************************
  2. '设计说明: 根据日期、时间和两组随机数生成相对较为唯一的字符串,常用于文件的非覆盖保存'程序输入:
  3. '             1. circleNumber -- 循环次数
  4. '程序输出: 日期、时间、随机数、随机数的拼接字符串如:20110107_161003_93778_47149
  5. '设计人员: 刘毅(LIUYI)
  6. '设计时间: 2011-01-07
  7. '调用举例: Printer GenerateUniqueStr("30")
  8. '************************************************************************

  9. Public Function GenerateUniqueStr(circleNumber)
  10.          If     Trim(circleNumber) = "" Then
  11.                    circleNumber = randomnumber.Value(20,50)
  12.          Else
  13.                    If     circleNumber < 11 Then
  14.                             circleNumber = circleNumber + 20
  15.                    End If        
  16.          End If
  17.          
  18.          randomNo = randomnumber.Value(10,Abs(circleNumber))
  19.          For i = 1 to randomNo
  20.                    randomNum1 = randomnumber.Value(10000,99999)
  21.                    randomNum2 = Int((99999-10000+1)*rnd+10000)
  22.          Next
  23.          
  24.          GenerateUniqueStr = FormatDate(Now,"yyyymmdd_hh24miss")&"_"&randomNum1&"_"&randomNum2
  25. End Function

  26. '******************************************************************************
  27. '设计说明: (模仿PL/SQL同名函数)将字符串扩展到指定长度,用fillWithChar从左边循环填充,本函数不会截短appointedStr
  28. '程序输入:
  29. '                  1. appointedStr -- 字符串
  30. '                  2. appointedwidth -- 指定的长度
  31. '                  3. fillWithChar -- 填充字符
  32. '程序输出:
  33. '设计人员: 刘毅(LIUYI)
  34. '设计时间: 2011-01-04
  35. '调用举例: msgbox OracleLPadStr(Second(theTime), 2, "0")
  36. '******************************************************************************

  37. Function OracleLPadStr(appointedStr, appointedwidth, fillWithChar)
  38.          OracleLPadStr = ExpandString(fillWithChar, appointedwidth - Len(appointedStr)) & appointedStr
  39. End Function

  40. '******************************************************************************
  41. '设计说明: (模仿PL/SQL同名函数)将字符串扩展到指定长度,用fillWithChar从左边循环填充,本函数不会截短appointedStr
  42. '程序输入:
  43. '                  1. appointedStr -- 字符串
  44. '                  2. appointedwidth -- 指定的长度
  45. '                  3. fillWithChar -- 填充字符
  46. '程序输出:
  47. '设计人员: 刘毅(LIUYI)
  48. '设计时间: 2011-01-04
  49. '调用举例: msgbox OracleLPadStr(Second(theTime), 2, "0")
  50. '******************************************************************************

  51. Function OracleRPadStr(appointedStr, appointedwidth, fillWithChar)
  52.          OracleRPadStr = appointedStr & ExpandString(fillWithChar, appointedwidth - Len(appointedStr))
  53. End Function

  54. '******************************************************************************
  55. '设计说明: 将appointedStr反复叠加,使其长度扩展(或缩小)到appointedwidth
  56. '程序输入:
  57. '                  1. appointedStr -- 字符串
  58. '                  2. appointedwidth -- 指定的长度
  59. '程序输出:
  60. '设计人员: 刘毅(LIUYI)
  61. '设计时间: 2011-01-04
  62. '调用举例: ExpandString("bye",7) 返回 byebyeb ; ExpandString("bye",2)返回 by
  63. '******************************************************************************

  64. Private Function ExpandString(appointedStr, appointedwidth)
  65.          Dim width0, repeat_times, reminder, i, result
  66.          
  67.          If       appointedwidth <= 0 Then
  68.                    ExpandString = ""
  69.                    Exit Function
  70.          End If
  71.          
  72.          width0 = Len(appointedStr)
  73.          repeat_times = appointedwidth \ width0
  74.          reminder = appointedwidth Mod width0         
  75.          
  76.          For i = 1 To repeat_times
  77.                    result = result & appointedStr
  78.          Next
  79.          
  80.          result = result & Left(appointedStr, reminder)
  81.          ExpandString = result
  82. End Function

复制代码

作者: lyscser    时间: 2011-2-21 12:20
简而言之就是重新封装一个函数,或者你自己去重载一个同名函数也行
作者: qdd6501    时间: 2011-2-21 12:46
回复 5# lyscser

可是我要加载的那个excel里只有一个sheet表啊
作者: lyscser    时间: 2011-2-21 13:02
用同样的办法,干吗不先试试?
作者: qdd6501    时间: 2011-2-21 13:34
回复 7# lyscser
下面是我用你的方法试的代码,运行结果是原excel里的内容已经考到了同个目录下的名为test的excel里了,然后qtp 的datatable里也多了个aSheet 的datatable,但是最后test里的数据还是没有到aSheet里面去。

strDatafile = glbPREEXEC & "Exposure Report_0104release_6.xls"
Dim excelApp
Set ExcelApp = CreateObject("Excel.Application")

ExcelApp.Application.Visible = False

ExcelApp.DisplayAlerts = False
Dim newBook
Set newBook = ExcelApp.Workbooks.Open (strDatafile,False,True)

newBook.Worksheets("Sheet1").Copy
Dim tempBook
Set tempBook = ExcelApp.ActiveWorkbook

tempBook.SaveAs glbPREEXEC &"test",1

Set tempBook = Nothing

ExcelApp.Quit

Set ExcelApp = Nothing

DataTable.AddSheet "aSheet"

DataTable.ImportSheet  glbPREEXEC &"test","Sheet1","aSheet"
作者: qdd6501    时间: 2011-2-21 13:43
DataTable.ImportSheet  glbPREEXEC &"test","Sheet1","aSheet"这句有问题
我改成DataTable.ImportSheet  glbPREEXEC &"test.xls","Sheet1","aSheet" 然后再运行到这一句的时候qtp就死掉了,没反应了。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2