Sådan importerer, læser og ændrer du data fra Excel i QTP/UFT

⚡ Smart opsummering

Import, læsning og ændring af data fra Excel i QTP/UFT er afhængig af det indbyggede DataTable-objekt, som indlæser en projektmappe i runtime-datatabellen, så hvert automatiseringsscript kan køre testtrin fra regnearksrækker.

  • 📥 Importere: DataTable.Import indlæser en hel projektmappe, mens DataTable.ImportSheet trækker et navngivet ark ind i et valgt destinationsark.
  • 🗂️ Overskriftsregel: Den første række i regnearket bliver kolonnenavnene, så strukturer arket, inden importen kører.
  • 🔢 Antal rækker: DataTable.GetSheet(1).GetRowCount returnerer antallet af datarækker og ekskluderer overskriftsrækken.
  • 🎯 Rækkepeger: Kald DataTable.SetCurrentRow før hver læsning, så DataTable.Value returnerer den forventede celle.
  • ✏️ Skriv tilbage: Tildeling til DataTable.Value ændrer kun en celle i hukommelsen; DataTable.Export gemmer arket på disken.
  • 🧩 COM-mulighed: Opret et Excel.Application-objekt, når formatering, formler eller flere åbne projektmapper er nødvendige.
  • ⚠️ Ryd op: Kald altid Quit- og release-objekter, ellers forbliver EXCEL.EXE resident og låser filen.

Sådan importerer, læser og ændrer du data fra Excel i QTP/UFT

Regneark er fortsat det mest almindelige sted, hvor testere opbevarer deres inputværdier, forventede resultater og miljøindstillinger. QTP, nu solgt som OpenText UFT En efter at produktet flyttede fra HP til Micro Focus og derefter til OpenText, læser disse regneark via DataTable-objektet. Afsnittene nedenfor viser de nøjagtige sætninger, der bruges til at importere en projektmappe, tælle dens rækker, læse individuelle celler, ændre værdier og skrive arket tilbage til disken.

Trin til at importere, læse, ændre data fra EXCEL

Overvej at du vil importere følgende Salg.xls arbejdsbogen i din prøve.

Sales.xls-kildeprojektmappen åbnet i Excel før import til UFT

Når filen er importeret til UFT, bliver den øverste række kolonneoverskriften, så strukturer dine data i overensstemmelse hermed. Alt i række 1 behandles som et parameternavn i stedet for testdata, og hver resterende række tælles som en datarække.

Syntaksen til at importere en hel Excel-fil er vist nedenfor.

DataTable.Import(FileName)

I vores tilfælde bliver sætningen følgende. VBScript behøver ikke parenteser, når en metode kaldes som en sætning, så den almindelige form bruges her.

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

Efter kørslen vises de importerede rækker i dataruden under kørsel præcis som de blev lagt ud i projektmappen.

Importerede salgsdata vist i UFT Runtime Data Table-ruden

Syntaksen til at importere et bestemt ark vises nedenfor. SheetSource er arket inde i projektmappen, og SheetDest er destinationsarket i kørselsdatatabellen.

DataTable.ImportSheet FileName, SheetSource, SheetDest

Brug HentRækkeAntal metode til at finde antallet af datarækker i et ark. Hver sætning skal stå på sin egen linje.

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

Den viste meddelelsesboks viser rækketotalen for det importerede ark.

msgBox visning af GetRowCount-resultatet for det importerede salgsark

For at flytte markøren til en bestemt række skal du bruge SætAktuelRække metode. Det andet argument i DataTable.Value er arknummeret, ikke rækkenummeret, hvilket er grunden til, at rækkemarkøren skal flyttes 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

Begge værdier læses fra den samme kolonne, men fra to forskellige rækker, og meddelelsesboksen udskriver dem side om side.

msgBox sammenligning af årsværdien i række 1 og række 2 i datatabellen

Brug Værdi metoden til venstre for en opgave for at ændre data i det importerede ark. Ændringen forbliver i hukommelsen, indtil du kalder eksport, som skriver kørselsdatatabellen tilbage til en Excel-fil.

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

Den redigerede celle er synlig i dataruden under kørsel lige efter at tildelingen er kørt.

