如何从 Excel 导入、读取和更改数据 QTP/UFT

电子表格仍然是测试人员保存输入值、预期结果和环境设置的最常用方式。 QTP现已作为 OpenText UFT 该产品从惠普转移到Micro Focus,然后又转移到 OpenText它通过 DataTable 对象读取这些电子表格。以下各节展示了用于导入工作簿、统计行数、读取单个单元格、更改值以及将工作表写回磁盘的具体语句。
导入、读取、更改 EXCEL 数据的步骤
假设您想要导入以下内容 销售.xls 将练习册导入你的考试中。
文件导入后 UFT第一行将成为列标题,因此请相应地组织您的数据。 第 1 行中的任何内容都被视为参数名称,而不是测试数据,其余每一行都被视为数据行。
下面显示的是导入整个 Excel 文件的语法。
DataTable.Import(FileName)
在本例中,语句变为如下形式。VBScript 在以语句形式调用方法时不需要括号,因此这里使用了简洁的形式。
DataTable.Import "D:\Automation\Sales.xls"
运行结束后,导入的行会按照它们在工作簿中的布局完全显示在运行时数据窗格中。
接下来展示的是导入特定工作表的语法。 SheetSource 是工作簿中的工作表, SheetDest 是运行时数据表中的目标工作表。
DataTable.ImportSheet FileName, SheetSource, SheetDest
使用 获取行计数 获取工作表中数据行数的方法。每条语句必须单独占一行。
DataTable.Import "D:\Automation\Sales.xls" row = DataTable.GetSheet(1).GetRowCount MsgBox row
弹出的消息框会显示导入工作表的行总数。
要将指针移动到特定行,请使用 设置当前行 方法。第二个参数 DataTable.Value 这是工作表编号,而不是行编号,所以行指针必须单独移动。
DataTable.Import "D:\Automation\Sales.xls" ' In the code below, 1 is the sheet number DataTable.SetCurrentRow 1 Row1 = DataTable.Value("Year", 1) DataTable.SetCurrentRow 2 Row2 = DataTable.Value("Year", 1) MsgBox "Year Row 1 = " & Row1 & " Year Row 2 = " & Row2
这两个值均取自同一列但不同的行,消息框将它们并排打印出来。
使用 价值 左侧赋值语句用于更改导入工作表中的数据。更改会一直保存在内存中,直到您调用该语句。 导出模板它将运行时数据表写回 Excel 文件。
DataTable.SetCurrentRow 1 DataTable.Value("Year", 1) = 2026 DataTable.Export "D:\Automation\Sales_Updated.xls"
编辑后的单元格会在作业运行后立即显示在运行时数据窗格中。
打开导出的工作簿可以确认,修改后的值已保存到磁盘,而不仅仅是在运行期间保留。
💡提示: 导出时请使用与导入文件不同的文件名。写回同一个已打开的工作簿是触发共享冲突并导致运行失败的最快方法。
如何读取、修改和导出 Excel 数据:完整示例
以上代码片段分别演示了一种方法。在实际的数据驱动测试中,它们会被合并成一个循环,该循环遍历每一行,计算结果,存储结果,然后导出工作表。假设工作簿 销售.xls 包含以下四列和三行数据。
| 年份 | 地区 | 单位 | 价格筛选 |
|---|---|---|---|
| 2023 | 东部 | 120 | 25 |
| 2024 | 东部 | 150 | 25 |
| 2025 | 西部 | 200 | 30 |
以下脚本添加了一个 收入 按列逐行填充,保持累计总数,并将完成的表格写入新文件。 AddParameter 之所以使用这种方法,是因为源工作簿中不存在该列;如果对已存在的列调用此方法,则会引发错误。
' Read, calculate and export Excel data in UFT One Dim sh, rowCount, i, units, price, revenue, total DataTable.Import "D:\Automation\Sales.xls" Set sh = DataTable.GetSheet(1) sh.AddParameter "Revenue", "" rowCount = sh.GetRowCount Print "Total rows imported: " & rowCount total = 0 For i = 1 To rowCount DataTable.SetCurrentRow i units = DataTable.Value("Units", 1) price = DataTable.Value("Price", 1) revenue = CInt(units) * CInt(price) DataTable.Value("Revenue", 1) = revenue total = total + revenue Print "Row " & i & " | Year: " & DataTable.Value("Year", 1) & _ " | Region: " & DataTable.Value("Region", 1) & _ " | Revenue: " & revenue Next Print "Grand Total Revenue: " & total DataTable.Export "D:\Automation\Sales_Revenue.xls" Set sh = Nothing
输出:
Total rows imported: 3 Row 1 | Year: 2023 | Region: East | Revenue: 3000 Row 2 | Year: 2024 | Region: East | Revenue: 3750 Row 3 | Year: 2025 | Region: West | Revenue: 6000 Grand Total Revenue: 12750
剧本中有三点比其他要点更为重要。首先, GetRowCount 返回值为 3 而不是 4,是因为标题行被用作列名。其次, SetCurrentRow 每次迭代开始时都会调用该函数;如果没有它,三次迭代都会读取同一行。第三,数据表中的值是字符串,因此 CInt 在乘法运算之前应用此操作,以避免字符串拼接而进行算术运算。跳过ping DataTable.Export 计算出的收入将显示在“数据”窗格中,但不会保存在磁盘上的任何文件中。
DataTable 对象与 Excel COM 对象的区别 UFT
DataTable 对象并不是访问电子表格的唯一途径。 UFT 脚本也可以创建 Excel.Application COM对象可以直接驱动Excel。这两种方法解决的是不同的问题。
| 方面 | 数据表对象 | Excel COM 对象 |
|---|---|---|
| Excel 安装 | 执行机器上不需要。 | Microsoft 必须安装Excel |
| 称呼风格 | 按列名和行指针 | 按单元格坐标、范围或命名范围 |
| 迭代次数 | 行驱动测试迭代自动 | 没有与迭代的链接;looping 手动 |
| 格式和公式 | 已忽略;仅读取值。 | 完全访问配方、颜色和图表 |
| 多个工作簿 | 一个运行时表,工作表逐个导入 | 可以同时打开任意数量的工作簿 |
| 结果报告 | 数值出现在 UFT 自动运行结果 | 除非您主动举报,否则不会有任何信息被记录。 |
| 清理负担 | 经办人 UFT | 您必须关闭、退出并释放每个对象。 |
实际操作规则很简单。使用 DataTable 对象进行直接的参数化,其中电子表格中的每一行都成为一次迭代。 自动化测试 仅当需要数据表无法表达的内容时才切换到 COM 对象,例如读取公式结果、写入格式化报表或在同一脚本中比较两个工作簿。以下示例读取一个单元格,写回状态,并正确关闭 Excel。
Dim xlApp, xlBook, xlSheet, cellValue Set xlApp = CreateObject("Excel.Application") xlApp.Visible = False xlApp.DisplayAlerts = False Set xlBook = xlApp.Workbooks.Open("D:\Automation\Sales.xls") Set xlSheet = xlBook.Worksheets("Sheet1") cellValue = xlSheet.Cells(2, 1).Value Print "Cell A2 contains: " & cellValue xlSheet.Cells(2, 5).Value = "Reviewed" xlBook.Save ' Release everything, in this order xlBook.Close False xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing
输出:
Cell A2 contains: 2023
单元格 A2 包含 2023,因为工作表的第 1 行是标题行,A 列是…… 年份请注意,COM寻址是从1开始的,并且包括报头。 DataTable.SetCurrentRow 1 指向第一行数据。
使用 Excel 时常见的错误 UFT 以及如何修复它们
大多数Excel问题 UFT 这些错误源于少数可重复出现的错误。识别这些错误可以节省大量的调试时间。
⚠️警告: 孤立的 EXCEL.EXE 进程是 COM 自动化最常见的副作用。 CreateObject("Excel.Application") 这与……不匹配 Quit 加 Set … = Nothing 它会留下一个隐藏的 Excel 实例在运行。经过几百次测试运行后,执行机器内存不足,源工作簿被锁定,无法编辑。
- Excel 文件会一直驻留在内存中。 关闭工作簿,调用
xlApp.Quit然后按顺序释放工作表、工作簿和应用程序对象。先释放应用程序会保留一个有效的引用,并保持进程运行。 - 运行结束后更改将消失。
DataTable.Value仅写入运行时数据表。DataTable.Export任何内容都不会到达文件系统。 - “列不存在”或无效参数错误。 传递给的列名
DataTable.Value必须与标题单元格完全匹配,包括尾随空格。AddParameter在写入数据之前,先创建列。 - 每次迭代读取的值都相同。
SetCurrentRow由于没有在循环内部调用该函数,因此行指针从未移动。 - 差一行计数。
GetRowCount不包括标题行。一个包含标题行和十条记录的工作簿返回 10,而不是 11。 - 路径和权限错误。 硬编码路径,例如
D:\Automation\Sales.xls在其他机器上出现故障。通过环境变量构建路径,以便在每个代理上运行相同的脚本。 - 合并单元格和多个标题行。 导入操作需要一行唯一的标题行。合并单元格会导致参数名称为空或重复。
- 出口共享违规。 目标文件无法在 Excel 中打开
Export运行。请先关闭程序,或导出为带时间戳的文件。
一个有用的习惯是将 COM 清理操作包装在一个…… On Error Resume Next 该代码块放置在专用的恢复功能中,因此即使脚本执行过程中发生故障,Excel 仍然会关闭。当 Excel 数据提供给正式的恢复功能时, 测试用例 对于存储库,同样的原则也适用于结果:导出一次,验证文件是否存在,然后将其附加到运行中。
要深入了解这里涉及的主题,请通读全文。 QTP/UFT 教程 从更广泛的层面来看,学习如何将结果推向 来自 ALM UFT回顾基础知识 软件测试并将该方法与数据驱动脚本进行比较 Selenium.






