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

⚡ 智能摘要

从 Excel 导入、读取和更改数据 QTP/UFT 它依赖于内置的 DataTable 对象,该对象将工作簿加载到运行时数据表中,以便每个自动化脚本都可以从电子表格行驱动测试步骤。

  • 📥 进口: DataTable.Import 会加载整个工作簿,而 DataTable.ImportSheet 会将一个指定名称的工作表导入到选定的目标工作表中。
  • 🗂️ 头部规则: 电子表格的第一行将成为列名,因此请在导入运行之前组织好表格结构。
  • 🔢 行数: DataTable.GetSheet(1).GetRowCount 返回数据行数,但不包括标题行。
  • 🎯 行指针: 每次读取数据之前,请先调用 DataTable.SetCurrentRow,以便 DataTable.Value 返回您期望的单元格。
  • ✏️ 回复: 将 DataTable.Value 赋值只会更改内存中的单元格;DataTable.Export 会将工作表保存到磁盘。
  • 🧩 COM选项: 当需要设置格式、公式或打开多个工作簿时,请创建 Excel.Application 对象。
  • ⚠️ 清理: 务必调用 Quit 并释放对象,否则 EXCEL.EXE 会一直驻留在程序中并锁定文件。

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

电子表格仍然是测试人员保存输入值、预期结果和环境设置的最常用方式。 QTP现已作为 OpenText UFT 该产品从惠普转移到Micro Focus,然后又转移到 OpenText它通过 DataTable 对象读取这些电子表格。以下各节展示了用于导入工作簿、统计行数、读取单个单元格、更改值以及将工作表写回磁盘的具体语句。

导入、读取、更改 EXCEL 数据的步骤

假设您想要导入以下内容 销售.xls 将练习册导入你的考试中。

在导入之前,已在 Excel 中打开了 Sales.xls 源工作簿。 UFT

文件导入后 UFT第一行将成为列标题,因此请相应地组织您的数据。 第 1 行中的任何内容都被视为参数名称,而不是测试数据,其余每一行都被视为数据行。

下面显示的是导入整个 Excel 文件的语法。

DataTable.Import(FileName)

在本例中,语句变为如下形式。VBScript 在以语句形式调用方法时不需要括号,因此这里使用了简洁的形式。

DataTable.Import "D:\Automation\Sales.xls"

运行结束后,导入的行会按照它们在工作簿中的布局完全显示在运行时数据窗格中。

进口销售数据显示如下 UFT 运行时数据表窗格

接下来展示的是导入特定工作表的语法。 SheetSource 是工作簿中的工作表, SheetDest 是运行时数据表中的目标工作表。

DataTable.ImportSheet FileName, SheetSource, SheetDest

使用 获取行计数 获取工作表中数据行数的方法。每条语句必须单独占一行。

DataTable.Import "D:\Automation\Sales.xls"
row = DataTable.GetSheet(1).GetRowCount
MsgBox row

弹出的消息框会显示导入工作表的行总数。

MsgBox 显示导入的销售表格的 GetRowCount 结果

要将指针移动到特定行,请使用 设置当前行 方法。第二个参数 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

这两个值均取自同一列但不同的行,消息框将它们并排打印出来。

MsgBox 比较数据表中第 1 行和第 2 行的年份值

使用 价值 左侧赋值语句用于更改导入工作表中的数据。更改会一直保存在内存中,直到您调用该语句。 导出模板它将运行时数据表写回 Excel 文件。

DataTable.SetCurrentRow 1
DataTable.Value("Year", 1) = 2026
DataTable.Export "D:\Automation\Sales_Updated.xls"

编辑后的单元格会在作业运行后立即显示在运行时数据窗格中。

运行时数据表显示了通过 DataTable.Value 方法更新的单元格

打开导出的工作簿可以确认,修改后的值已保存到磁盘,而不仅仅是在运行期间保留。

导出的 Excel 文件已在 Excel 中打开,显示了 DataTable.Export 保存的更改值。

💡提示: 导出时请使用与导入文件不同的文件名。写回同一个已打开的工作簿是触发共享冲突并导致运行失败的最快方法。

如何读取、修改和导出 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") 这与……不匹配 QuitSet … = 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.

常见问题

UFT 将 .xls、.xlsx 和 .csv 文件导入运行时数据表。导出始终生成 .xls 工作簿,因此当下游系统需要较新的 .xlsx 格式时,需要转换器或 Excel COM 对象。

设计时表随测试一起保存,并且保持不变。运行时表是执行开始时创建的副本。导入和赋值操作仅影响运行时副本,除非导出,否则运行时副本将被丢弃。

对于 DataTable 对象来说,答案是否定的,因为它会解析工作簿本身。但对于任何调用 CreateObject(“Excel.Application”) 的脚本来说,答案是肯定的,因为这种方法会自动创建一个真正的 Excel 实例,并且在没有该实例的计算机上会立即失败。

是的。每次调用 ImportSheet 函数时,每个工作表都使用不同的目标工作表名称。全局数据放在“全局”工作表中,而特定于操作的值放在相应的“操作”工作表中,这样每次迭代就能保持独立性。

是的,循环框架通常是正确的。手动验证两点:SetCurrentRow 是否位于循环内部,以及数值单元格是否使用 CInt 或 CDbl 进行转换。生成的代码经常会遗漏这两点。

现代人工智能功能 UFT 该版本能够以视觉方式识别控件,因此重命名字段不再会导致数据集的每一行数据出错。人工智能还可以建议添加额外的边界行,从而无需手动设计测试即可扩大电子表格的覆盖范围。

总结一下这篇文章: