git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@615859 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_0_3_BETA1
@@ -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() { |
@@ -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 + ")"); |
@@ -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 ) |
@@ -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 */ | |||
@@ -21,6 +21,16 @@ | |||
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) | |||
{ |
@@ -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()); | |||
} | |||
} | |||