Як читати/записувати дані Excel у Selenium Використання Apache POI

⚡ Розумний підсумок

Диск для файлів Excel Selenium тести на основі даних, а Apache POI – це Java бібліотека, яка їх читає та записує. У розділах нижче розглядаються залежності, основні класи, приклади читання та запису, а також JXL.

  • 🔘 Два формати: Класи HSSF обробляють .xls, класи XSSF обробляють .xlsx.
  • ✅ Основні інтерфейси: Робоча книга, аркуш, рядок і комірка відображають електронну таблицю.
  • 🧪 Читання: FileInputStream плюс getLastRowNum зациклює кожен рядок і комірку.
  • 🛠️ Написання: createRow та setCellValue додають дані, FileOutputStream зберігає їх.
  • 📊 Спадщина: JXL читає старі робочі книги, але не XLSX.

Читання та запис даних Excel в Selenium з Apache POI

Файловий IO є важливою частиною будь-якого програмного процесу. Ми часто створюємо файл, відкриваємо його та щось оновлюємо або видаляємо на своїх комп’ютерах. Те ж саме у випадку з Selenium автоматизація. Нам потрібен процес для роботи з файлами Selenium.

Java надає нам різні класи для роботи з файлами Selenium. У цьому підручнику ми навчимося читати та писати далі перевершувати файл за допомогою Java Пакет IO і Apache Бібліотека POI.

Apache POI в Selenium

Команда Apache POI в Selenium є широко використовуваним API для Selenium тестування на основі данихЦе бібліотека POI, написана мовою Java який надає користувачам API для маніпулювання Microsoft документи, такі як .xls та .xlsx. Користувачі можуть легко створювати, змінювати та читати/записувати у файли Excel. POI розшифровується як «Погана реалізація обфускації» (Poor Obfuscation Implementation).

Як обробити файл Excel за допомогою POI (залежність Maven POM)

Посилання на POI Selenium тест до робочого зошита нижче.

Apache POI, що діє як міст між Selenium тест і робоча книга Excel

Для читання та запису файлу Excel JavaApache надає дуже відому бібліотеку POI. Ця бібліотека достатньо здатна читати та записувати файли Excel у форматі XLS та XLSX.

Для читання XLS-файлів бібліотека POI забезпечує реалізацію HSSF.

Для читання XLSX, реалізація бібліотеки POI у форматі XSSF буде вибором. Давайте детально розглянемо ці реалізації.

Якщо ви використовуєте Maven у своєму проєкті, залежність Maven буде додано до pom.xml, як показано нижче.

Запис залежності POI додано до файлу pom.xml проекту Maven

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

Примітка до версії: 4.1.1 – це оригінальний приклад; поточні проекти оголошують poi-ooxml 5.5.1, який потрібен для XLSX.

Або ви можете просто завантажити останню версію POI jar з http://poi.apache.org/download.html & завантажити найновіший файл zip

Сторінка завантаження Apache POI зі списком архівів дистрибутивів бінарних файлів та вихідних кодів

Коли ви завантажуєте zip-файл для цього jar, вам потрібно розархівувати його та додати всі jar-файли до шляху класу вашого проекту.

Розпаковані jar-файли POI, додані до Java шлях збірки проекту

Класи та інтерфейси в POI

Нижче наведено список різних Java Інтерфейси та класи в POI для читання файлів XLS та XLSX, показані нижче -

Ієрархія класів POI від Робочої книги до Аркуша, Рядка та Комірки

  • Книга: Класи XSSFWorkbook та HSSFWorkbook реалізують цей інтерфейс.
  • XSSFРобочий зошит: Є класовим представленням XLSX-файлу.
  • Робочий зошит HSSF: Є класовим представленням XLS-файлу.
  • Лист: Класи XSSFSheet та HSSFSheet реалізують цей інтерфейс.
  • XSSFАркуш: Клас, що представляє аркуш у файлі XLSX.
  • Аркуш HSSF: Це клас, що представляє аркуш у XLS-файлі.
  • Рядок: Класи XSSFRow та HSSFRow реалізують цей інтерфейс.
  • XSSFrow: Це клас, що представляє рядок у аркуші XLSX-файлу.
  • HSSFRow: Це клас, що представляє рядок у аркуші XLS-файлу.
  • стільниковий: Класи XSSFCell та HSSFCell реалізують цей інтерфейс.
  • XSSFCell: Це клас, що представляє комірку в рядку XLSX-файлу.
  • HSSFCell: Це клас, що представляє комірку в рядку файлу XLS.

Читати писати Operaції

Для нашого прикладу ми розглянемо наведений нижче формат файлу Excel

Зразок книги ExportExcel з ExcelGuruДемонстраційний аркуш 99, що використовується в обох прикладах

Читання даних із файлу Excel

Повний приклад: Тут ми намагаємося прочитати дані з 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");

    }

}

Примітка: Ми не використовуємо TestNG рамка тут. Запустіть клас як Java Програма, яка використовує функцію читання в Excel Selenium як показано в прикладі вище.

Потім консоль друкує кожен рядок, клітинка за клітинкою.

Вивід консолі, що показує кожен рядок Excel, надрукований зі значеннями комірок, розділеними вертикальними рисками

Запис даних у файл Excel

Повний приклад: Тут ми намагаємося записати дані з файлу Excel, додавши новий рядок у файл Excel.

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

    }

}

Потім робоча книга містить доданий рядок.

Таблиця Excel після додавання нового рядка з паном Е та Нойдою

Маніпуляції з Excel за допомогою JXL API

JXL також є ще одним відомим jar для читання файлу Excel Java і запис файлів. Зараз POI використовується в більшості проектів, але до POI використовувався лише JXL Java API для роботи з Excel. Це дуже маленький і простий API для читання в Excel Selenium.

JXL jar-файл, зазначений серед бібліотек проекту

ПОРАДИ: Моя пропозиція — не використовувати JXL у жодному новому проекті, оскільки бібліотека не перебуває в активній розробці з 2010 року — 2.6.12 все ще є її останньою версією — і в ній бракує цієї функції порівняно з POI API.

Завантажити JXL:

Якщо ви хочете працювати з JXL, ви можете завантажити його за цим посиланням

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

Ви також можете отримати демонстраційний приклад у цьому zip-файлі для JXL, як у випадку з extracнаведено нижче.

ExtracАрхів ted JXL з файлом jar, документацією та демо-папками

Деякі функції:

  • JXL може читати файл Excel Selenium для 95, 97, 2000, XP, 2003 робочий зошит.
  • Ми можемо працювати з англійською, французькою, іспанською, німецькою мовами.
  • Можливе копіювання діаграми та вставка зображення в Excel

Недолік:

  • Ми можемо писати лише Excel 97 і новіші версії (запис у Excel 95 не підтримується).
  • JXL не підтримує формат файлу Excel XLSX.
  • Він створює електронну таблицю у форматі Excel 2000.

Поширені запитання

Декларуйте poi-ooxml, а не лише poi. Він транзитивно завантажує poi та надає класи XSSF, необхідні XLSX. Поточна версія – 5.5.1.

Сторона OOXML для POI відсутня або не відповідає дійсності. Додайте poi-ooxml та збережіть кожен артефакт POI в одній версії, оскільки змішані релізи не включають класи схем.

getStringCellValue працює лише з текстовими комірками. Використовуйте DataFormatter, щоб зчитати будь-яку комірку як рядок, або перевірте getCellType та викличте FormulaEvaluator для формул.

Відсутній рядок або комірка повертає значення null, тому цикл викидає виняток NullPointerException. Спочатку перевірте наявність значення null або CellType.BLANK, або встановіть MissingCellPolicy, щоб пробіли повертали порожні комірки.

Моделі машинного навчання генерують реалістичні рядки, позначають дублікати та ранжують комбінації, які найкраще виявляють дефекти, усуваючи роздуті елементи. тестування на основі даних аркуші.

Копілот GitHub створює шаблонний варіант для читача та записувача з коментаря. Revпереглянути його, оскільки він часто пропонує застарілі константи типу комірок зі старіших версій POI.

SXSSFWorkbook передає рядки на диск замість того, щоб зберігати книгу в пам'яті, тому великі експорти не викликають OutOfMemoryError. Під час читання обробляти рядки всередині циклу.

Зберігайте його в src/test/resources та створюйте шлях з System.getProperty(“user.dir”). Абсолютні шляхи розриваються, коли пакет запускається деінде або на Jenkins агент.

Підсумуйте цей пост за допомогою: