/** * Copyright 2015 Nabarun Mondal * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.noga.njexl.testing.dataprovider.excel; import org.apache.poi.ss.usermodel.CellValue; import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.util.ArrayList; /** * Implementation of {ExcelReader} for .xlsx files */ public class XlsXReader implements ExcelReader { XSSFWorkbook workbook; String[] sheetNames; final FormulaEvaluator evaluator ; /** * Conversion of arbitrary value types to string * Also reads formula cells * @param cell the cell to read from * @return the value as string */ public String readCellValueAsString(XSSFCell cell) { CellValue cellValue = evaluator.evaluate(cell); switch (cellValue.getCellType()) { case XSSFCell.CELL_TYPE_BLANK: return ""; case XSSFCell.CELL_TYPE_BOOLEAN: return Boolean.toString(cell.getBooleanCellValue()); case XSSFCell.CELL_TYPE_STRING: return cell.getStringCellValue(); case XSSFCell.CELL_TYPE_NUMERIC: Double d = new Double(cell.getNumericCellValue()); long l = d.longValue(); Double compD = (double) l; if (compD.equals(d)) { return Long.toString(l); } else { return Double.toString(d); } } return null; } private void init(){ ArrayList<String> names = new ArrayList<>(); int numSheets = workbook.getNumberOfSheets(); for ( int i = 0 ; i < numSheets; i++ ){ names.add( workbook.getSheetName(i) ); } sheetNames = new String[names.size()]; sheetNames = names.toArray( sheetNames ); } /** * Creates an instance of the ExcelReaderXLSX * * @param fileName the excel xsl file to read from */ public XlsXReader(String fileName) { try { workbook = new XSSFWorkbook(new FileInputStream(fileName)); evaluator = workbook.getCreationHelper().createFormulaEvaluator(); init(); } catch (Exception e) { throw new Error(e); } } @Override public String[] sheets() { return sheetNames ; } @Override public String value(String sheet, int row, int column) { XSSFCell cell = workbook.getSheet(sheet).getRow(row).getCell(column); return readCellValueAsString(cell); } @Override public int rowCount(String sheet) { return workbook.getSheet(sheet).getLastRowNum() + 1 ; } @Override public int columnCount(String sheet) { return workbook.getSheet(sheet).getRow(0).getLastCellNum() ; } }