Sådan læser/skriver du Excel-data i Selenium Brug af Apache POI

⚡ Smart opsummering

Excel-filer drev Selenium datadrevne tests, og Apache POI er Java bibliotek, der læser og skriver til dem. Afsnittene nedenfor dækker afhængigheden, kerneklasserne, læse- og skriveeksemplerne og JXL.

  • 🔘 To formater: HSSF-klasser håndterer .xls, XSSF-klasser håndterer .xlsx.
  • ✅ Kernegrænseflader: Projektmappe, ark, række og celle spejler et regneark.
  • 🧪 Læsning: FileInputStream plus getLastRowNum kører en løkke på hver række og celle.
  • 🛠️ Skrivning: createRow og setCellValue tilføjer data, FileOutputStream gemmer dem.
  • 📊 Eftermæle: JXL læser gamle projektbøger, men ikke XLSX.

Læsning og skrivning af Excel-data i Selenium med Apache POI

Fil IO er en kritisk del af enhver softwareproces. Vi opretter ofte en fil, åbner den og opdaterer noget eller sletter den på vores computere. Det samme er tilfældet med Selenium Automatisering. Vi har brug for en proces til at manipulere filer med Selenium.

Java giver os forskellige klasser til filmanipulation med Selenium. I denne tutorial skal vi lære, hvordan vi kan læse og skrive videre Excel fil ved hjælp af Java IO-pakke og Apache POI-bibliotek.

Apache POI ind Selenium

Apache POI ind Selenium er et udbredt API til Selenium datadrevet testDet er et POI-bibliotek skrevet i Java der giver brugerne en API til at manipulere Microsoft dokumenter som .xls og .xlsx. Brugere kan nemt oprette, ændre og læse/skrive til Excel-filer. POI står for "Poor Obfuscation Implementation" (Dårlig Implementering af Obfuscation).

Sådan håndterer du en Excel-fil ved hjælp af POI (Maven POM-afhængighed)

POI-links Selenium test til arbejdsbogen nedenfor.

Apache POI fungerer som bro mellem en Selenium test og en Excel-projektmappe

At læse og skrive Excel-fil i JavaApache leverer et meget berømt biblioteks-POI. Dette bibliotek er kapabelt nok til at læse og skrive til både XLS- og XLSX-filformater i Excel.

For at læse XLS-filer leveres en HSSF-implementering af POI-biblioteket.

For at læse XLSX vil XSSF-implementeringen af ​​POI-biblioteket være det foretrukne valg. Lad os studere disse implementeringer i detaljer.

Hvis du bruger Maven i dit projekt, vil Maven-afhængigheden blive tilføjet til pom.xml som vist nedenfor.

POI-afhængighedspost tilføjet til pom.xml-filen i et Maven-projekt

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>

Versionsnotat: 4.1.1 er det originale eksempel; nuværende projekter erklærer poi-ooxml 5.5.1, som er påkrævet for XLSX.

Eller du kan blot downloade den seneste version af POI-krukker fra http://poi.apache.org/download.html & download den seneste zip-fil

Apache POI downloadside med en liste over arkiverne for binær- og kildekodedistribution

Når du downloader zip-filen til denne krukke, skal du pakke den ud og tilføje alle disse krukker til klassestien til dit projekt.

Udpakkede POI jar-filer tilføjet til Java projektets byggesti

Klasser og grænseflader i POI

Følgende er en liste over forskellige Java Grænseflader og klasser i POI til læsning af XLS- og XLSX-filer, vist nedenfor:

POI-klassehierarki fra projektmappe ned til ark, rækker og celler

  • projektmappe: XSSFWorkbook- og HSSFWorkbook-klasser implementerer denne grænseflade.
  • XSSF-arbejdsbog: Er en klasserepræsentation af en XLSX-fil.
  • HSSF-arbejdsbog: Er en klasserepræsentation af en XLS-fil.
  • Ark: XSSFheet- og HSSFheet-klasserne implementerer denne grænseflade.
  • XSSFSheet: Er en klasse, der repræsenterer et ark i en XLSX-fil.
  • HSSF-ark: Er en klasse, der repræsenterer et ark i en XLS-fil.
  • Række: XSSFRow- og HSSFRow-klasserne implementerer denne grænseflade.
  • XSSF-strækning: Er en klasse, der repræsenterer en række i arket i en XLSX-fil.
  • HSSFRow: Er en klasse, der repræsenterer en række i arket i en XLS-fil.
  • Celle: XSSFCell- og HSSFCell-klasserne implementerer denne grænseflade.
  • XSSFCelle: Er en klasse, der repræsenterer en celle i en række i en XLSX-fil.
  • HSSFCell: Er en klasse, der repræsenterer en celle i en række af XLS-fil.

Læse skrive Operation

For vores eksempel vil vi overveje nedenfor givet Excel-filformat

Eksempel på ExportExcel-projektmappe med ExcelGuru99 Demoark brugt af begge eksempler

Læs data fra Excel-fil

Komplet eksempel: Her prøver vi at læse data fra Excel Selenium:

package excelExportAndFileIO;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadGuru99ExcelFile {

    public void readExcel(String filePath,String fileName,String sheetName) throws IOException{

    //Create an object of File class to open xlsx file

    File file =    new File(filePath+"\\"+fileName);

    //Create an object of FileInputStream class to read excel file

    FileInputStream inputStream = new FileInputStream(file);

    Workbook guru99Workbook = null;

    //Find the file extension by splitting file name in substring  and getting only extension name

    String fileExtensionName = fileName.substring(fileName.indexOf("."));

    //Check condition if the file is xlsx file

    if(fileExtensionName.equals(".xlsx")){

    //If it is xlsx file then create object of XSSFWorkbook class

    guru99Workbook = new XSSFWorkbook(inputStream);

    }

    //Check condition if the file is xls file

    else if(fileExtensionName.equals(".xls")){

        //If it is xls file then create object of HSSFWorkbook class

        guru99Workbook = new HSSFWorkbook(inputStream);

    }

    //Read sheet inside the workbook by its name

    Sheet guru99Sheet = guru99Workbook.getSheet(sheetName);

    //Find number of rows in excel file

    int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum();

    //Create a loop over all the rows of excel file to read it

    for (int i = 0; i < rowCount+1; i++) {

        Row row = guru99Sheet.getRow(i);

        //Create a loop to print cell values in a row

        for (int j = 0; j < row.getLastCellNum(); j++) {

            //Print Excel data in console

            System.out.print(row.getCell(j).getStringCellValue()+"|| ");

        }

        System.out.println();
    } 

    }  

    //Main function is calling readExcel function to read data from excel file

    public static void main(String...strings) throws IOException{

    //Create an object of ReadGuru99ExcelFile class

    ReadGuru99ExcelFile objExcelFile = new ReadGuru99ExcelFile();

    //Prepare the path of excel file

    String filePath = System.getProperty("user.dir")+"\\src\\excelExportAndFileIO";

    //Call read file method of the class to read data

    objExcelFile.readExcel(filePath,"ExportExcel.xlsx","ExcelGuru99Demo");

    }

}

Bemærk: Vi bruger ikke TestNG rammer her. Kør klassen som Java Applikation, der bruger funktion read excel in Selenium som vist i ovenstående eksempel.

Konsollen udskriver derefter hver række, celle for celle.

Konsoloutput, der viser hver Excel-række udskrevet med celleværdier adskilt af streger

Skriv data i Excel-fil

Komplet eksempel: Her prøver vi at skrive data fra en Excel-fil ved at tilføje en ny række i Excel-filen.

package excelExportAndFileIO;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class WriteGuru99ExcelFile {

    public void writeExcel(String filePath,String fileName,String sheetName,String[] dataToWrite) throws IOException{

        //Create an object of File class to open xlsx file

        File file =    new File(filePath+"\\"+fileName);

        //Create an object of FileInputStream class to read excel file

        FileInputStream inputStream = new FileInputStream(file);

        Workbook guru99Workbook = null;

        //Find the file extension by splitting  file name in substring and getting only extension name

        String fileExtensionName = fileName.substring(fileName.indexOf("."));

        //Check condition if the file is xlsx file

        if(fileExtensionName.equals(".xlsx")){

        //If it is xlsx file then create object of XSSFWorkbook class

        guru99Workbook = new XSSFWorkbook(inputStream);

        }

        //Check condition if the file is xls file

        else if(fileExtensionName.equals(".xls")){

            //If it is xls file then create object of XSSFWorkbook class

            guru99Workbook = new HSSFWorkbook(inputStream);

        }    

    //Read excel sheet by sheet name    

    Sheet sheet = guru99Workbook.getSheet(sheetName);

    //Get the current count of rows in excel file

    int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum();

    //Get the first row from the sheet

    Row row = sheet.getRow(0);

    //Create a new row and append it at last of sheet

    Row newRow = sheet.createRow(rowCount+1);

    //Create a loop over the cell of newly created Row

    for(int j = 0; j < row.getLastCellNum(); j++){

        //Fill data in row

        Cell cell = newRow.createCell(j);

        cell.setCellValue(dataToWrite[j]);

    }

    //Close input stream

    inputStream.close();

    //Create an object of FileOutputStream class to create write data in excel file

    FileOutputStream outputStream = new FileOutputStream(file);

    //write data in the excel file

    guru99Workbook.write(outputStream);

    //close output stream

    outputStream.close();
	
    }

    public static void main(String...strings) throws IOException{

        //Create an array with the data in the same order in which you expect to be filled in excel file

        String[] valueToWrite = {"Mr. E","Noida"};

        //Create an object of current class

        WriteGuru99ExcelFile objExcelFile = new WriteGuru99ExcelFile();

        //Write the file using file name, sheet name and the data to be filled

        objExcelFile.writeExcel(System.getProperty("user.dir")+"\\src\\excelExportAndFileIO","ExportExcel.xlsx","ExcelGuru99Demo",valueToWrite);

    }

}

Projektmappen indeholder derefter den tilføjede række.

Excel-ark efter den nye række med hr. E og Noida er blevet tilføjet

Excel-manipulation ved hjælp af JXL API

JXL er også en anden berømt krukke at læse Excel-fil i Java og skrive filer. I dag bruges POI i de fleste projekter, men før POI var JXL kun Java API til Excel-manipulation. Det er en meget lille og enkel API til Excel-læsning Selenium.

JXL jar-filen er opført blandt projektbibliotekerne

TIP: Mit forslag er ikke at bruge JXL i nye projekter, da biblioteket ikke er under aktiv udvikling siden 2010 — 2.6.12 er stadig den seneste udgivelse — og funktionen mangler i forhold til POI API.

Download JXL:

Hvis du vil arbejde med JXL, kan du downloade det fra dette link

https://sourceforge.net/projects/jexcelapi/files/jexcelapi/2.6.12/

Du kan også få et demoeksempel i denne zip-fil til JXL, som f.eks.tracIndholdet nedenfor viser.

Extracted JXL-arkiv, der viser jar-, dokumentations- og demomapperne

Nogle af funktionerne:

  • JXL er i stand til at læse Excel-fil i Selenium til 95, 97, 2000, XP, 2003 projektmappe.
  • Vi kan arbejde med engelsk, fransk, spansk, tysk.
  • Det er muligt at kopiere et diagram og billedindsættelse i Excel

Ulempe:

  • Vi kan kun skrive Excel 97 og senere (skrivning i Excel 95 understøttes ikke).
  • JXL understøtter ikke XLSX-formatet af excel-fil.
  • Det genererer regneark i Excel 2000-format.

Ofte Stillede Spørgsmål

Erklære poi-ooxml, ikke kun poi. Den trækker poi ind transitivt og leverer de XSSF-klasser, som XLSX har brug for. 5.5.1 er den nyeste version.

OOXML-siden af ​​POI mangler eller er uoverensstemmende. Tilføj poi-ooxml og behold alle POI-artefakter på én version, da blandede udgivelser efterlader skemaklasser uden for stien.

getStringCellValue fungerer kun på tekstceller. Brug DataFormatter til at læse enhver celle som en streng, eller tjek getCellType og kald FormulaEvaluator på formler.

En manglende række eller celle returnerer null, så løkken kaster NullPointerException. Test først for null eller CellType.BLANK, eller angiv en MissingCellPolicy, så blanke felter returnerer tomme celler.

Maskinlæringsmodeller genererer realistiske rækker, markerer dubletter og rangerer hvilke kombinationer der bedst eksponerer defekter, hvilket fjerner oppustede data. datadrevet test ark.

GitHub Copilot udkast til læser- og forfatterstandard ud fra en kommentar. RevSe det, fordi det ofte antyder forældede celletypekonstanter fra ældre POI-udgivelser.

SXSSFWorkbook streamer rækker til disken i stedet for at holde projektmappen i hukommelsen, så store eksporter forhindrer i at udløse OutOfMemoryError. Håndter rækker inde i løkken ved læsning.

Behold den under src/test/resources og byg stien fra System.getProperty("user.dir"). Absolutte stier afbrydes, når pakken kører et andet sted eller på en Jenkins agent.

Opsummer dette indlæg med: