mirror of https://github.com/apache/poi.git
Mostly fix bug 42618 (really this time...) - can now open the file properly, but getCellFormula() is still playing up (bug #44306 opened for this)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@615859 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b8e41728b5
commit
d89b749d58
|
@ -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 */
|
||||
|
||||
|
|
Binary file not shown.
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue