/** 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();
  }
  /**
   * Return a formula for the cell, for example, <code>SUM(C4:E4)</code>
   *
   * @return a formula for the cell
   * @throws IllegalStateException if the cell type returned by {@link #getCellType()} is not
   *     CELL_TYPE_FORMULA
   */
  public String getCellFormula() {
    int cellType = getCellType();
    if (cellType != CELL_TYPE_FORMULA) throw typeMismatch(CELL_TYPE_FORMULA, cellType, false);

    CTCellFormula f = _cell.getF();
    if (isPartOfArrayFormulaGroup() && f == null) {
      XSSFCell cell = getSheet().getFirstCellInArrayFormula(this);
      return cell.getCellFormula();
    }
    if (f.getT() == STCellFormulaType.SHARED) {
      return convertSharedFormula((int) f.getSi());
    }
    return f.getStringValue();
  }