]> source.dussan.org Git - poi.git/commitdiff
Facility to use Macro functions in formulas.
authorAvik Sengupta <avik@apache.org>
Sat, 23 Aug 2003 19:40:05 +0000 (19:40 +0000)
committerAvik Sengupta <avik@apache.org>
Sat, 23 Aug 2003 19:40:05 +0000 (19:40 +0000)
Major functionality upgrade, thanks to Paul Krause
Some of the Named Range and Area3d functionality can now be enhanced using the features of this patch.

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/branches/REL_2_BRANCH@353315 13f79535-47bb-0310-9956-ffa450edef68

42 files changed:
src/java/org/apache/poi/hssf/dev/FormulaViewer.java
src/java/org/apache/poi/hssf/model/FormulaParser.java
src/java/org/apache/poi/hssf/record/NameRecord.java
src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
src/java/org/apache/poi/hssf/record/formula/AddPtg.java
src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
src/java/org/apache/poi/hssf/record/formula/AreaPtg.java
src/java/org/apache/poi/hssf/record/formula/AttrPtg.java
src/java/org/apache/poi/hssf/record/formula/BoolPtg.java
src/java/org/apache/poi/hssf/record/formula/ConcatPtg.java
src/java/org/apache/poi/hssf/record/formula/DividePtg.java
src/java/org/apache/poi/hssf/record/formula/EqualPtg.java
src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
src/java/org/apache/poi/hssf/record/formula/GreaterEqualPtg.java
src/java/org/apache/poi/hssf/record/formula/GreaterThanPtg.java
src/java/org/apache/poi/hssf/record/formula/IntPtg.java
src/java/org/apache/poi/hssf/record/formula/LessEqualPtg.java
src/java/org/apache/poi/hssf/record/formula/LessThanPtg.java
src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java
src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java
src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java
src/java/org/apache/poi/hssf/record/formula/MultiplyPtg.java
src/java/org/apache/poi/hssf/record/formula/NamePtg.java
src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java
src/java/org/apache/poi/hssf/record/formula/NumberPtg.java
src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java
src/java/org/apache/poi/hssf/record/formula/PowerPtg.java
src/java/org/apache/poi/hssf/record/formula/Ptg.java
src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java
src/java/org/apache/poi/hssf/record/formula/StringPtg.java
src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java
src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java
src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java
src/java/org/apache/poi/hssf/record/formula/UnionPtg.java
src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java
src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
src/java/org/apache/poi/hssf/usermodel/HSSFName.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java

index 1e7fd95965f36cabb3c56725d8af0e46405f5dbd..3443fda1a6c0cddb39eeddc1ba44c453c1efc20b 100644 (file)
@@ -77,7 +77,6 @@ import org.apache.poi.hssf.record.*;
 import org.apache.poi.hssf.record.formula.*;
 import org.apache.poi.hssf.model.*;
 import org.apache.poi.hssf.usermodel.*;
-import org.apache.poi.hssf.util.SheetReferences;
 
 /**
  * FormulaViewer - finds formulas in a BIFF8 file and attempts to read them/display
@@ -144,7 +143,7 @@ public class FormulaViewer
             StringBuffer buf = new StringBuffer();
             
             if (token instanceof ExpPtg) return;
-            buf.append(name=((OperationPtg) token).toFormulaString((SheetReferences)null));
+            buf.append(name=((OperationPtg) token).toFormulaString((Workbook)null));
             buf.append(sep);
             switch (token.getPtgClass()) {
                 case Ptg.CLASS_REF :
@@ -213,7 +212,7 @@ public class FormulaViewer
         StringBuffer buf = new StringBuffer();
            for (int i=0;i<numptgs;i++) {
            token = (Ptg) tokens.get(i);
-            buf.append( token.toFormulaString((SheetReferences)null));
+            buf.append( token.toFormulaString((Workbook)null));
             switch (token.getPtgClass()) {
                 case Ptg.CLASS_REF :
                     buf.append("(R)");
@@ -233,7 +232,7 @@ public class FormulaViewer
     
     private String composeFormula(FormulaRecord record)
     {
-       return  org.apache.poi.hssf.model.FormulaParser.toFormulaString((SheetReferences)null,record.getParsedExpression());
+       return  org.apache.poi.hssf.model.FormulaParser.toFormulaString((Workbook)null,record.getParsedExpression());
     }
 
     /**
index b41f084873244aa8c20099bf138a88cd6c198c6f..60515707d63fa21eecb14721719cedc731f93448 100644 (file)
@@ -64,7 +64,6 @@ import java.util.List;
 //import PTG's .. since we need everything, import *
 import org.apache.poi.hssf.record.formula.*;
 
-import org.apache.poi.hssf.util.SheetReferences;
 
 
 /**
@@ -335,10 +334,14 @@ public class FormulaParser {
         int numArgs = Arguments();
         Match(')');
                 
-        Ptg functionPtg = getFunction(name,(byte)numArgs);
+        AbstractFunctionPtg functionPtg = getFunction(name,(byte)numArgs);
         
                tokens.add(functionPtg);
  
+        if (functionPtg.getName().equals("externalflag")) {
+            tokens.add(new NamePtg(name, this.book));
+        }
+
                //remove what we just put in
                this.functionTokens.remove(0);
     }
@@ -382,8 +385,8 @@ public class FormulaParser {
      * @param numArgs
      * @return Ptg a null is returned if we're in an IF formula, it needs extreme manipulation and is handled in this function
      */
