Как преобразовать файл Excel в cucumber DataTable

#cucumber #bdd #cucumber-java

Вопрос:

Привет, я занимаюсь проектом BDD Cucumber. Вместо того, чтобы предоставлять данные в самом DataTable в файле функций cucumber. Я пытаюсь передать местоположение файла Excel, мой файл функций Cucumber выглядит примерно так

 Feature: Read data from cucumber Feature

Scenario: Any scenario with different set of excel data
Then Read the data from  excel sheet "C:UsersGovindDesktopMOCK_DATA.xlsx" 
 

Теперь то, что я хочу сделать, это в моем определении шагов, я хочу использовать какой-то читатель Excel для чтения данных файла excel и преобразования этих данных в данные, доступные для обработки. Чтобы я мог использовать для этого DataTable.asMaps. Я уже реализовал это, но у меня возникли проблемы с использованием функции .asMaps для этой таблицы данных.

Мой класс ExcelReader-это

 package otherutil;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelReaders {

    private String fileName;
    private String sheetName;
    private int sheetIndex;
    private XSSFWorkbook book;

    private ExcelReaders(ExcelReaderBuilder excelReaderBuilder) {
        this.fileName = excelReaderBuilder.fileName;
        this.sheetIndex = excelReaderBuilder.sheetIndex;
        this.sheetName = excelReaderBuilder.sheetName;
    }

    public static class ExcelReaderBuilder {

        private String fileName;
        private String sheetName;
        private int sheetIndex;

        public ExcelReaderBuilder setFileLocation(String location) {
            this.fileName = location;
            return this;
        }

        public ExcelReaderBuilder setSheet(String sheetName) {
            this.sheetName = sheetName;
            return this;
        }

        public ExcelReaderBuilder setSheet(int index) {
            this.sheetIndex = index;
            return this;
        }

        public ExcelReaders build() {
            return new ExcelReaders(this);
        }

    }

    private XSSFWorkbook getWorkBook(String filePath) throws InvalidFormatException, IOException {
        return new XSSFWorkbook(new File(filePath));
    }

    private XSSFSheet getWorkBookSheet(String fileName, String sheetName) throws InvalidFormatException, IOException {
        this.book = getWorkBook(fileName);
        return this.book.getSheet(sheetName);
    }

    private XSSFSheet getWorkBookSheet(String fileName, int sheetIndex) throws InvalidFormatException, IOException {
        this.book = getWorkBook(fileName);
        return this.book.getSheetAt(sheetIndex);
    }

    public List<List<String>> getSheetData() throws IOException{
        XSSFSheet sheet;
        List<List<String>> outerList = new LinkedList<>();
        
        try {
            sheet = getWorkBookSheet(fileName, sheetName);
            outerList = getSheetData(sheet);
        } catch (InvalidFormatException e) {
            throw new RuntimeException(e.getMessage());
        }finally {
            this.book.close();
        }
        return outerList;
    }
    
    public List<List<String>> getSheetDataAt() throws InvalidFormatException, IOException {
        
        XSSFSheet sheet;
        List<List<String>> outerList = new LinkedList<>();
        
        try {
            sheet = getWorkBookSheet(fileName, sheetIndex);
            outerList = getSheetData(sheet);
        } catch (InvalidFormatException e) {
            throw new RuntimeException(e.getMessage());
        }finally {
            this.book.close();
        }
        return outerList;
    }

    private List<List<String>> getSheetData(XSSFSheet sheet) {
        List<List<String>> outerList = new LinkedList<>();
        prepareOutterList(sheet, outerList);
        return Collections.unmodifiableList(outerList);
    }

    private void prepareOutterList(XSSFSheet sheet, List<List<String>> outerList) {
        for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i  ) {
            List<String> innerList = new LinkedList<>();
            XSSFRow xssfRow = sheet.getRow(i);

            for (int j = xssfRow.getFirstCellNum(); j < xssfRow.getLastCellNum(); j  ) {
                prepareInnerList(innerList, xssfRow, j);
            }
            outerList.add(Collections.unmodifiableList(innerList));
        }
    }

    private void prepareInnerList(List<String> innerList, XSSFRow xssfRow, int j) {
        switch (xssfRow.getCell(j).getCellType()) {

        case BLANK:
            innerList.add("");
            break;

        case STRING:
            innerList.add(xssfRow.getCell(j).getStringCellValue());
            break;

        case NUMERIC:
            innerList.add(xssfRow.getCell(j).getNumericCellValue()   "");
            break;

        case BOOLEAN:
            innerList.add(xssfRow.getCell(j).getBooleanCellValue()   "");
            break;

        default:
            throw new IllegalArgumentException("Cannot read the column : "   j);
        }
    }
}
 

и это мой код класса stepDefn

 ExcelReaders readers = new ExcelReaders.ExcelReaderBuilder().setFileLocation(excelUrl).setSheet(0).build();
        List<List<String>> excelData=readers.getSheetDataAt();
        DataTable data = DataTable.create(excelData);
 

после этого я хочу использовать что-то подобное, чтобы я мог получить данные

 for (Map<String, String> users : data.asMaps(String.class, String.class))) {


            System.out.println(users.get("email"));
            
            
        }
 

И мои данные в файле Excel выглядят так

введите описание изображения здесь

Но я не бейл, чтобы это делать. Я повсюду нахожу помощь, но не могу ее получить. Любая помощь будет оценена по достоинству. Спасибо

Ответ №1:

Вы должны реализовать Transformer<T> интерфейс cucumber и сопоставить List<List<String>> его с DataTable . Это работает на меня. Такие как:

 import io.cucumber.cucumberexpression.Transformer


public class ExcelDataToDataTable extends Transformer<DataTable> {

    @Override
    public DataTable transform(String filePath) {
        ExcelReader reader = new ExcelReader.ExcelReaderBuilder()
                .setFileLocation(filePath)
                .setSheet(0)
                .build();
        
        List<List<String>> excelData = getExcelData(reader);
        
        List<DataTableRow> dataTableRows = getDataTableRows(excelData);
        
        DataTable table = getDataTable(dataTableRows);
        
        return table;
    }