Class FormulaParser

java.lang.Object
org.apache.poi.ss.formula.FormulaParser

@Internal public final class FormulaParser extends Object
This class parses a formula string into a List of tokens in RPN order. Inspired by "Lets Build a Compiler" by Jack Crenshaw BNF for the formula expression is :

 <expression> ::= <term> [<addop> <term>]*
 <term> ::= <factor>  [ <mulop> <factor> ]*
 <factor> ::= <number> | (<expression>) | <cellRef> | <function>
 <function> ::= <functionName> ([expression [, expression]*])
 

For POI internal use only

  • Field Details

    • DEFAULT_MAX_NESTING_DEPTH

      public static final int DEFAULT_MAX_NESTING_DEPTH
      The default value for getMaxNestingDepth(). Excel itself allows 64 levels of nested functions.
      See Also:
  • Method Details

    • setMaxNestingDepth

      public static void setMaxNestingDepth(int maxNestingDepth)
      The parser is recursive, so deeply nested formulas could otherwise exhaust the thread stack. Formulas with more levels of nested parentheses, function calls and unary signs than this are rejected with a FormulaParseException.
      Parameters:
      maxNestingDepth - the maximum nesting depth (defaults to DEFAULT_MAX_NESTING_DEPTH)
      Throws:
      IllegalArgumentException - if maxNestingDepth is negative
      Since:
      6.0.0
    • getMaxNestingDepth

      public static int getMaxNestingDepth()
      Returns:
      the maximum levels of nested parentheses, function calls and unary signs in a formula
      Since:
      6.0.0
      See Also:
    • parse

      public static Ptg[] parse(String formula, FormulaParsingWorkbook workbook, FormulaType formulaType, int sheetIndex, int rowIndex)
      Parse a formula into an array of tokens Side effect: creates name (Workbook.createName()) if formula contains unrecognized names (names are likely UDFs)
      Parameters:
      formula - the formula to parse
      workbook - the parent workbook
      formulaType - the type of the formula
      sheetIndex - the 0-based index of the sheet this formula belongs to. The sheet index is required to resolve sheet-level names. -1 means that the scope of the name will be ignored and the parser will match names only by name
      rowIndex - - the related cell's row index in 0-based form (-1 if the formula is not cell related) used to handle structured references that have the "#This Row" quantifier. Use rowIndex=-1 or parseStructuredReference(String, FormulaParsingWorkbook, int) if formula does not contain structured references.
      Returns:
      array of parsed tokens
      Throws:
      FormulaParseException - if the formula has incorrect syntax or is otherwise invalid
    • parse

      public static Ptg[] parse(String formula, FormulaParsingWorkbook workbook, FormulaType formulaType, int sheetIndex)
      Parse a formula into an array of tokens Side effect: creates name (Workbook.createName()) if formula contains unrecognized names (names are likely UDFs)
      Parameters:
      formula - the formula to parse
      workbook - the parent workbook
      formulaType - the type of the formula
      sheetIndex - the 0-based index of the sheet this formula belongs to. The sheet index is required to resolve sheet-level names. -1 means that the scope of the name will be ignored and the parser will match names only by name
      Returns:
      array of parsed tokens
      Throws:
      FormulaParseException - if the formula has incorrect syntax or is otherwise invalid
    • parseStructuredReference

      public static Area3DPxg parseStructuredReference(String tableText, FormulaParsingWorkbook workbook, int rowIndex)
      Parse a structured reference. Converts the structured reference to the area that represent it.
      Parameters:
      tableText - - The structured reference text
      workbook - - the parent workbook
      rowIndex - - the 0-based cell's row index ( used to handle "#This Row" quantifiers )
      Returns:
      the area that being represented by the structured reference.