]> source.dussan.org Git - poi.git/commitdiff
preliminary support for "if" formulas. Doesn't work yet because of this
authorAndrew C. Oliver <acoliver@apache.org>
Mon, 2 Sep 2002 21:16:29 +0000 (21:16 +0000)
committerAndrew C. Oliver <acoliver@apache.org>
Mon, 2 Sep 2002 21:16:29 +0000 (21:16 +0000)
strange "aggregate this stuff" function
PR:
Obtained from:
Submitted by:
Reviewed by:

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

src/java/org/apache/poi/hssf/model/FormulaParser.java
src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
src/java/org/apache/poi/hssf/record/formula/AttrPtg.java
src/java/org/apache/poi/hssf/record/formula/Ptg.java

index a021803b6c5dfe6632d4a2c04956cee4b900d54e..78bd113d423008984667cd1d2271d78ddbb94d01 100644 (file)
@@ -307,15 +307,15 @@ public class FormulaParser {
     
     private Ptg getFunction(String name,byte numArgs) {
         Ptg retval = null;
-        retval = new FuncVarPtg(name,numArgs);
-       /** if (numArgs == 1 && name.equals("SUM")) {
+        //retval = new FuncVarPtg(name,numArgs);
+       if (name.equals("IF")) {
             AttrPtg ptg = new AttrPtg();
-            ptg.setData((short)1); //sums don't care but this is what excel does.
-            ptg.setSum(true);
+            ptg.setData((short)6); //sums don't care but this is what excel does.
+            ptg.setOptimizedIf(true);
             retval = ptg;
         } else {
             retval = new FuncVarPtg(name,numArgs);
-        }*/
+        }
         
         return retval; 
     }
@@ -394,12 +394,13 @@ public class FormulaParser {
     /** Parse and Translate a Math Term */
     private void  Term(){
         Factor();
-        while (Look == '*' || Look == '/' || Look == '^' || Look == '&') {
+        while (Look == '*' || Look == '/' || Look == '^' || Look == '&' || Look == '=' ) {
             ///TODO do we need to do anything here??
             if (Look == '*') Multiply();
             if (Look == '/') Divide();
             if (Look == '^') Power();
             if (Look == '&') Concat();
+            if (Look == '=') Equal();
         }
     }
     
@@ -410,14 +411,19 @@ public class FormulaParser {
         tokens.add(new AddPtg());
     }
     
-    /** Recognize and Translate an Add */
+    /** Recognize and Translate a Concatination */
     private void Concat() {
         Match('&');
         Term();
         tokens.add(new ConcatPtg());
     }
     
-    
+    /** Recognize and Translate a test for Equality  */
+    private void Equal() {
+        Match('=');
+        Term();
+        tokens.add(new EqualPtg());
+    }
     
     /** Recognize and Translate a Subtract */
     private void Subtract() {
index 58eb980847757972672960e5e10ceffeec7f7769..007d97ed38bc09a1b590b88a3b8f77ca418c1e64 100644 (file)
@@ -21,8 +21,7 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
     
     protected byte field_1_num_args;
     protected short field_2_fnc_index;
-    
-    
     public String toString() {
         StringBuffer buffer = new StringBuffer();
         buffer
@@ -45,7 +44,11 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
     }
     
     public String getName() {
+       if(field_2_fnc_index != 1) {
         return lookupName(field_2_fnc_index);
+       } else {
+        return "Funky case of formula recombinating";
+       }
     }
     
     public String toFormulaString(SheetReferences refs) {
@@ -54,15 +57,21 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
     
     public String toFormulaString(String[] operands) {
         StringBuffer buf = new StringBuffer();
-        buf.append(getName()+"(");
-        if (operands.length >0) {
-            for (int i=0;i<operands.length;i++) {
-                buf.append(operands[i]);
-                buf.append(',');
-            }
-            buf.deleteCharAt(buf.length()-1);
-        }
+        if (field_2_fnc_index != 1) {
+          buf.append(getName()+"(");
+          if (operands.length >0) {
+              for (int i=0;i<operands.length;i++) {
+                  buf.append(operands[i]);
+                  buf.append(',');
+              }
+              buf.deleteCharAt(buf.length()-1);
+          }
         buf.append(")");
+        } else {
+         throw new RuntimeException("FUNKY CASE OF FORMULA RECOMBINATION NOT "+
+         "YET IMPLEMENTED");
+         
+        }
         return buf.toString();
     }
     
index 6a9886511eb49b88867826e2cea4cb2ea0739d02..2e2c4b9fe43e2b2799c539e178cdc6ae0dbb7c3a 100644 (file)
@@ -142,6 +142,10 @@ public class AttrPtg
         field_1_options=sum.setByteBoolean(field_1_options,bsum);
     }
 
+    public void setOptimizedIf(boolean bif) {
+        field_1_options=optiIf.setByteBoolean(field_1_options,bif);
+    }
+
     // lets hope no one uses this anymore
     public boolean isBaxcel()
     {
@@ -196,8 +200,9 @@ public class AttrPtg
     public String toFormulaString(String[] operands) {
         if(space.isSet(field_1_options)) {
             return operands[ 0 ];
-        }
-        else {
+        } else if (optiIf.isSet(field_1_options)) {
+            return toFormulaString((SheetReferences)null) + "(" + operands[ 0 ]             +")"; 
+        } else {
             return toFormulaString((SheetReferences)null) + "(" + operands[ 0 ] + ")";
         }
     }
index 0781c3caca5a1219e2391b621dc034b1b7cbf562..6aaa69bf52c48be0cbe13c9bb1f796d6244acaac 100644 (file)
@@ -167,6 +167,10 @@ public abstract class Ptg
             case PowerPtg.sid :
                 retval = new PowerPtg(data, offset);
                 break;
+            case EqualPtg.sid:
+                retval = new EqualPtg(data, offset);
+                break;
                 
             case ConcatPtg.sid :
                 retval = new ConcatPtg(data, offset);