protected double getNumericValue(Cell cell) throws InvalidCellException {
		int cellType = cell.getCellType();
		if (cellType != Cell.CELL_TYPE_STRING && cellType != Cell.CELL_TYPE_NUMERIC) {
			throw new InvalidCellException(cell);
		} else if (cellType == Cell.CELL_TYPE_STRING) {
			try {
				double value = Double.parseDouble(cell.getStringCellValue());
				if (isCellValueValid(value)) {
					return value;
				} else {
					throw new InvalidCellException(cell, value);
				}
			} catch (NumberFormatException ex) {
				throw new InvalidCellException(cell, cell.getStringCellValue());
			}
		} else if (cellType == Cell.CELL_TYPE_NUMERIC) {
			double value = cell.getNumericCellValue();
			if (isCellValueValid(value)) {
				return value;
			} else {
				throw new InvalidCellException(cell, value);
			}
		}

		throw new InvalidCellException(cell);
	}