-    private Ptg getFunction(String name,byte numArgs) {
-        Ptg retval = null;
+    private AbstractFunctionPtg getFunction(String name, byte numArgs) {
+        AbstractFunctionPtg retval = null;
         
         if (name.equals("IF")) {
             retval = new FuncVarPtg(AbstractFunctionPtg.ATTR_NAME, numArgs);
@@ -795,69 +798,85 @@ end;
     /**
      * Convience method which takes in a list then passes it to the other toFormulaString
      * signature. 
-     * @param lptgs - list of ptgs, can be null
+     * @param book   workbook for 3D and named references
+     * @param lptgs  list of Ptg, can be null or empty
+     * @return a human readable String
      */
-    public static String toFormulaString(SheetReferences refs, List lptgs) {
+    public static String toFormulaString(Workbook book, List lptgs) {
         String retval = null;
         if (lptgs == null || lptgs.size() == 0) return "#NAME";
         Ptg[] ptgs = new Ptg[lptgs.size()];
         ptgs = (Ptg[])lptgs.toArray(ptgs);
-        retval = toFormulaString(refs, ptgs);
+        retval = toFormulaString(book, ptgs);
         return retval;
     }
     
-    /** Static method to convert an array of Ptgs in RPN order 
-     *  to a human readable string format in infix mode
-     *  @param ptgs - array of ptgs, can be null or empty
+    /**
+     * Static method to convert an array of Ptgs in RPN order
+     * to a human readable string format in infix mode.
+     * @param book  workbook for named and 3D references
+     * @param ptgs  array of Ptg, can be null or empty
+     * @return a human readable String
      */
-    public static String toFormulaString(SheetReferences refs, Ptg[] ptgs) {
+    public static String toFormulaString(Workbook book, Ptg[] ptgs) {
         if (ptgs == null || ptgs.length == 0) return "#NAME";
         java.util.Stack stack = new java.util.Stack();
-        int numPtgs = ptgs.length;
-        OperationPtg o;
-        int numOperands;
-        String result=null;
-        String[] operands;
         AttrPtg ifptg = null;
-        for (int i=0;i<numPtgs;i++) {
+
            // Excel allows to have AttrPtg at position 0 (such as Blanks) which
            // do not have any operands. Skip them.
-            if (ptgs[i] instanceof OperationPtg && i>0) {
-                  o = (OperationPtg) ptgs[i];
+        stack.push(ptgs[0].toFormulaString(book));
                   
-                  if (o instanceof AttrPtg && ((AttrPtg)o).isOptimizedIf()) {
-                        ifptg=(AttrPtg)o;
-                  } else {
+        for (int i = 1; i < ptgs.length; i++) {
+            if (! (ptgs[i] instanceof OperationPtg)) {
+                stack.push(ptgs[i].toFormulaString(book));
+                continue;
+            }
                       
-                      numOperands = o.getNumberOfOperands();
-                      operands = new String[numOperands];
+            if (ptgs[i] instanceof AttrPtg && ((AttrPtg) ptgs[i]).isOptimizedIf()) {
+                ifptg = (AttrPtg) ptgs[i];
+                continue;
+            }
                       
-                      for (int j=0;j<numOperands;j++) {
-                          operands[numOperands-j-1] = (String) stack.pop(); //TODO: catch stack underflow and throw parse exception. 
+            final OperationPtg o = (OperationPtg) ptgs[i];
+            final String[] operands = new String[o.getNumberOfOperands()];
+
+            for (int j = operands.length; j > 0; j--) {
+                //TODO: catch stack underflow and throw parse exception.
+                operands[j - 1] = (String) stack.pop();
                       }  
 
-                      if ( (o instanceof AbstractFunctionPtg) && 
-                            ((AbstractFunctionPtg)o).getName().equals("specialflag") &&
-                            ifptg != null
-                            ) {
+            stack.push(o.toFormulaString(operands));
+            if (!(o instanceof AbstractFunctionPtg)) continue;
+
+            final AbstractFunctionPtg f = (AbstractFunctionPtg) o;
+            final String fname = f.getName();
+            if (fname == null) continue;
+
+            if ((ifptg != null) && (fname.equals("specialflag"))) {
                              // this special case will be way different.
-                             result = ifptg.toFormulaString(
-                                  new String[] {(o.toFormulaString(operands))}
-                                                           );
-                             ifptg = null;
-                      } else {                      
-                        result = o.toFormulaString(operands);                                              
+                stack.push(ifptg.toFormulaString(new String[]{(String) stack.pop()}));
+                continue;
                       }
-                      stack.push(result);                                        
+            if (fname.equals("externalflag")) {
+                final String top = (String) stack.pop();
+                final int paren = top.indexOf('(');
+                final int comma = top.indexOf(',');
+                if (comma == -1) {
+                    final int rparen = top.indexOf(')');
+                    stack.push(top.substring(paren + 1, rparen) + "()");
                   }
-                      
-                  
-            } else {
-                stack.push(ptgs[i].toFormulaString(refs));
+                else {
+                    stack.push(top.substring(paren + 1, comma) + '(' +
+                               top.substring(comma + 1));
             }
         }
-        return (String) stack.pop(); //TODO: catch stack underflow and throw parse exception. 
     }
+        // TODO: catch stack underflow and throw parse exception.
+        return (String) stack.pop();
+    }
+
+
     /** Create a tree representation of the RPN token array
      *used to run the class(RVA) change algo
      */
@@ -890,11 +909,9 @@ end;
      *   Useful for testing
      */
     public String toString() {
-        SheetReferences refs = null;
-        if (book!=null)  book.getSheetReferences();
         StringBuffer buf = new StringBuffer();
            for (int i=0;i<tokens.size();i++) {
-            buf.append( ( (Ptg)tokens.get(i)).toFormulaString(refs));
+            buf.append( ( (Ptg)tokens.get(i)).toFormulaString(book));
             buf.append(' ');
         } 
         return buf.toString();
index 01fe777dfc717abb4ee563301083ff643ae6384a..b91c829b875d735e665172fe7f92babb0066dfb9 100644 (file)
@@ -58,11 +58,11 @@ package org.apache.poi.hssf.record;
 import java.util.List;
 import java.util.Stack;
 
+import org.apache.poi.hssf.model.Workbook;
 import org.apache.poi.hssf.record.formula.Area3DPtg;
 import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.Ref3DPtg;
 import org.apache.poi.hssf.util.RangeAddress;
-import org.apache.poi.hssf.util.SheetReferences;
 import org.apache.poi.util.HexDump;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.StringUtil;
@@ -127,6 +127,14 @@ public class NameRecord extends Record {
         */
        public final static byte  BUILTIN_SHEET_TITLE           = (byte)12;
     
+    public static final short OPT_HIDDEN_NAME =   (short) 0x0001;
+    public static final short OPT_FUNCTION_NAME = (short) 0x0002;
+    public static final short OPT_COMMAND_NAME =  (short) 0x0004;
+    public static final short OPT_MACRO =         (short) 0x0008;
+    public static final short OPT_COMPLEX =       (short) 0x0010;
+    public static final short OPT_BUILTIN =       (short) 0x0020;
+    public static final short OPT_BINDATA =       (short) 0x1000;
+
     
     private short             field_1_option_flag;
     private byte              field_2_keyboard_shortcut;
@@ -192,7 +200,7 @@ public class NameRecord extends Record {
        {
            this();         
            this.field_12_builtIn_name = builtin;
-           this.setOptionFlag((short)(this.getOptionFlag() | (short)0x20));
+           this.setOptionFlag((short)(this.getOptionFlag() | OPT_BUILTIN));
            this.setNameTextLength((byte)1);
            this.setEqualsToIndexToSheet(index); //the extern sheets are set through references
            
@@ -252,13 +260,22 @@ public class NameRecord extends Record {
 
        /**
         * Convenience method to retrieve the index the name refers to.
-        * @see getEqualsToIndexToSheet()
+        * @see #getEqualsToIndexToSheet()
         * @return short
         */
        public short getIndexToSheet() {
                return getEqualsToIndexToSheet();
        }
 
+    /**
+     * @return function group
+     * @see FnGroupCountRecord
+     */
+    public byte getFnGroup() {
+        int masked = field_1_option_flag & 0x0fc0;
+        return (byte) (masked >> 4);
+    }
+
     public void setEqualsToIndexToSheet(short value)
     {
         field_6_equals_to_index_to_sheet = value;
@@ -409,11 +426,47 @@ public class NameRecord extends Record {
         return field_11_compressed_unicode_flag;
     }
 
+    /**
+     * @return true if name is hidden
+     */
+    public boolean isHiddenName() {
+        return (field_1_option_flag & OPT_HIDDEN_NAME) != 0;
+    }
+
+    /**
+     * @return true if name is a function
+     */
+    public boolean isFunctionName() {
+        return (field_1_option_flag & OPT_FUNCTION_NAME) != 0;
+    }
+
+    /**
+     * @return true if name is a command
+     */
+    public boolean isCommandName() {
+        return (field_1_option_flag & OPT_COMMAND_NAME) != 0;
+    }
+
+    /**
+     * @return true if function macro or command macro
+     */
+    public boolean isMacro() {
+        return (field_1_option_flag & OPT_MACRO) != 0;
+    }
+
+    /**
+     * @return true if array formula or user defined
+     */
+    public boolean isComplexFunction() {
+        return (field_1_option_flag & OPT_COMPLEX) != 0;
+    }
+
+
        /**Convenience Function to determine if the name is a built-in name
         */
        public boolean isBuiltInName()
        {
-           return ((this.getOptionFlag() & (short)0x20) != 0);
+           return ((this.getOptionFlag() & OPT_BUILTIN) != 0);
        }
 
 
@@ -511,7 +564,7 @@ public class NameRecord extends Record {
         data[18 + offset] = getCompressedUnicodeFlag();
 
         /* temp: gjs
-        if ( ( field_1_option_flag & (short) 0x20 ) != 0 )
+        if (isBuiltInName())
         {
             LittleEndian.putShort( data, 2 + offset, (short) ( 16 + field_13_raw_name_definition.length ) );
 
@@ -647,16 +700,16 @@ public class NameRecord extends Record {
     /** gets the reference , the area only (range)
      * @return area reference
      */
-    public String getAreaReference(SheetReferences refs){
+    public String getAreaReference(Workbook book){
         if (field_13_name_definition == null) return "#REF!";
         Ptg ptg = (Ptg) field_13_name_definition.peek();
         String result = "";
 
         if (ptg.getClass() == Area3DPtg.class){
-            result = ptg.toFormulaString(refs);
+            result = ptg.toFormulaString(book);
 
         } else if (ptg.getClass() == Ref3DPtg.class){
-            result = ptg.toFormulaString(refs);
+            result = ptg.toFormulaString(book);
         }
 
         return result;
@@ -727,7 +780,7 @@ public class NameRecord extends Record {
 
         /*
         temp: gjs
-        if ( ( field_1_option_flag & (short)0x20 ) != 0 ) {
+        if (isBuiltInName()) {
             // DEBUG
             // System.out.println( "Built-in name" );
 
index da08a6dc3d93d0bba57a6967539b9a09064d367c..cd2660219eeb0838a5f0b9ed835b8ed6e658f8ab 100644 (file)
@@ -54,9 +54,8 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.BinaryTree;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
-import java.util.Stack;
 
 /**
  * This class provides the base functionality for Excel sheet functions 
@@ -69,7 +68,7 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
        //constant used allow a ptgAttr to be mapped properly for its functionPtg
        public static final String ATTR_NAME = "specialflag";
            
-      
+    public static final short INDEX_EXTERNAL = 255;
     
     private static BinaryTree map = produceHash(); 
     protected static Object[][] functionData = produceFunctionData();
@@ -104,7 +103,7 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
         return lookupName(field_2_fnc_index);
     }
     
-    public String toFormulaString(SheetReferences refs) {
+    public String toFormulaString(Workbook book) {
         return getName();
     }
     
@@ -140,7 +139,9 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
     }
     
     protected short lookupIndex(String name) {
-        return (short)((Integer)map.getKeyForValue(name)).intValue();
+        Integer index = (Integer) map.getKeyForValue(name);
+        if (index != null) return index.shortValue();
+        return INDEX_EXTERNAL;
     }
     
     /**
@@ -389,6 +390,7 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
         dmap.put(new Integer(252),"FREQUENCY");
         dmap.put(new Integer(253),"ADDTOOLBAR");
         dmap.put(new Integer(254),"DELETETOOLBAR");
+        dmap.put(new Integer(255),"externalflag");
         dmap.put(new Integer(256),"RESETTOOLBAR");
         dmap.put(new Integer(257),"EVALUATE");
         dmap.put(new Integer(258),"GETTOOLBAR");
index ead8840677f4ea840002c0673a08c7d062843012..3a519dceb48a0867a145b533c98d015f591a7cf2 100644 (file)
@@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Addition operator PTG the "+" binomial operator.  If you need more 
@@ -113,7 +113,7 @@ public class AddPtg
     }
     
     /** Implementation of method from Ptg */
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "+";
     }
index 311ba893992bab55b035d8e75922c99a569d248d..59c405c1e6a1a6e6d1a61eae9fe7cdcbbc71a762 100644 (file)
@@ -291,8 +291,9 @@ public class Area3DPtg extends Ptg
 
        }
 
-       public String toFormulaString( SheetReferences refs )
+       public String toFormulaString(Workbook book)
        {
+               SheetReferences refs = book == null ? null : book.getSheetReferences();
                StringBuffer retval = new StringBuffer();
                if ( refs != null )
                {
@@ -352,4 +353,3 @@ public class Area3DPtg extends Ptg
 
 
 }
-
index 4f994151d60691bb4f98f47212d83943a290b1f2..3189a2c85665b97eceee6586ae830b5fb3561042 100644 (file)
@@ -65,7 +65,7 @@ import org.apache.poi.util.BitField;
 
 import org.apache.poi.hssf.util.AreaReference;
 import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Specifies a rectangular area of cells A1:A4 for instance.
@@ -305,7 +305,7 @@ public class AreaPtg
         field_4_last_column = column;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
          return (new CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative())).toString() + ":" +
                 (new CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative())).toString();
index d389094d7e108bceba2d51944c09fdecf0344895..ebbfcba877db54448e1ef813572161e28d4495c8 100644 (file)
@@ -60,7 +60,7 @@
  */
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.BitField;
@@ -207,11 +207,11 @@ public class AttrPtg
         if(space.isSet(field_1_options)) {
             return operands[ 0 ];
         } else if (optiIf.isSet(field_1_options)) {
-            return toFormulaString((SheetReferences)null) + "(" + operands[ 0 ]             +")"; 
+            return toFormulaString((Workbook)null) + "(" + operands[ 0 ]             +")";
         } else if (optGoto.isSet(field_1_options)) {
-            return toFormulaString((SheetReferences)null) + operands[0];   //goto isn't a real formula element should not show up
+            return toFormulaString((Workbook)null) + operands[0];   //goto isn't a real formula element should not show up
         } else {
-            return toFormulaString((SheetReferences)null) + "(" + operands[ 0 ] + ")";
+            return toFormulaString((Workbook)null) + "(" + operands[ 0 ] + ")";
         }
     }
   
@@ -226,7 +226,7 @@ public class AttrPtg
         return -1;
     }
         
-   public String toFormulaString(SheetReferences refs) {
+   public String toFormulaString(Workbook book) {
       if(semiVolatile.isSet(field_1_options)) {
         return "ATTR(semiVolatile)";
       }
index 954eb0f80c42cef1a1774933f31980ad5e6703f2..84ad7cfca56cd06bca87062ba38816f20357328a 100644 (file)
@@ -60,7 +60,7 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Boolean (boolean)
@@ -114,7 +114,7 @@ public class BoolPtg
         return SIZE;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return field_1_value ? "TRUE" : "FALSE";
     }
index bed92e461a69c754c25761db3c7caad57e790add..e7249bfbc15d4a8c1cf89733a8ad8dc8e0db3315 100644 (file)
@@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -108,7 +108,7 @@ public class ConcatPtg
         return 2;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return CONCAT;
     }    
index 124f25edefc7aa38c243864533aedeaef97cf4bb..6bb0d9420addde8b198a1d27597c4c2a83fc168e 100644 (file)
@@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * This PTG implements the standard binomial divide "/"
@@ -108,7 +108,7 @@ public class DividePtg
         return 2;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "/";
     }
@@ -117,7 +117,7 @@ public class DividePtg
         StringBuffer buffer = new StringBuffer();
 
         buffer.append(operands[ 0 ]);
-        buffer.append(toFormulaString((SheetReferences)null));
+        buffer.append(toFormulaString((Workbook)null));
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }      
index 1ddff9ac643c1b90b0a6faebe35efb2bb19e208d..12438a339788d838afe34ccd3d6edfe5a88f19df 100644 (file)
@@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -107,7 +107,7 @@ public class EqualPtg
         return 2;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "=";
     }
@@ -117,7 +117,7 @@ public class EqualPtg
 
         
         buffer.append(operands[ 0 ]);
-        buffer.append(toFormulaString((SheetReferences)null));
+        buffer.append(toFormulaString((Workbook)null));
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }       
index b100a1a762a6e2a1cfd34c882af5f4384d3efa9a..d70e57968f4cc2b19c3613eeadc84256186396f4 100644 (file)
@@ -60,7 +60,7 @@
  */
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -102,7 +102,7 @@ public class ExpPtg
         return SIZE;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "NO IDEA SHARED FORMULA EXP PTG";
     }
index e81c1b7c81ab1cb4c154492c6ac2822bb6d170f5..b387a5e842626a63fae3a886527875268c96bf1d 100755 (executable)
@@ -54,7 +54,7 @@
 package org.apache.poi.hssf.record.formula;
 
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * PTG class to implement greater or equal to
@@ -98,7 +98,7 @@ public class GreaterEqualPtg
         return 2;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return ">=";
     }
@@ -108,7 +108,7 @@ public class GreaterEqualPtg
 
         
         buffer.append(operands[ 0 ]);
-        buffer.append(toFormulaString((SheetReferences)null));
+        buffer.append(toFormulaString((Workbook)null));
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }       
index 5f7d6450e09c32a0d6fcec493a71400f5ba58cbd..04fbcac2ef9517eafe80d411e51a53c70c8d46a5 100644 (file)
@@ -61,7 +61,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Greater than operator PTG ">"
@@ -133,7 +133,7 @@ public class GreaterThanPtg
      * Implementation of method from Ptg 
      * @param refs the Sheet References
      */
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return this.GREATERTHAN;
     }
@@ -171,5 +171,3 @@ public class GreaterThanPtg
         return new GreaterThanPtg();
     }
 }
-
-
index 200f5dc651aa284ef03a9986242f6b212a9983bf..e06f1ecd257c128b52c4076d851e0b63c8e71b74 100644 (file)
@@ -61,7 +61,7 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Integer (short intger)
@@ -116,7 +116,7 @@ public class IntPtg
         return SIZE;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "" + getValue();
     }
index 271170be4591efc3a651ea32e62bcedc60251ba0..c1c7570029a2b9f6df171854bf9d53ea981d66e2 100755 (executable)
@@ -53,7 +53,7 @@
  */
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 
 /**
@@ -99,7 +99,7 @@ public class LessEqualPtg
                  return 2;
         }
 
-        public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
         {
                  return "<=";
         }
@@ -109,7 +109,7 @@ public class LessEqualPtg
 
         
                  buffer.append(operands[ 0 ]);
-                 buffer.append(toFormulaString((SheetReferences)null));
+                 buffer.append(toFormulaString((Workbook)null));
                  buffer.append(operands[ 1 ]);
                  return buffer.toString();
         }       
index cab99be9c3a371e9a782b3d207225ec212294b3b..a856b93bde5ac65a88d0867fa59ce4d40d6ebc3c 100644 (file)
@@ -63,7 +63,7 @@ package org.apache.poi.hssf.record.formula;
 import java.util.List;
 
 //POI
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Less than operator PTG "<". The SID is taken from the 
@@ -142,7 +142,7 @@ public class LessThanPtg
      * Implementation of method from Ptg 
      * @param refs the Sheet References
      */
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return this.LESSTHAN;
     }
@@ -180,6 +180,3 @@ public class LessThanPtg
     }
 
 }
-
-
-
index c48ad8c3b177c530aa9aaff6cd5232be52802e1d..31a1bcafec13c0fc8ff5935bbdd6c376e16c7996 100644 (file)
@@ -61,7 +61,7 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -118,7 +118,7 @@ public class MemErrPtg
         return SIZE;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "ERR#";
     }
index 2d422b1c7ef9922ec4f96d284de4134e5553b6a0..a8b63609c43ea19e06e7bcfbd0c4ffab137b513e 100644 (file)
@@ -60,7 +60,7 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * @author Glen Stampoultzis (glens at apache.org)
@@ -96,7 +96,7 @@ public class MemFuncPtg extends ControlPtg
         LittleEndian.putShort( array, offset + 1, (short)field_1_len_ref_subexpression );
     }
 
-    public String toFormulaString( SheetReferences refs )
+    public String toFormulaString(Workbook book)
     {
         return "";
     }
index 3f88ded3b8256614b386c539ed571b8d9b183283..c65ab41f3d3d4ef7452062fd8a57bdd47be4c0cb 100644 (file)
@@ -54,7 +54,7 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Missing Function Arguments
@@ -91,7 +91,7 @@ public class MissingArgPtg
     }
 
    
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return " ";
     }
@@ -103,5 +103,3 @@ public class MissingArgPtg
     }
 
 }
-
-
index 143702ce164b10315b77b0d78b0ad14ec43a9136..6b33e619b619d12e9cc8735524ef905466aa49b7 100644 (file)
@@ -61,7 +61,7 @@
 package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Implements the standard mathmatical multiplication - *
@@ -114,7 +114,7 @@ public class MultiplyPtg
     }
     
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "*";
     }
@@ -123,9 +123,9 @@ public class MultiplyPtg
     {
         StringBuffer buffer = new StringBuffer();
 
-        buffer.append(operands[ 0 ].toFormulaString((SheetReferences)null));
+        buffer.append(operands[ 0 ].toFormulaString((Workbook)null));
         buffer.append("*");
-        buffer.append(operands[ 1 ].toFormulaString((SheetReferences)null));
+        buffer.append(operands[ 1 ].toFormulaString((Workbook)null));
         return buffer.toString();
     }
     
@@ -133,7 +133,7 @@ public class MultiplyPtg
         StringBuffer buffer = new StringBuffer();
 
         buffer.append(operands[ 0 ]);
-        buffer.append(toFormulaString((SheetReferences)null));
+        buffer.append(toFormulaString((Workbook)null));
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }                  
index 3786cdd69468cec62c0e733a588179f80747c30f..6cdee6af030788d493bc74a806d89cc66ad756e9 100644 (file)
@@ -61,7 +61,8 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
+import org.apache.poi.hssf.record.NameRecord;
 
 /**
  *
@@ -85,9 +86,22 @@ public class NamePtg
 
     /** Creates new NamePtg */
 
-    public NamePtg(String name)
+    public NamePtg(String name, Workbook book)
     {
-        //TODO
+        final short n = (short) (book.getNumNames() + 1);
+        NameRecord rec;
+        for (short i = 1; i < n; i++) {
+            rec = book.getNameRecord(i - 1);
+            if (name.equals(rec.getNameText())) {
+                field_1_label_index = i;
+                return;
+            }
+        }
+        rec = new NameRecord();
+        rec.setNameText(name);
+        rec.setNameTextLength((byte) name.length());
+        book.addName(rec);
+        field_1_label_index = n;
     }
 
     /** Creates new NamePtg */
@@ -113,12 +127,13 @@ public class NamePtg
         return SIZE;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
-        return "NAMED RANGE";
+        NameRecord rec = book.getNameRecord(field_1_label_index - 1);
+        return rec.getNameText();
     }
     
-    public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
+    public byte getDefaultOperandClass() {return Ptg.CLASS_REF;}
 
     public Object clone() {
       NamePtg ptg = new NamePtg();
index 58fa096866d83e203b9c9f71f79959883f1621c5..9b6225d80912d0db6e7c9f039a1719c5c1ff0068 100644 (file)
@@ -61,7 +61,7 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -113,7 +113,7 @@ public class NameXPtg extends Ptg
         return SIZE;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "NO IDEA - NAME";
     }
index 81dffd6eb06d347a2ff96eeaf03a9ea0bc073513..b12b16ae9741d7f1edd8231921cbbb12f2767c74 100755 (executable)
@@ -56,7 +56,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Ptg class to implement not equal
@@ -101,7 +101,7 @@ public class NotEqualPtg
                  return 2;
         }
 
-        public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
         {
                  return "<>";
         }
@@ -111,7 +111,7 @@ public class NotEqualPtg
 
         
                  buffer.append(operands[ 0 ]);
-                 buffer.append(toFormulaString((SheetReferences)null));
+                 buffer.append(toFormulaString((Workbook)null));
                  buffer.append(operands[ 1 ]);
                  return buffer.toString();
         }       
index e071420bc57de12eea54646f88f8aad513631b34..b43c5536eb9e664b6f323fff128700ba574ba1cd 100644 (file)
@@ -55,7 +55,7 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 /**
  * Number
  * Stores a floating point value in a formula
@@ -113,7 +113,7 @@ public class NumberPtg
         return SIZE;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "" + getValue();
     }
@@ -125,4 +125,3 @@ public class NumberPtg
       return ptg;
     }
 }
-
index c2118f151f7aceb9cd6340ca192f45b5dfaaa145..2abff9e73aaecec58e84dba407d5b13ce9b90e83 100644 (file)
@@ -57,7 +57,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * While formula tokens are stored in RPN order and thus do not need parenthesis for 
@@ -107,7 +107,7 @@ public class ParenthesisPtg
         return 1;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "()";
     }
@@ -124,4 +124,3 @@ public class ParenthesisPtg
     }
 
 }
-
index ca7fa64863a7cce14562d8d46da27dca1dd31a22..161918abef010f46800a1454017131999849265c 100644 (file)
@@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -108,7 +108,7 @@ public class PowerPtg
         return 2;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "^";
     }
@@ -118,7 +118,7 @@ public class PowerPtg
 
         
         buffer.append(operands[ 0 ]);
-        buffer.append(toFormulaString((SheetReferences)null));
+        buffer.append(toFormulaString((Workbook)null));
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }       
index 70b0606134eafc2804efda2f17376e0a88ff5a0c..cdf584ed1ab8b15612c592d05409aafa12fc77f5 100644 (file)
@@ -63,7 +63,7 @@ package org.apache.poi.hssf.record.formula;
 import java.util.List;
 import java.util.ArrayList;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -347,7 +347,7 @@ public abstract class Ptg
     /**
      * return a string representation of this token alone
      */
-    public abstract String toFormulaString(SheetReferences refs);
+    public abstract String toFormulaString(Workbook book);
     /**
      * dump a debug representation (hexdump) to a string
      */
index 13ae2ef238d5a8e9f3af5fd971a072a8aea629cb..4e175e85be9b026608914fc96f9df2ec90cc88e1 100644 (file)
@@ -61,6 +61,7 @@ import org.apache.poi.util.LittleEndian;
 import org.apache.poi.hssf.util.RangeAddress;
 import org.apache.poi.hssf.util.CellReference;
 import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 import org.apache.poi.util.BitField;
 import org.apache.poi.hssf.model.Workbook;
 
@@ -193,8 +194,9 @@ public class Ref3DPtg extends Ptg {
 
     }
 
-    public String toFormulaString(SheetReferences refs) {
+    public String toFormulaString(Workbook book) {
         StringBuffer retval = new StringBuffer();
+        SheetReferences refs = book == null ? null : book.getSheetReferences();
         if (refs != null) {
             retval.append(refs.getSheetName((int)this.field_1_index_extern_sheet));
             retval.append('!');
index 2ec380a4adede0ab24fe13c4bba5019d67aab307..4c14aaf55f593c306fbe96394693b1424d033aff 100644 (file)
@@ -64,7 +64,7 @@ import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.BitField;
 
 import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * ReferencePtg - handles references (such as A1, A2, IA4)
@@ -179,7 +179,7 @@ public class ReferencePtg extends Ptg
         return SIZE;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         //TODO -- should we store a cellreference instance in this ptg?? but .. memory is an issue, i believe!
         return (new CellReference(getRow(),getColumn(),!isRowRelative(),!isColRelative())).toString();
index a66861914ed8fa348ced601de6c95507224fecfd..1ad2789d47df7f4c0abb39f4c10030a86e5cf228 100644 (file)
@@ -56,7 +56,7 @@ package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.BitField;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 import org.apache.poi.util.StringUtil;
 
 /**
@@ -145,7 +145,7 @@ public class StringPtg
         }
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "\""+getValue()+"\"";
     }
@@ -162,4 +162,3 @@ public class StringPtg
    }
 
 }
-
index 2c5588f3ddfdd67e655b2cd61a89079cd567853b..cd9fa5fd78732b669e63da1fd695a6f381caec03 100644 (file)
@@ -61,7 +61,7 @@
 package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -105,7 +105,7 @@ public class SubtractPtg
         return 2;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "-";
     }
index 6cbe9b64d91863b817e21f1a222361a07900ab5b..bb60dd09bca8ed305770dda3e313155ad1137f01 100644 (file)
@@ -56,7 +56,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Unary Plus operator
@@ -105,7 +105,7 @@ public class UnaryMinusPtg extends OperationPtg
     }
     
     /** Implementation of method from Ptg */
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "+";
     }
index cf2a5e8b99cc5442d3c5be3114c4788308bfc0d6..c7ec1e0e991072a943c9376996aa3f228ec9b3a0 100644 (file)
@@ -56,7 +56,7 @@ package org.apache.poi.hssf.record.formula;
 
 import java.util.List;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * Unary Plus operator
@@ -105,7 +105,7 @@ public class UnaryPlusPtg extends OperationPtg
     }
     
     /** Implementation of method from Ptg */
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "+";
     }
index f84235055e4ac198c8b1e2343d0ddd791ce526d8..dea5997e05455a6f71e3cc8747467e15cecde985 100644 (file)
@@ -54,7 +54,7 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  * @author Glen Stampoultzis (glens at apache.org)
@@ -95,7 +95,7 @@ public class UnionPtg extends OperationPtg
     }
 
     /** Implementation of method from Ptg */
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return ",";
     }
index 2dd064973c088b372ceffb971df916cc3676287f..56d03f60c1292099ec78a412723597bb795ccba9 100644 (file)
@@ -60,7 +60,7 @@
  */
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.hssf.model.Workbook;
 
 /**
  *
@@ -94,7 +94,7 @@ public class UnknownPtg
         return size;
     }
 
-    public String toFormulaString(SheetReferences refs)
+    public String toFormulaString(Workbook book)
     {
         return "UNKNOWN";
     }
index 5986b846357ffa3c414e680c1ca4019d4ac53dba..c9a31854dcbf8a573209945b3bcbe09f859aaa1b 100644 (file)
@@ -726,8 +726,7 @@ public class HSSFCell
 
     public String getCellFormula() {
         //Workbook.currentBook=book;
-        SheetReferences refs = book.getSheetReferences();
-        String retval = FormulaParser.toFormulaString(refs, ((FormulaRecordAggregate)record).getFormulaRecord().getParsedExpression());
+        String retval = FormulaParser.toFormulaString(book, ((FormulaRecordAggregate)record).getFormulaRecord().getParsedExpression());
         //Workbook.currentBook=null;
         return retval;
     }
index 0f7178225e33d88df511af3fcabe625348f156bc..8c186340259ed972c2a31c28fc1351ece8798a38 100644 (file)
@@ -123,8 +123,7 @@ public class HSSFName {
 
     public String getReference() {
         String result;
-        SheetReferences refs = book.getSheetReferences();
-        result = name.getAreaReference(refs);
+        result = name.getAreaReference(book);
 
         return result;
     }
@@ -167,4 +166,3 @@ public class HSSFName {
     }
 
 }
-
index 69f2c99e95d786ae1abf62202445d772edbd682b..32f4c2c41229e5147cdd88a70037422fa61c26cb 100644 (file)
@@ -898,7 +898,7 @@ public class HSSFWorkbook
                if (name == null) return null;
                //adding one here because 0 indicates a global named region; doesnt make sense for print areas
    
-               return name.getAreaReference(workbook.getSheetReferences());
+               return name.getAreaReference(workbook);
        }    
     
     /**
index c4722a9a73479ff22da5edb554cf0333c1c0ba95..dadab580c82019b274be0fdd923fe5f8a4bd5114 100644 (file)
@@ -56,7 +56,6 @@ package org.apache.poi.hssf.model;
 import junit.framework.TestCase;
 
 import org.apache.poi.hssf.record.formula.*;
-import org.apache.poi.hssf.util.SheetReferences;
 
 /**
  * Test the low level formula parser functionality. High level tests are to 
@@ -145,7 +144,7 @@ public class TestFormulaParser extends TestCase {
         assertEquals(true, flag.getValue());
         assertEquals("Y", y.getValue());
         assertEquals("N", n.getValue());
-        assertEquals("IF", funif.toFormulaString(new SheetReferences()));
+        assertEquals("IF", funif.toFormulaString((Workbook) null));
         assertTrue("Goto ptg exists", goto1.isGoto());
     }
 
@@ -285,6 +284,19 @@ public class TestFormulaParser extends TestCase {
                
        }
            
+    public void testMacroFunction() {
+        Workbook w = new Workbook();
+        FormulaParser fp = new FormulaParser("FOO()", w);
+        fp.parse();
+        Ptg[] ptg = fp.getRPNPtg();
+
+        AbstractFunctionPtg tfunc = (AbstractFunctionPtg) ptg[0];
+        assertEquals("externalflag", tfunc.getName());
+
+        NamePtg tname = (NamePtg) ptg[1];
+        assertEquals("FOO", tname.toFormulaString(w));
+    }
+
      public static void main(String [] args) {
         System.out.println("Testing org.apache.poi.hssf.record.formula.FormulaParser");
         junit.textui.TestRunner.run(TestFormulaParser.class);
index 450c7325d9850847c193d8320f6dcaa565770120..0baf1a3b6709e0ccce3d2e12093e33ad2f77b681 100644 (file)
@@ -744,7 +744,7 @@ extends TestCase {
     }
     
     public void testSheetFunctions()
-        throws java.io.IOException
+        throws IOException
     {
         String filename = System.getProperty("HSSF.testdata.path");
 
@@ -818,7 +818,7 @@ extends TestCase {
     }
     
     public void testStringFormulas()
-        throws java.io.IOException
+        throws IOException
     {
         String readFilename = System.getProperty("HSSF.testdata.path");
 
@@ -852,7 +852,7 @@ extends TestCase {
     
     
     public void testLogicalFormulas()
-        throws java.io.IOException
+        throws IOException
     {
 
             File file = File.createTempFile("testLogicalFormula",".xls");
@@ -880,7 +880,7 @@ extends TestCase {
     }
     
     public void testDateFormulas()
-        throws java.io.IOException
+        throws IOException
     {
         String readFilename = System.getProperty("HSSF.testdata.path");
 
@@ -918,7 +918,7 @@ extends TestCase {
 
     
     public void testIfFormulas()
-        throws java.io.IOException
+        throws IOException
     {
         String readFilename = System.getProperty("HSSF.testdata.path");
 
@@ -1008,7 +1008,7 @@ extends TestCase {
     }
 
        public void testSumIf()
-               throws java.io.IOException
+               throws IOException
        {
                String readFilename = System.getProperty("HSSF.testdata.path");         
                String function ="SUMIF(A1:A5,\">4000\",B1:B5)";
@@ -1060,6 +1060,52 @@ extends TestCase {
                assertTrue("sumif == 0 bytes", file.length() > 0);
        }
     
+    public void testSquareMacro() throws IOException {
+        File dir = new File(System.getProperty("HSSF.testdata.path"));
+        File xls = new File(dir, "SquareMacro.xls");
+        FileInputStream in = new FileInputStream(xls);
+        HSSFWorkbook w;
+        try {
+            w = new HSSFWorkbook(in);
+        } finally {
+            in.close();
+        }
+        HSSFSheet s0 = w.getSheetAt(0);
+        HSSFRow[] r = {s0.getRow(0), s0.getRow(1)};
+
+        HSSFCell a1 = r[0].getCell((short) 0);
+        assertEquals("square(1)", a1.getCellFormula());
+        assertEquals(1d, a1.getNumericCellValue(), 1e-9);
+
+        HSSFCell a2 = r[1].getCell((short) 0);
+        assertEquals("square(2)", a2.getCellFormula());
+        assertEquals(4d, a2.getNumericCellValue(), 1e-9);
+
+        HSSFCell b1 = r[0].getCell((short) 1);
+        assertEquals("IF(TRUE,square(1))", b1.getCellFormula());
+        assertEquals(1d, b1.getNumericCellValue(), 1e-9);
+
+        HSSFCell b2 = r[1].getCell((short) 1);
+        assertEquals("IF(TRUE,square(2))", b2.getCellFormula());
+        assertEquals(4d, b2.getNumericCellValue(), 1e-9);
+
+        HSSFCell c1 = r[0].getCell((short) 2);
+        assertEquals("square(square(1))", c1.getCellFormula());
+        assertEquals(1d, c1.getNumericCellValue(), 1e-9);
+
+        HSSFCell c2 = r[1].getCell((short) 2);
+        assertEquals("square(square(2))", c2.getCellFormula());
+        assertEquals(16d, c2.getNumericCellValue(), 1e-9);
+
+        HSSFCell d1 = r[0].getCell((short) 3);
+        assertEquals("square(one())", d1.getCellFormula());
+        assertEquals(1d, d1.getNumericCellValue(), 1e-9);
+
+        HSSFCell d2 = r[1].getCell((short) 3);
+        assertEquals("square(two())", d2.getCellFormula());
+        assertEquals(4d, d2.getNumericCellValue(), 1e-9);
+    }
+
     public static void main(String [] args) {
         System.out
         .println("Testing org.apache.poi.hssf.usermodel.TestFormulas");