Hur man importerar, läser och ändrar data från Excel i QTP/UFT

⚡ Smart sammanfattning

Importera, läsa och ändra data från Excel i QTP/UFT förlitar sig på det inbyggda DataTable-objektet, som laddar en arbetsbok i datatabellen under körning så att varje automatiseringsskript kan driva teststeg från kalkylbladsrader.

  • 📥 Importera: DataTable.Import laddar en hel arbetsbok, medan DataTable.ImportSheet hämtar ett namngivet ark till ett valt målark.
  • 🗂️ Rubrikregel: Den första raden i kalkylarket blir kolumnnamnen, så strukturera arket innan importen körs.
  • 🔢 Antal rader: DataTable.GetSheet(1).GetRowCount returnerar antalet datarader och exkluderar rubrikraden.
  • 🎯 Radpekare: Anropa DataTable.SetCurrentRow före varje läsning så att DataTable.Value returnerar den cell du förväntar dig.
  • ✏️ Skriva tillbaka: Att tilldela till DataTable.Value ändrar endast en cell i minnet; DataTable.Export sparar arket till disk.
  • 🧩 COM-alternativ: Skapa ett Excel.Application-objekt när formatering, formler eller flera öppna arbetsböcker krävs.
  • ⚠️ Städa: Anropa alltid Quit- och release-objekt, annars förblir EXCEL.EXE resident och låser filen.

Hur man importerar, läser och ändrar data från Excel i QTP/UFT

Kalkylblad är fortfarande den vanligaste platsen där testare lagrar sina indatavärden, förväntade resultat och miljöinställningar. QTP, säljs nu som OpenText UFT En efter att produkten flyttades från HP till Micro Focus och sedan till OpenText, läser dessa kalkylblad via DataTable-objektet. Avsnitten nedan visar de exakta satserna som används för att importera en arbetsbok, räkna dess rader, läsa enskilda celler, ändra värden och skriva tillbaka arket till disken.

Steg för att importera, läsa, ändra data från EXCEL

Tänk på att du vill importera följande Försäljning.xls arbetsboken i ditt prov.

Sales.xls-källarbetsboken öppnades i Excel innan import till UFT

När filen har importerats till UFT, den översta raden blir kolumnrubrik, så strukturera dina data därefter. Allt på rad 1 behandlas som ett parameternamn snarare än som testdata, och varje återstående rad räknas som en datarad.

Syntaxen för att importera en hel Excel-fil visas nedan.

DataTable.Import(FileName)

I vårt fall blir satsen följande. VBScript behöver inte parenteser när en metod anropas som en sats, så den vanliga formen används här.

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

Efter körningen visas de importerade raderna i datafönstern under körning exakt som de var upplagda i arbetsboken.

Importerade försäljningsdata som visas i UFT rutan för datatabell i körtid

Syntaxen för att importera ett specifikt ark visas härnäst. SheetSource är arket inuti arbetsboken och SheetDest är målarket i datatabellen under körning.

DataTable.ImportSheet FileName, SheetSource, SheetDest

Använd GetRodCount metod för att få antalet datarader i ett ark. Varje sats måste stå på en egen rad.

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

Meddelanderutan som visas visar radtotalen för det importerade arket.

MsgBox visar GetRowCount-resultatet för det importerade försäljningsarket

För att flytta pekaren till en specifik rad, använd Ange aktuell rad metod. Det andra argumentet för DataTable.Value är arknumret, inte radnumret, vilket är anledningen till att radpekaren måste flyttas separat.

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

Båda värdena läses från samma kolumn men från två olika rader, och meddelanderutan skriver ut dem sida vid sida.

MsgBox jämföra årsvärdet på rad 1 och rad 2 i datatabellen

Använd Värderar metod till vänster om en uppgift för att ändra data i det importerade arket. Ändringen finns kvar i minnet tills du anropar Export, som skriver tillbaka datatabellen under körning till en Excel-fil.

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

Den redigerade cellen visas i datarutan under körning direkt efter att tilldelningen körts.

Körtidsdatatabell som visar en cell som uppdateras via DataTable.Value-metoden

Att öppna den exporterade arbetsboken bekräftar att de ändrade värdena sparades på disken istället för att bara behållas under körningens varaktighet.

Exporterad Excel-fil öppnad i Excel som visar de ändrade värdena som sparats av DataTable.Export

💡 Tips: Exportera till ett annat filnamn än det du importerade. Att skriva tillbaka till samma öppna arbetsbok är det snabbaste sättet att utlösa ett delningsfel och förlora körningen.

Hur man läser, ändrar och exporterar Excel-data: Ett komplett exempel

Utdragen ovan demonstrerar var och en en metod. I ett verkligt datadrivet test kombineras de till en enda loop som går igenom varje rad, beräknar något, lagrar resultatet och exporterar arket. Anta att arbetsboken Försäljning.xls innehåller följande fyra kolumner och tre datarader.

År Region Enheter Pris
2023 öster 120 25
2024 öster 150 25
2025 väster 200 30

Skriptet nedan lägger till en Intäkter kolumnen, fyller den rad för rad, har en löpande summa och skriver det färdiga arket till en ny fil. AddParameter används eftersom kolumnen inte finns i källarbetsboken; att anropa den för en kolumn som redan finns ger upphov till ett fel.

' 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

Produktion:

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

Tre punkter i det här manuset är viktigare än resten. För det första, GetRowCount returnerar 3 snarare än 4 eftersom rubrikraden används som kolumnnamn. För det andra, SetCurrentRow anropas högst upp i varje iteration; utan den skulle alla tre iterationerna läsa samma rad. För det tredje är värden som kommer ut ur datatabellen strängar, så CInt tillämpas före multiplikationen för att undvika strängsammanfogning istället för aritmetik.ping DataTable.Export skulle lämna den beräknade intäkten synlig i datafönstern men frånvarande från alla filer på disken.

DataTable-objekt kontra Excel COM-objekt i UFT

DataTable-objektet är inte det enda sättet att nå ett kalkylblad. UFT skript kan också skapa en Excel.Application COM-objekt och kör Excel direkt. De två metoderna löser olika problem.

Aspect DataTable-objekt Excel COM-objekt
Excel-installation Krävs inte på exekveringsmaskinen Microsoft Excel måste vara installerat
Adresseringsstil Efter kolumnnamn och radpekare Efter cellkoordinater, intervall eller namngivna intervall
Iterationer Rader driver testiterationer automatiskt Ingen länk till iterationer; looping är manuell
Formatering och formler Ignoreras; endast värden läses Full åtkomst till formler, färger och diagram
Flera arbetsböcker En körtidstabell, ark importeras ett i taget Valfritt antal arbetsböcker öppna samtidigt
Resultatrapportering Värden visas i UFT kör resultaten automatiskt Ingenting registreras om du inte själv rapporterar det
Städbörda Hanteras av UFT Du måste stänga, avsluta och släppa alla objekt

Den praktiska regeln är enkel. Använd DataTable-objektet för enkel parametrisering, där varje kalkylbladsrad blir en iteration av en automatiseringstestning kör. Växla bara till COM-objektet när du behöver något som datatabellen inte kan uttrycka, till exempel att läsa ett formelresultat, skriva en formaterad rapport eller jämföra två arbetsböcker i samma skript. Exemplet nedan läser en cell, skriver tillbaka en status och stänger Excel korrekt.

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

Produktion:

Cell A2 contains: 2023

Cell A2 innehåller 2023 eftersom rad 1 i kalkylbladet är rubrikraden och kolumn A är ÅrObservera att COM-adressering är en-baserad och räknar headern, medan DataTable.SetCurrentRow 1 punkter på den första dataraden.

Vanliga fel när man använder Excel med UFT och hur man fixar dem

De flesta Excel-problem i UFT kommer från en liten uppsättning upprepade misstag. Att identifiera dem sparar mycket tid vid felsökning.

⚠️ Varning: En föräldralös EXCEL.EXE-process är den enskilt vanligaste bieffekten av COM-automation. Varje CreateObject("Excel.Application") som inte matchas av Quit plus Set … = Nothing lämnar en dold Excel-instans igång. Efter några hundra testkörningar har kördatorn slut på minne och källarbetsboken är låst för redigering.

  • Excel finns kvar i minnet. Stäng arbetsboken, ring xlApp.Quitoch släpp sedan ark-, arbetsboks- och programobjekten i den ordningen. Om du släpper programmet först lämnas en aktiv referens kvar och processen fortsätter att fungera.
  • Ändringarna försvinner efter körningen. DataTable.Value skriver endast till datatabellen vid körning. Utan DataTable.Export, ingenting når filsystemet.
  • ”Kolumnen finns inte” eller ett ogiltigt parameterfel. Kolumnnamnet som skickades till DataTable.Value måste matcha rubrikcellen exakt, inklusive efterföljande mellanslag. Använd AddParameter för att skapa en kolumn innan man skriver till den.
  • Varje iteration läser samma värden. SetCurrentRow anropades inte inuti loopen, så radpekaren rörde sig aldrig.
  • Radförskjutning räknas. GetRowCount exkluderar rubrikraden. En arbetsbok med en rubrik och tio poster returnerar 10, inte 11.
  • Sökvägs- och behörighetsfel. Hårdkodade sökvägar som t.ex. D:\Automation\Sales.xls paus på andra maskiner. Bygg sökvägen från en miljövariabel så att samma skript körs på varje agent.
  • Sammanfogade celler och flera rubrikrader. Importen förväntar sig exakt en rubrikrad med unika namn. Sammanfogade celler producerar tomma eller duplicerade parameternamn.
  • Delningsöverträdelse vid export. Målfilen kan inte öppnas i Excel medan Export körs. Stäng den först, eller exportera till ett tidsstämplat filnamn.

En bra vana är att linda in COM-rensningen i en On Error Resume Next block placerat i en dedikerad återställningsfunktion, så ett fel mitt i ett skript stänger fortfarande av Excel. När Excel-data matar en formell testfall repository gäller samma disciplin för resultat: exportera en gång, verifiera att filen finns och bifoga den sedan till körningen.

För att gå vidare med de ämnen som berörs här, arbeta dig igenom hela QTP/UFT handledning för det bredare ramverket, lär dig hur du kan driva resultat in i ALM från UFT, granska grunderna i mjukvarutestningoch jämföra metoden med datadriven skriptning i Selenium.

Vanliga frågor

UFT importerar .xls-, .xlsx- och .csv-filer till datatabellen under körning. Export producerar alltid en .xls-arbetsbok, så en konverterare eller Excel COM-objektet behövs när det nedströms bestående systemet kräver det nyare .xlsx-formatet.

Designtidstabellen sparas med testet och förblir oförändrad. Körtidstabellen är en kopia som skapas när körningen startar. Importer och värdetilldelningar påverkar endast körtidskopian, som ignoreras om den inte exporteras.

Nej för DataTable-objektet, som tolkar själva arbetsboken. Ja för alla skript som anropar CreateObject("Excel.Application"), eftersom den rutten automatiserar en riktig Excel-instans och misslyckas omedelbart på en maskin utan det.

Ja. Anropa ImportSheet en gång per ark med ett annat destinationsarknamn varje gång. Globala data hör hemma på det globala arket, medan åtgärdsspecifika värden hör hemma på det matchande åtgärdsarket så att iterationer förblir oberoende.

Ja, och loopskelettet är oftast korrekt. Verifiera två saker manuellt: att SetCurrentRow finns inuti loopen, och att numeriska celler konverteras med CInt eller CDbl. Genererad kod utelämnar ofta båda.

AI-funktioner i moderna UFT En version kan identifiera kontroller visuellt, så ett omdöpt fält bryter inte längre varje rad i en datamängd. AI kan också föreslå ytterligare avgränsningsrader, vilket breddar kalkylbladets täckning utan manuell testdesign.

Sammanfatta detta inlägg med: