Apache POI Excel готов к чтению столбца от А до N - PullRequest
0 голосов
/ 24 марта 2020

Я написал приведенные ниже коды с использованием Apache классов POI для чтения данных из таблицы Excel. в настоящее время он читает имя строки + имя столбца.

Я хотел бы улучшить его, чтобы позволить мне вводить много имен столбцов в случае, если у меня много столбцов данных.

Мне нужна помощь, чтобы понять, как чтобы улучшить его.

в настоящее время он читает только ("rowName", "columnName")

, тестовые данные могут расти горизонтально на листе Excel из столбца A ..... columnN Я хотел что-то подобное ("rowName", "columnNameA" till "columnNameN...."). Это возможно? или любое другое лучшее предложение ??

public class readexcel {


	//method defined for reading a cell
	@Keyword
	private static  findData(String rowName, String columnName) throws IOException {
		String cellValue = ReadCellData(rowName, columnName);
		System.out.println(cellValue);
	}


	private static String ReadCellData(String rowName, String columnName) throws IOException {
		FileInputStream fis=new FileInputStream(RunConfiguration.getProjectDir() + "/Data Files/testmatrix.xlsx");
		Workbook workbook=new XSSFWorkbook(fis);
		Sheet sheet = workbook.getSheetAt(0);
		Row firstRow = sheet.getRow(0);
		int rowNameColIdx = findColumnIdx("Automation TC", firstRow);
		int colNameColIdx = findColumnIdx(columnName, firstRow);

		Iterator<Row> rowIterator = sheet.iterator();
		rowIterator.next();
		while (rowIterator.hasNext()) {
			Row row = rowIterator.next();
			if (rowName.equals(row.getCell(rowNameColIdx).getStringCellValue())) {
				return row.getCell(colNameColIdx).getStringCellValue();
			}
		}
		return null;
	}

	private static int findColumnIdx(String text, Row row) {
		for (Cell cell : row) {
			if (text.equals(cell.getStringCellValue())) {
				return cell.getColumnIndex();
			}
		}
		return -1;
	}





}

Сценарий чтения данных

def exceldata = CustomKeywords.'test.readexcel.ReadCellData'("rowName", "columnName")

1 Ответ

1 голос
/ 24 марта 2020

Предполагая, что ваша электронная таблица выглядит примерно так:

| Test1 | Test 2 | Test C |
| A     | 1      | aa     |
| B     | 2      | bb     |

И вы хотите иметь возможность сказать дать мне значения для Test2 и Test C в строке 2 , тогда я ' Я предлагаю вам сделать это в два этапа. Во-первых, создайте сопоставление имен столбцов с индексами столбцов. Во-вторых, прочитайте указанные c ячейки из строки.

Поскольку вы пометили , я бы предложил код наподобие:

int headerRowNumber = 0 // 0-based row numbering
Sheet sheet = wb.getSheetAt(0) // what sheet to read from

Map<String,Integer> colNamesToNumbers = [:]
DataFormatter fmt = new DataFormatter()

sheet.getRow(headerRowNumber).each { cell ->
   // Render the column heading to a string, in case it's a number
   String heading = fmt.formatCellValue(cell)
   colNamesToNumbers[heading] = cell.getColumnIndex()
}

Тогда читать, что-то вроде

Closure readValues = { int rowNum, List<String> columnNames ->
   Row row = sheet.getRow(rowNum)
   if (row == null) return []

   return columnNames.collect { String name ->
      int colNum = colNamesToNumbers[name]
      return fmt.formatCellValue( row.getCell(colNum) )
   }
}

List<String> valsRow2 = readValues(2, ["Test1","Test C"])
// returns ["B","bb"]
List<String> valsRow7 = readValues(7, ["Test 2"])
// returns [] as no row 7
...