Работа с файлами — важная часть любого программного процесса. Мы часто создаём файлы, открываем их, обновляем что-то или удаляем в наших компьютерах. То же самое относится и к автоматизации в Selenium.
Java предоставляет различные классы для работы с файлами с помощью Selenium. В этом руководстве вы узнаете, как можно читать и записывать данные в Excel файл с помощью пакета Java IO и библиотеки Apache POI.
Apache POI в Selenium
Apache POI в Selenium — это широко используемый API для тестирования на основе данных в Selenium. Это библиотека, написанная на Java, которая предоставляет пользователям API для работы с документами Microsoft, такими как .xls и .xlsx. Пользователи могут легко создавать, просматривать и изменять файлы Excel.
- Как работать с файлами Excel с помощью POI (Maven POM Dependency)
- Классы и интерфейсы в POI
- Операция чтения/записи
- Чтение данных из файла Excel
- Запись данных в Excel файл
- Работа в Excel с помощью JXL API
Друзья, поддержите нас вступлением в наш телеграм канал QaRocks. Там много туториалов, задач по автоматизации и книг по QA.
Как работать с файлами Excel с помощью POI (Maven POM Dependency)
Для чтения и записи файлов Excel в Java компания Apache предоставляет популярную библиотеку POI. Эта библиотека способна читать и записывать как XLS, так и XLSX форматы файла Excel.
Для чтения XLS файлов в библиотеке POI предусмотрена HSSF реализация. А для XLSX подойдёт XSSF реализация библиотеки POI. Рассмотрим эти реализации подробнее.
Если в проекте используется Maven, то его зависимость будет иметь следующий вид:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.1</version> </dependency>
Или вы можете просто загрузить последнюю версию POI jars по ссылке http://poi.apache.org/download.html и скачать последний zip-файл.
После скачивания этого zip-файла, необходимо разархивировать его и добавить все эти JAR-файлы в проект.
Классы и интерфейсы в POI
Ниже приведён список различных интерфейсов и классов в POI для чтения XLS и XLSX файлов.
- Workbook. Классы XSSFWorkbook и HSSFWorkbook реализуют этот интерфейс.
- XSSFWorkbook. Представляет собой класс для XLSX-файлов.
- HSSFWorkbook. Представляет собой класс для XLS-файлов.
- Sheet. Классы XSSFSheet и HSSFSheet реализуют этот интерфейс.
- XSSFSheet. Класс, представляющий лист в XLSX-файле.
- HSSFSheet. Класс, представляющий лист в XLS-файле.
- Row. Классы XSSFRow и HSSFRow реализуют этот интерфейс.
- XSSFRow. Класс, представляющий строку в листе XLSX-файла.
- HSSFRow. Класс, представляющий строку в листе XLS-файла.
- Cell. Классы XSSFCell и HSSFCell реализуют этот интерфейс.
- XSSFCell. Класс, представляющий ячейку в строке XLSX-файла.
- HSSFCell. Класс, представляющий ячейку в строке XLS-файла.
Операция чтения/записи
Для примера рассмотрим XLSX формат файла.
Чтение данных из файла 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, используя функцию Read Excel в Selenium, как показано в примере выше.
Запись данных в 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 с использованием JXL API
JXL — ещё одна библиотека для чтения и записи файлов Excel в Java. В настоящее время POI используется в большинстве проектов, но до появления POI, JXL была единственным Java API для работы с Excel. Это небольшой и простой API для чтения Excel в Selenium.
Совет: лучше не использовать JXL в новых проектах, так как библиотека не находится в активной разработке начиная с 2010 года и уступает по функциональности POI API.
Скачать JXL можно по этой ссылке: https://sourceforge.net/projects/jexcelapi/files/jexcelapi/2.6.12/.
Демонстрационный пример можно найти внутри архива для JXL.
Некоторые особенности:
- JXL способен читать файлы Excel в Selenium для версий 95, 97, 2000, XP, 2003.
- Позволяет работать с английским, французским, испанским, немецким языками.
- Возможно копирование диаграмм и графиков, а также вставка изображений в Excel.
Недостатки:
- Поддерживает только Excel 97 и более поздние версии (Excel 95 не поддерживается).
- JXL не поддерживает формат XLSX-файлов Excel.
- Генерирует электронную таблицу в формате Excel 2000.
Итог:
- Файл Excel может быть прочитан с помощью операций Java IO. Для этого необходимо использовать библиотеку Apache POI.
- Существует два вида файлов в Excel — XLSX и XLS файлы.
- POI имеет различные интерфейсы Workbook, Sheet, Row, Cell.
- Эти интерфейсы реализуют соответствующие классы для работы с XLS-файлами (HSSFWorkbook, HSSFSheet, HSSFRow, HSSFCell) и XLSX-файлами (XSSFWorkbook, XSSFSheet, XSSFRow, XSSFCell).
- JXL — это ещё один инструмент для работы с Excel в Selenium.
- JXL не может работать с форматом XLSX-файлов.
Перевод статьи «How to Read/Write Data from Excel File: Selenium POI».