/** Retreives the text contents of the file */
  public String getText() {
    StringBuffer text = new StringBuffer();

    for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
      XSSFSheet sheet = workbook.getSheetAt(i);
      if (includeSheetNames) {
        text.append(workbook.getSheetName(i)).append("\n");
      }

      // Header(s), if present
      if (includeHeadersFooters) {
        text.append(extractHeaderFooter(sheet.getFirstHeader()));
        text.append(extractHeaderFooter(sheet.getOddHeader()));
        text.append(extractHeaderFooter(sheet.getEvenHeader()));
      }

      // Rows and cells
      for (Object rawR : sheet) {
        Row row = (Row) rawR;
        for (Iterator<Cell> ri = row.cellIterator(); ri.hasNext(); ) {
          Cell cell = ri.next();

          // Is it a formula one?
          if (cell.getCellType() == Cell.CELL_TYPE_FORMULA && formulasNotResults) {
            text.append(cell.getCellFormula());
          } else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
            text.append(cell.getRichStringCellValue().getString());
          } else {
            XSSFCell xc = (XSSFCell) cell;
            text.append(xc.getRawValue());
          }

          // Output the comment, if requested and exists
          Comment comment = cell.getCellComment();
          if (includeCellComments && comment != null) {
            // Replace any newlines with spaces, otherwise it
            //  breaks the output
            String commentText = comment.getString().getString().replace('\n', ' ');
            text.append(" Comment by ")
                .append(comment.getAuthor())
                .append(": ")
                .append(commentText);
          }

          if (ri.hasNext()) text.append("\t");
        }
        text.append("\n");
      }

      // Finally footer(s), if present
      if (includeHeadersFooters) {
        text.append(extractHeaderFooter(sheet.getFirstFooter()));
        text.append(extractHeaderFooter(sheet.getOddFooter()));
        text.append(extractHeaderFooter(sheet.getEvenFooter()));
      }
    }

    return text.toString();
  }
 protected CellValue getCellValueAt(int index) {
   if (index < 0 || index >= numOfCells) {
     throw new IndexOutOfBoundsException(
         "Index must be between 0 and " + (numOfCells - 1) + " (inclusive), given: " + index);
   }
   int firstRow = cellRangeAddress.getFirstRow();
   int firstCol = cellRangeAddress.getFirstColumn();
   int lastCol = cellRangeAddress.getLastColumn();
   int width = lastCol - firstCol + 1;
   int rowIndex = firstRow + index / width;
   int cellIndex = firstCol + index % width;
   Row row = sheet.getRow(rowIndex);
   return (row == null) ? null : evaluator.evaluate(row.getCell(cellIndex));
 }
  protected SRow importRow(Row poiRow, SSheet sheet) {
    SRow row = sheet.getRow(poiRow.getRowNum());
    row.setHeight(UnitUtil.twipToPx(poiRow.getHeight()));
    row.setCustomHeight(poiRow.isCustomHeight());
    row.setHidden(poiRow.getZeroHeight());
    CellStyle rowStyle = poiRow.getRowStyle();
    if (rowStyle != null) {
      row.setCellStyle(importCellStyle(rowStyle));
    }

    for (Cell poiCell : poiRow) {
      importCell(poiCell, poiRow.getRowNum(), sheet);
    }

    return row;
  }