Runtime-datatabel, der viser en celle, der er opdateret via DataTable.Value-metoden

Åbning af den eksporterede projektmappe bekræfter, at de ændrede værdier blev gemt på disken i stedet for kun at være bevaret i løbet af kørslen.

Eksporteret Excel-fil åbnet i Excel, der viser de ændrede værdier gemt af DataTable.Export

💡 Tip: Eksportér til et andet filnavn end det, du importerede. At skrive tilbage til den samme åbne projektmappe er den hurtigste måde at udløse en delingsfejl og miste kørslen på.

Sådan læser, ændrer og eksporterer du Excel-data: Et komplet eksempel

Uddragene ovenfor demonstrerer hver især én metode. I en rigtig datadrevet test kombineres de i et enkelt loop, der gennemgår hver række, beregner noget, gemmer resultatet og eksporterer arket. Antag projektmappen Salg.xls indeholder de følgende fire kolonner og tre datarækker.

År Område Enheder Pris
2023 Øst 120 25
2024 Øst 150 25
2025 Vest 200 30

Skriptet nedenfor tilføjer en Revenue kolonne, udfylder den række for række, holder en løbende total og skriver det færdige ark til en ny fil. AddParameter bruges fordi kolonnen ikke findes i kildeprojektmappen; kald af den for en kolonne, der allerede findes, giver en fejl.

' 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

Output:

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 dette manuskript er vigtigere end resten. For det første, GetRowCount returnerer 3 i stedet for 4, fordi overskriftsrækken bruges som kolonnenavne. For det andet, SetCurrentRow kaldes øverst i hver iteration; uden den ville alle tre iterationer læse den samme række. For det tredje er værdier, der kommer ud af datatabellen, strenge, så CInt anvendes før multiplikationen for at undgå strengsammenkædning i stedet for aritmetik. Spring overping DataTable.Export ville efterlade den beregnede omsætning synlig i datapuden, men fraværende fra nogen filer på disken.

DataTable-objekt vs. Excel COM-objekt i UFT

DataTable-objektet er ikke den eneste måde at få adgang til et regneark. UFT scripts kan også oprette en Excel.Application COM-objekt og køre Excel direkte. De to tilgange løser forskellige problemer.

Aspect DataTable-objekt Excel COM-objekt
Excel-installation Ikke påkrævet på udførelsesmaskinen Microsoft Excel skal være installeret
Adresseringsstil Efter kolonnenavn og rækkepeger Efter cellekoordinater, områder eller navngivne områder
gentagelser Rækker driver automatisk test iterationer Intet link til iterationer; looping er manuel
Formatering og formler Ignoreret; kun værdier læses Fuld adgang til formler, farver og diagrammer
Flere arbejdsbøger Én runtime-tabel, ark importeret ét ad gangen Et hvilket som helst antal arbejdsbøger åbne på én gang
Resultatrapportering Værdier vises i UFT kør resultater automatisk Intet bliver registreret, medmindre du selv anmelder det
Oprydningsbyrde Håndteres af UFT Du skal lukke, afslutte og frigive alle objekter

Den praktiske regel er enkel. Brug DataTable-objektet til ligefrem parameterisering, hvor hver række i regnearket bliver én iteration af en automatiseringstest Kør. Skift kun til COM-objektet, når du har brug for noget, som datatabellen ikke kan udtrykke, f.eks. at læse et formelresultat, skrive en formateret rapport eller sammenligne to projektmapper i det samme script. Eksemplet nedenfor læser én celle, skriver en status tilbage og lukker Excel korrekt ned.

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

Output:

Cell A2 contains: 2023

Celle A2 indeholder 2023, fordi række 1 i regnearket er overskriftsrækken, og kolonne A er ÅrBemærk at COM-adressering er én-baseret og tæller headeren, hvorimod DataTable.SetCurrentRow 1 punkter på den første datarække.

Almindelige fejl ved brug af Excel med UFT og hvordan man fikser dem

De fleste Excel-problemer i UFT stammer fra et lille sæt gentagne fejl. At genkende dem sparer en masse fejlfindingstid.

⚠️ Advarsel: En forældreløs EXCEL.EXE-proces er den mest almindelige bivirkning af COM-automatisering. Hver CreateObject("Excel.Application") der ikke matches af Quit plus Set … = Nothing efterlader en skjult Excel-instans kørende. Efter et par hundrede testkørsler er udførelsesmaskinen løbet tør for hukommelse, og kildeprojektmappen er låst for redigering.

  • Excel forbliver i hukommelsen. Luk projektmappen, ring xlApp.Quit, og frigiv derefter arket, projektmappen og applikationsobjekterne i den rækkefølge. Når applikationen først frigives, efterlades der en aktiv reference, og processen holdes i gang.
  • Ændringerne forsvinder efter løbet. DataTable.Value skriver kun til runtime-datatabellen. Uden DataTable.Export, intet når filsystemet.
  • "Kolonnen findes ikke" eller en ugyldig parameterfejl. Kolonnenavnet blev overført til DataTable.Value skal matche headercellen nøjagtigt, inklusive efterfølgende mellemrum. AddParameter at oprette en kolonne, før der skrives til den.
  • Hver iteration læser de samme værdier. SetCurrentRow blev ikke kaldt inde i løkken, så rækkemarkøren flyttede sig aldrig.
  • Der tælles én række væk. GetRowCount ekskluderer overskriftsrækken. En projektmappe med en overskrift og ti poster returnerer 10, ikke 11.
  • Sti- og tilladelsesfejl. Hardkodede stier som f.eks. D:\Automation\Sales.xls pause på andre maskiner. Byg stien fra en miljøvariabel, så det samme script kører på alle agenter.
  • Sammenflettede celler og flere overskriftsrækker. Importen forventer præcis én overskriftsrække med unikke navne. Sammenflettede celler producerer tomme eller duplikerede parameternavne.
  • Overtrædelse af delingsregler ved eksport. Destinationsfilen kan ikke åbnes i Excel, mens Export kører. Luk den først, eller eksporter til et tidsstemplet filnavn.

En nyttig vane er at pakke COM-oprydning ind i en On Error Resume Next blok placeret i en dedikeret gendannelsesfunktion, så en fejl midt i et script stadig lukker Excel ned. Når Excel-data føder en formel test sag I repository gælder den samme disciplin for resultater: eksporter én gang, bekræft at filen findes, og vedhæft den derefter til kørslen.

For at komme videre med de emner, der er berørt her, skal du gennemgå hele QTP/UFT tutorial for den bredere ramme, lær hvordan du presser resultater ind i ALM fra UFT, gennemgå det grundlæggende i software testog sammenlign tilgangen med datadrevet scripting i Selenium.

Ofte Stillede Spørgsmål

UFT importerer .xls-, .xlsx- og .csv-filer til runtime-datatabellen. Eksport producerer altid en .xls-projektmappe, så en konverter eller Excel COM-objektet er nødvendig, når downstream-systemet kræver det nyere .xlsx-format.

Designtidstabellen gemmes sammen med testen og forbliver uændret. Runtime-tabellen er en kopi, der oprettes, når udførelsen starter. Importer og værditildelinger påvirker kun runtime-kopien, som kasseres, medmindre den eksporteres.

Nej for DataTable-objektet, som parser selve projektmappen. Ja for ethvert script, der kalder CreateObject("Excel.Application"), fordi den rute automatiserer en rigtig Excel-instans og fejler øjeblikkeligt på en maskine uden det.

Ja. Kald ImportSheet én gang pr. ark med et forskelligt destinationsarknavn hver gang. Globale data hører hjemme på det globale ark, mens handlingsspecifikke værdier hører hjemme på det matchende handlingsark, så iterationer forbliver uafhængige.

Ja, og løkkeskelettet er normalt korrekt. Bekræft to ting manuelt: at SetCurrentRow sidder inde i løkken, og at numeriske celler konverteres med CInt eller CDbl. Genereret kode udelader ofte begge dele.

AI-funktioner i moderne UFT One-releasen genkender kontroller visuelt, så et omdøbt felt ikke længere bryder hver række i et datasæt. AI kan også foreslå yderligere afgrænsningsrækker, hvilket udvider regnearksdækningen uden manuelt testdesign.

Opsummer dette indlæg med: