Hur man läser/skriver Excel-data i Selenium Använda Apache POI

⚡ Smart sammanfattning

Excel-filer-enhet Selenium datadrivna tester, och Apache POI är Java bibliotek som läser och skriver dem. Avsnitten nedan täcker beroendet, kärnklasser, exempel på läsning och skrivning och JXL.

  • 🔘 Två format: HSSF-klasser hanterar .xls, XSSF-klasser hanterar .xlsx.
  • Kärngränssnitt: Arbetsbok, ark, rad och cell speglar ett kalkylblad.
  • 🧪 Läsning: FileInputStream plus getLastRowNum loopar varje rad och cell.
  • 🛠️ Skrift: createRow och setCellValue lägger till data, FileOutputStream sparar det.
  • 📊 Arv: JXL läser gamla arbetsböcker men inte XLSX.

Läsa och skriva Excel-data i Selenium med Apache POI

File IO är en kritisk del av alla programvaruprocesser. Vi skapar ofta en fil, öppnar den och uppdaterar något eller tar bort den på våra datorer. Samma är fallet med Selenium Automatisering. Vi behöver en process att manipulera filer med Selenium.

Java ger oss olika klasser för filhantering med Selenium. I den här handledningen ska vi lära oss hur vi kan läsa och skriva vidare excel fil med hjälp av Java IO-paket och Apache POI-bibliotek.

Apache POI in Selenium

Ocuco-landskapet Apache POI in Selenium är ett vanligt förekommande API för Selenium datadrivna testerDet är ett POI-bibliotek skrivet i Java som ger användarna ett API för att manipulera Microsoft dokument som .xls och .xlsx. Användare kan enkelt skapa, ändra och läsa/skriva till Excel-filer. POI står för "Poor Obfuscation Implementation" (dålig implementering av obfuscation).

Hur man hanterar Excel-filer med hjälp av POI (Maven POM-beroende)

POI-länkar a Selenium test till arbetsboken nedan.

Apache POI som fungerar som brygga mellan en Selenium test och en Excel-arbetsbok

Att läsa och skriva Excel-fil i JavaApache tillhandahåller ett mycket välkänt POI-bibliotek. Detta bibliotek kan läsa och skriva både XLS- och XLSX-filer i Excel.

För att läsa XLS-filer tillhandahålls en HSSF-implementering av POI-biblioteket.

För att läsa XLSX är XSSF-implementeringen av POI-biblioteket det bästa valet. Låt oss studera dessa implementeringar i detalj.

Om du använder Maven i ditt projekt kommer Maven-beroendet att läggas till i pom.xml enligt nedan.

POI-beroendepost tillagd i pom.xml-filen för ett Maven-projekt

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

Versionsnotering: 4.1.1 är det ursprungliga exemplet; nuvarande projekt deklarerar poi-ooxml 5.5.1, vilket krävs för XLSX.

Eller så kan du helt enkelt ladda ner den senaste versionen POI-burkar från http://poi.apache.org/download.html & ladda ner den senaste zip-filen

Apache POI-nedladdningssida som listar arkiven för binär- och källkodsdistribution

När du laddar ner zip-filen för den här burken måste du packa upp den och lägga till alla dessa burkar till klasssökvägen för ditt projekt.

Uppackade POI jar-filer har lagts till i Java projektets byggväg

Klasser och gränssnitt i POI

Följande är en lista över olika Java Gränssnitt och klasser i POI för att läsa XLS- och XLSX-filer, visas nedan-

POI-klasshierarki från arbetsbok ner till ark, rad och cell

  • arbetsbok: Klasserna XSSFWorkbook och HSSFWorkbook implementerar detta gränssnitt.
  • XSSF-arbetsbok: Är en klassrepresentation av en XLSX-fil.
  • HSSF-arbetsbok: Är en klassrepresentation av en XLS-fil.
  • Ark: Klasserna XSSFheet och HSSFheet implementerar detta gränssnitt.
  • XSSF-ark: Är en klass som representerar ett ark i en XLSX-fil.
  • HSSF-ark: Är en klass som representerar ett ark i en XLS-fil.
  • Rad: Klasserna XSSFRow och HSSFRow implementerar detta gränssnitt.
  • XSSF-rad: Är en klass som representerar en rad i arket i en XLSX-fil.
  • HSSFRå: Är en klass som representerar en rad i arket i en XLS-fil.
  • Cell: Klasserna XSSFCell och HSSFCell implementerar detta gränssnitt.
  • XSSFCell: Är en klass som representerar en cell i en rad i en XLSX-fil.
  • HSSFCell: Är en klass som representerar en cell i en rad av XLS-fil.

Läsa skriva Operation

För vårt exempel kommer vi att överväga nedan givet Excel-filformat

Exempel på ExportExcel-arbetsbok med ExcelGuru99 Demoblad som används av båda exemplen

Läs data från Excel-fil

Komplett exempel: Här försöker vi läsa data från Excel i 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");

    }

}

Obs: Vi använder inte TestNG ram här. Kör klassen som Java Applikation som använder funktionen läs excel in Selenium som visas i exemplet ovan.

Konsolen skriver sedan ut varje rad, cell för cell.

Konsolutdata som visar varje Excel-rad utskriven med cellvärden separerade med streck.

Skriv data i Excel-fil

Komplett exempel: Här försöker vi skriva data från Excel-filen genom att lägga till en ny rad 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);

    }

}

Arbetsboken innehåller sedan den bifogade raden.

Excel-ark efter att den nya raden med Mr. E och Noida har lagts till

Excel-manipulation med JXL API

JXL är också en annan berömd burk att läsa Excel-fil i Java och skriva filer. Numera används POI i de flesta projekt, men innan POI var det bara JXL Java API för Excel-manipulation. Det är ett mycket litet och enkelt API för att läsa in Excel Selenium.

JXL jar-filen listad bland projektbiblioteken

TIPS: Mitt förslag är att inte använda JXL i några nya projekt eftersom biblioteket inte är under aktiv utveckling sedan 2010 — 2.6.12 är fortfarande den senaste versionen — och saknar funktionen jämfört med POI API.

Ladda ner JXL:

Om du vill arbeta med JXL kan du ladda ner det från denna länk

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

Du kan också få ett demoexempel i den här zippade filen för JXL, som exempel.tracinnehållet nedan visar.

Extracted JXL-arkiv som visar jar-, dokumentations- och demomappar

Några detaljer:

  • JXL kan läsa Excel-fil i Selenium för 95, 97, 2000, XP, 2003 arbetsbok.
  • Vi kan arbeta med engelska, franska, spanska, tyska.
  • Det är möjligt att kopiera ett diagram och infogning av bilder i Excel

Nackdel:

  • Vi kan bara skriva Excel 97 och senare (skriva i Excel 95 stöds inte).
  • JXL stöder inte XLSX-formatet för Excel-filen.
  • Det genererar kalkylblad i Excel 2000-format.

Vanliga frågor

Förklara poi-ooxml, inte bara poi. Den hämtar poi transitivt och tillhandahåller de XSSF-klasser som XLSX behöver. 5.5.1 är aktuell.

OOXML-sidan av POI saknas eller stämmer inte överens. Lägg till poi-ooxml och behåll varje POI-artefakt på en version, eftersom blandade utgåvor lämnar schemaklasser utanför sökvägen.

getStringCellValue fungerar bara på textceller. Använd DataFormatter för att läsa vilken cell som helst som en sträng, eller kontrollera getCellType och anropa FormulaEvaluator på formler.

En saknad rad eller cell returnerar null, så loopen utlöser NullPointerException. Testa först för null eller CellType.BLANK, eller ange en MissingCellPolicy så att mellanslag returnerar tomma celler.

Maskininlärningsmodeller genererar realistiska rader, flaggar dubbletter och rangordnar vilka kombinationer som bäst exponerar defekter, vilket minskar uppsvällda resultat. datadrivna tester ark.

GitHub Copilot utkastar läsare och skribentstandard från en kommentar. Revvisa det, eftersom det ofta antyder föråldrade celltypskonstanter från äldre POI-utgåvor.

SXSSFWorkbook strömmar rader till disk istället för att lagra arbetsboken i minnet, så stora exporter slutar utlösa OutOfMemoryError. Hantera rader inuti loopen vid läsning.

Behåll den under src/test/resources och bygg sökvägen från System.getProperty("user.dir"). Absoluta sökvägar bryts när sviten körs någon annanstans eller på en Jenkins medlet.

Sammanfatta detta inlägg med: