]> source.dussan.org Git - poi.git/commitdiff
Mostly fix bug 42618 (really this time...) - can now open the file properly, but...
authorNick Burch <nick@apache.org>
Mon, 28 Jan 2008 12:18:12 +0000 (12:18 +0000)
committerNick Burch <nick@apache.org>
Mon, 28 Jan 2008 12:18:12 +0000 (12:18 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@615859 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/record/formula/ConcatPtg.java
src/java/org/apache/poi/hssf/record/formula/Ptg.java
src/java/org/apache/poi/hssf/record/formula/RangePtg.java
src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java
src/testcases/org/apache/poi/hssf/data/TestDataValidation.xls
src/testcases/org/apache/poi/hssf/record/TestFormulaRecord.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java

index b5a2de2a5de324eb36c59077e2e3da6a5f39c191..41d2de0cbae58ca2f0147003ee663f47869148eb 100644 (file)
@@ -34,11 +34,10 @@ public class ConcatPtg
     public final static byte sid  = 0x08;
     
     private final static String CONCAT = "&";
-
+    
     public ConcatPtg(RecordInputStream in)
     {
-
-        // doesn't need anything
+       // No contents
     }
     
     public ConcatPtg() {
index cc9a4236ba438ff9efd92b1b4214f40e756510e2..f006509c23fcbffc116eb6d25300725cfa691e08 100644 (file)
@@ -137,8 +137,8 @@ public abstract class Ptg
                  break;
                  
              case DividePtg.sid :               // 0x06
-                                 retval = new DividePtg(in);
-                                 break;
+                     retval = new DividePtg(in);
+                     break;
                  
              case PowerPtg.sid :                // 0x07
                  retval = new PowerPtg(in);
@@ -208,6 +208,7 @@ public abstract class Ptg
                 break;
  
              case AttrPtg.sid :                 // 0x19
+             case 0x1a :
                  retval = new AttrPtg(in);
                                  break;
                  
@@ -224,8 +225,8 @@ public abstract class Ptg
                                  break;
  
              case NumberPtg.sid :               // 0x1f
-                                retval = new NumberPtg(in);
-                                break;
+                     retval = new NumberPtg(in);
+                     break;
                  
              case ArrayPtg.sid :                // 0x20
                retval = new ArrayPtg(in);
@@ -350,9 +351,12 @@ public abstract class Ptg
              case DeletedArea3DPtg.sid + 0x40 : // 0x7d
                  retval = new DeletedArea3DPtg(in);
                  break;
-
+                 
+             case 0x00:
+                retval = new UnknownPtg();
+                break;
+                 
             default :
-
                  //retval = new UnknownPtg();
                  throw new java.lang.UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+
                         Integer.toHexString(( int ) id) + " (" + ( int ) id + ")");
index f0bd8c1c1b949a8535997b6239156548a4823f94..51df7844a4babd69afee4d7977c9a9f8c273d3cf 100644 (file)
@@ -25,22 +25,22 @@ import org.apache.poi.hssf.record.RecordInputStream;
  */
 public class RangePtg extends OperationPtg
 {
+    public final static int  SIZE = 1;
     public final static byte sid  = 0x11;
 
-
     public RangePtg()
     {
     }
 
     public RangePtg(RecordInputStream in)
     {
-        // doesn't need anything
+       // No contents
     }
 
 
     public int getSize()
     {
-        return 1;
+        return SIZE;
     }
 
     public void writeBytes( byte[] array, int offset )
index 9cc515832522085335637df7551aa657306a9056..1badf519705b489fe8360cf219fd7c57fa2a620a 100644 (file)
@@ -28,7 +28,7 @@ import org.apache.poi.hssf.record.RecordInputStream;
 public class UnknownPtg
     extends Ptg
 {
-    private short size;
+    private short size = 1;
 
     /** Creates new UnknownPtg */
 
index 556ea8192758d22c8b5427a379673771298ee08d..524136921295c334de8c0ac65bbb96c77dc9e63c 100644 (file)
Binary files a/src/testcases/org/apache/poi/hssf/data/TestDataValidation.xls and b/src/testcases/org/apache/poi/hssf/data/TestDataValidation.xls differ
index 99026bb8064f9d7fed194994beda8d8c25739d75..9cf746ce00de60d1706c5af9c60872830cbc71b7 100644 (file)
 package org.apache.poi.hssf.record;
 
 
+import java.io.ByteArrayInputStream;
+
+import org.apache.poi.hssf.record.formula.AttrPtg;
+import org.apache.poi.hssf.record.formula.ConcatPtg;
+import org.apache.poi.hssf.record.formula.FuncVarPtg;
+import org.apache.poi.hssf.record.formula.IntPtg;
+import org.apache.poi.hssf.record.formula.RangePtg;
+import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.UnknownPtg;
+
 import junit.framework.TestCase;
 
 /**
@@ -108,6 +118,52 @@ public class TestFormulaRecord
        assertEquals("Offset 22", 1, output[26]);
     }
     
+    public void testWithConcat()  throws Exception {
+       // =CHOOSE(2,A2,A3,A4)
+       byte[] data = new byte[] {
+                       6, 0, 68, 0,
+                       1, 0, 1, 0, 15, 0, 0, 0, 0, 0, 0, 0, 57,
+                               64, 0, 0, 12, 0, 12, -4, 46, 0, 
+                               30, 2, 0,    // Int - 2
+                               25, 4, 3, 0, // Attr
+                               8, 0,        // Concat 
+                               17, 0,       // Range 
+                               26, 0, 35, 0, // Bit like an attr
+                               36, 1, 0, 0, -64, // Ref - A2
+                               25, 8, 21, 0, // Attr
+                               36, 2, 0, 0, -64, // Ref - A3
+                               25,     8, 12, 0, // Attr
+                               36, 3, 0, 0, -64, // Ref - A4
+                               25, 8, 3, 0,  // Attr 
+                               66, 4, 100, 0 // CHOOSE
+       };
+       RecordInputStream inp = new RecordInputStream(
+                       new ByteArrayInputStream(data)
+       );
+       inp.nextRecord();
+       
+       FormulaRecord fr = new FormulaRecord(inp);
+       
+       assertEquals(14, fr.getNumberOfExpressionTokens());
+       assertEquals(IntPtg.class,       fr.getParsedExpression().get(0).getClass());
+       assertEquals(AttrPtg.class,      fr.getParsedExpression().get(1).getClass());
+       assertEquals(ConcatPtg.class,    fr.getParsedExpression().get(2).getClass());
+       assertEquals(UnknownPtg.class,   fr.getParsedExpression().get(3).getClass());
+       assertEquals(RangePtg.class,     fr.getParsedExpression().get(4).getClass());
+       assertEquals(UnknownPtg.class,   fr.getParsedExpression().get(5).getClass());
+       assertEquals(AttrPtg.class,      fr.getParsedExpression().get(6).getClass());
+       assertEquals(ReferencePtg.class, fr.getParsedExpression().get(7).getClass());
+       assertEquals(AttrPtg.class,      fr.getParsedExpression().get(8).getClass());
+       assertEquals(ReferencePtg.class, fr.getParsedExpression().get(9).getClass());
+       assertEquals(AttrPtg.class,      fr.getParsedExpression().get(10).getClass());
+       assertEquals(ReferencePtg.class, fr.getParsedExpression().get(11).getClass());
+       assertEquals(AttrPtg.class,      fr.getParsedExpression().get(12).getClass());
+       assertEquals(FuncVarPtg.class,   fr.getParsedExpression().get(13).getClass());
+       
+       FuncVarPtg choose = (FuncVarPtg)fr.getParsedExpression().get(13);
+       assertEquals("CHOOSE", choose.getName());
+    }
+    
     
     public static void main(String [] ignored_args)
     {
index 3c584f33a08d0fa6affdf8f206609e44eea4d775..590ec4943c9c0b262d401ef40e15e046296acead 100644 (file)
@@ -1013,11 +1013,9 @@ extends TestCase {
        /**
         * Bug 42618: RecordFormatException reading a file containing
         *      =CHOOSE(2,A2,A3,A4)
+        * TODO - support getCellFormula too!
         */
     public void test42618() throws Exception {
-        //Comment the test until we are sure it passes.
-        // Yegor, January 25, 2008
-        /*
         FileInputStream in = new FileInputStream(new File(cwd, "SimpleWithChoose.xls"));
         HSSFWorkbook wb = new HSSFWorkbook(in);
         in.close();
@@ -1031,7 +1029,23 @@ extends TestCase {
 
         wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
         assertTrue("No Exceptions while reading file", true);
-        */
+        
+        // Check we detect the string properly too
+        HSSFSheet s = wb.getSheetAt(0);
+        
+        // Textual value
+        HSSFRow r1 = s.getRow(0);
+        HSSFCell c1 = r1.getCell((short)1);
+        assertEquals("=CHOOSE(2,A2,A3,A4)", c1.getRichStringCellValue().toString());
+        
+        // Formula Value
+        HSSFRow r2 = s.getRow(1);
+        HSSFCell c2 = r2.getCell((short)1);
+        assertEquals(25, (int)c2.getNumericCellValue());
+        
+        // This will blow up with a 
+        //  "EmptyStackException"
+        //assertEquals("=CHOOSE(2,A2,A3,A4)", c2.getCellFormula());
     }
 }