Hoe lees/schrijf ik gegevens in Excel? Selenium Apache POI gebruiken

โšก Slimme samenvatting

Excel-bestanden op de schijf Selenium datagestuurde tests, en Apache POI is de Java Een bibliotheek die ze leest en schrijft. De onderstaande secties behandelen de afhankelijkheid, de kernklassen, lees- en schrijfvoorbeelden en JXL.

  • ๐Ÿ”˜ Twee formaten: HSSF-klassen verwerken .xls-bestanden, XSSF-klassen verwerken .xlsx-bestanden.
  • โœ… Kerninterfaces: Werkmap, blad, rij en cel zijn een spiegelbeeld van een spreadsheet.
  • ๐Ÿงช Lezing: FileInputStream plus getLastRowNum doorloopt elke rij en cel.
  • ๏ธ Schrijven: Met createRow en setCellValue worden gegevens toegevoegd, FileOutputStream slaat deze op.
  • ๐Ÿ“Š Nalatenschap: JXL kan oude werkmappen lezen, maar geen XLSX-bestanden.

Gegevens lezen en schrijven in Excel Selenium met Apache POI

Bestands-IO is een cruciaal onderdeel van elk softwareproces. We maken regelmatig een bestand, openen het en werken iets bij of verwijderen het op onze computers. Hetzelfde is het geval met Selenium Automatisering. We hebben een proces nodig om bestanden mee te manipuleren Selenium.

Java biedt ons verschillende klassen voor bestandsmanipulatie Selenium. In deze tutorial gaan we leren hoe we kunnen lezen en schrijven Excel bestand met de hulp van Java IO-pakket en apache POI-bibliotheek.

Apache POI binnen Selenium

De Apache POI binnen Selenium is een veelgebruikte API voor Selenium datagedreven testenHet is een POI-bibliotheek geschreven in Java dat gebruikers een API geeft om te manipuleren Microsoft documenten zoals .xls en .xlsx. Gebruikers kunnen eenvoudig Excel-bestanden maken, bewerken en lezen/schrijven. POI staat voor "Poor Obfuscation Implementation" (slechte implementatie van versleuteling).

Hoe Excel-bestanden te verwerken met POI (Maven POM-afhankelijkheid)

POI-links Selenium Test de resultaten in het onderstaande werkboek.

Apache POI fungeert als brug tussen een Selenium test en een Excel-werkmap

Excel-bestand lezen en schrijven JavaApache biedt de zeer bekende bibliotheek POI aan. Deze bibliotheek is in staat om zowel XLS- als XLSX-bestanden van Excel te lezen en te schrijven.

Om XLS-bestanden te lezen, biedt de POI-bibliotheek een HSSF-implementatie.

Om XLSX-bestanden te lezen, is de XSSF-implementatie van de POI-bibliotheek de beste keuze. Laten we deze implementaties eens nader bekijken.

Als je Maven in je project gebruikt, wordt de Maven-afhankelijkheid aan pom.xml toegevoegd zoals hieronder weergegeven.

POI-afhankelijkheidsvermelding toegevoegd aan het pom.xml-bestand van een Maven-project.

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

Versie-opmerking: 4.1.1 is het oorspronkelijke voorbeeld; huidige projecten verklaren poi-ooxml 5.5.1, wat vereist is voor XLSX.

Of u kunt eenvoudig de nieuwste versie van POI-potten downloaden http://poi.apache.org/download.html & download het nieuwste zipbestand

Apache POI-downloadpagina met een overzicht van de binaire en broncode-distributiearchieven.

Wanneer u het zipbestand voor deze jar downloadt, moet u deze uitpakken en deze allemaal toevoegen aan het klassenpad van uw project.

Uitgepakte POI JAR-bestanden toegevoegd aan de Java bouwpad van het project

Klassen en interfaces in POI

Hieronder volgt een lijst met verschillende Java Hieronder ziet u de interfaces en klassen in POI voor het lezen van XLS- en XLSX-bestanden.

POI-klassehiรซrarchie van werkmap tot blad, rij en cel.

  • Werkboek: De klassen XSSFWorkbook en HSSFWorkbook implementeren deze interface.
  • XSSF-werkboek: Dit is een klasse-representatie van een XLSX-bestand.
  • HSSF-werkboek: Dit is een klasse-representatie van een XLS-bestand.
  • Vel: De klassen XSSFSheet en HSSFSheet implementeren deze interface.
  • XSSFSheet: Een klasse die een werkblad in een XLSX-bestand vertegenwoordigt.
  • HSSFSheet: Een klasse die een werkblad in een XLS-bestand vertegenwoordigt.
  • Rij: De klassen XSSFRow en HSSFRow implementeren deze interface.
  • XSSFRow: Is een klasse een rij in het werkblad van een XLSX-bestand?
  • HSSFRow: Is een klasse een rij in het werkblad van het XLS-bestand?
  • Cel: De klassen XSSFCell en HSSFCell implementeren deze interface.
  • XSSFCell: Is een klasse die een cel in een rij van een XLSX-bestand vertegenwoordigt?
  • HSSFCel: Is een klasse die een cel in een rij XLS-bestanden vertegenwoordigt.

Lezen schrijven Operatie

Voor ons voorbeeld beschouwen we het onderstaande Excel-bestandsformaat

Voorbeeld van een Excel-werkmap die geรซxporteerd is met behulp van Excel.Guru99Demo-sheet gebruikt in beide voorbeelden

Gegevens uit Excel-bestand lezen

Volledig voorbeeld: Hier proberen we gegevens uit Excel te lezen. 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");

    }

}

Let op: We maken geen gebruik van de TestNG kader hier. Voer de klasse uit als Java Applicatie met behulp van de functie lezen excel in Selenium zoals weergegeven in het bovenstaande voorbeeld.

De console print vervolgens elke rij, cel voor cel.

Console-uitvoer die elke Excel-rij weergeeft, waarbij de celwaarden gescheiden worden door verticale strepen (|).

Schrijf gegevens naar een Excel-bestand.

Volledig voorbeeld: Hier proberen we gegevens uit een Excel-bestand te schrijven door een nieuwe rij aan het Excel-bestand toe te voegen.

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);

    }

}

Het werkblad bevat vervolgens de toegevoegde rij.

Excel-bestand nadat de nieuwe rij met de naam van de heer E en Noida is toegevoegd.

Excel-manipulatie met behulp van JXL API

JXL is ook een andere beroemde pot om Excel-bestanden in te lezen Java en het schrijven van bestanden. Tegenwoordig wordt POI in de meeste projecten gebruikt, maar vรณรณr POI was dat alleen JXL Java API voor Excel-manipulatie. Het is een zeer kleine en eenvoudige API voor het inlezen van Excel Selenium.

Het JXL JAR-bestand staat vermeld in de projectbibliotheken.

TIPS: Mijn advies is om JXL niet te gebruiken in nieuwe projecten, omdat de bibliotheek sinds 2010 niet meer actief wordt ontwikkeld (versie 2.6.12 is nog steeds de meest recente release) en omdat er in vergelijking met de POI API een aantal functies ontbreken.

JXL downloaden:

Als je met JXL wilt werken, kun je het downloaden via deze link

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

In dit gezipte bestand vindt u ook een demo-voorbeeld voor JXL, zoals bijvoorbeeld het voorbeeld.tracDe onderstaande inhoud van Ted wordt weergegeven.

ExtracTed JXL-archief met de jar-, documentatie- en demo-mappen.

Enkele kenmerken:

  • JXL kan Excel-bestanden inlezen Selenium voor 95, 97, 2000, XP, 2003 werkmap.
  • We kunnen werken met Engels, Frans, Spaans en Duits.
  • Het kopiรซren van een grafiek en het invoegen van afbeeldingen in Excel is mogelijk

Nadeel:

  • We kunnen alleen schrijven in Excel 97 en later (schrijven in Excel 95 wordt niet ondersteund).
  • JXL ondersteunt het XLSX-formaat van Excel-bestanden niet.
  • Het genereert een spreadsheet in Excel 2000-formaat.

Veelgestelde vragen

Verklaren poi-ooxmlHet gaat niet alleen om POI. Het haalt POI indirect binnen en levert de XSSF-klassen die XLSX nodig heeft. Versie 5.5.1 is de huidige.

De OOXML-component van POI ontbreekt of komt niet overeen. Voeg poi-ooxml toe en zorg ervoor dat alle POI-artefacten in รฉรฉn versie blijven, aangezien gemengde releases schema-klassen buiten het pad laten.

getStringCellValue werkt alleen op tekstcellen. Gebruik DataFormatter om elke cel als een tekenreeks te lezen, of controleer getCellType en roep FormulaEvaluator aan op formules.

Een ontbrekende rij of cel retourneert null, waardoor de lus een NullPointerException genereert. Controleer eerst op null of CellType.BLANK, of stel een MissingCellPolicy in zodat lege cellen worden geretourneerd.

Machine learning-modellen genereren realistische rijen, markeren duplicaten en rangschikken welke combinaties defecten het beste aan het licht brengen, waardoor overbodige gegevens worden verwijderd. datagedreven testen vellen.

GitHub-copiloot Stelt standaardteksten voor lezers en schrijvers op basis van een reactie. RevBekijk het, want het suggereert vaak verouderde celtypeconstanten uit oudere POI-versies.

SXSSFWorkbook streamt rijen naar de schijf in plaats van het werkblad in het geheugen te bewaren, waardoor grote exports geen OutOfMemoryError meer veroorzaken. Verwerk rijen binnen de lus tijdens het lezen.

Bewaar het in src/test/resources en construeer het pad met System.getProperty(โ€œuser.dirโ€). Absolute paden werken niet meer zodra de testsuite elders of op een andere locatie wordt uitgevoerd. Jenkins middel.

Vat dit bericht samen met: