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:
Nick Burch 2008-01-28 12:18:12 +00:00
parent 01fc557873
commit bfd5ebe008
7 changed files with 90 additions and 17 deletions

View File

@ -34,11 +34,10 @@ public class ConcatPtg
public final static byte sid = 0x08; public final static byte sid = 0x08;
private final static String CONCAT = "&"; private final static String CONCAT = "&";
public ConcatPtg(RecordInputStream in) public ConcatPtg(RecordInputStream in)
{ {
// No contents
// doesn't need anything
} }
public ConcatPtg() { public ConcatPtg() {

View File

@ -137,8 +137,8 @@ public abstract class Ptg
break; break;
case DividePtg.sid : // 0x06 case DividePtg.sid : // 0x06
retval = new DividePtg(in); retval = new DividePtg(in);
break; break;
case PowerPtg.sid : // 0x07 case PowerPtg.sid : // 0x07
retval = new PowerPtg(in); retval = new PowerPtg(in);
@ -208,6 +208,7 @@ public abstract class Ptg
break; break;
case AttrPtg.sid : // 0x19 case AttrPtg.sid : // 0x19
case 0x1a :
retval = new AttrPtg(in); retval = new AttrPtg(in);
break; break;
@ -224,8 +225,8 @@ public abstract class Ptg
break; break;
case NumberPtg.sid : // 0x1f case NumberPtg.sid : // 0x1f
retval = new NumberPtg(in); retval = new NumberPtg(in);
break; break;
case ArrayPtg.sid : // 0x20 case ArrayPtg.sid : // 0x20
retval = new ArrayPtg(in); retval = new ArrayPtg(in);
@ -350,9 +351,12 @@ public abstract class Ptg
case DeletedArea3DPtg.sid + 0x40 : // 0x7d case DeletedArea3DPtg.sid + 0x40 : // 0x7d
retval = new DeletedArea3DPtg(in); retval = new DeletedArea3DPtg(in);
break; break;
case 0x00:
retval = new UnknownPtg();
break;
default : default :
//retval = new UnknownPtg(); //retval = new UnknownPtg();
throw new java.lang.UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+ throw new java.lang.UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+
Integer.toHexString(( int ) id) + " (" + ( int ) id + ")"); Integer.toHexString(( int ) id) + " (" + ( int ) id + ")");

View File

@ -25,22 +25,22 @@ import org.apache.poi.hssf.record.RecordInputStream;
*/ */
public class RangePtg extends OperationPtg public class RangePtg extends OperationPtg
{ {
public final static int SIZE = 1;
public final static byte sid = 0x11; public final static byte sid = 0x11;
public RangePtg() public RangePtg()
{ {
} }
public RangePtg(RecordInputStream in) public RangePtg(RecordInputStream in)
{ {
// doesn't need anything // No contents
} }
public int getSize() public int getSize()
{ {
return 1; return SIZE;
} }
public void writeBytes( byte[] array, int offset ) public void writeBytes( byte[] array, int offset )

View File

@ -28,7 +28,7 @@ import org.apache.poi.hssf.record.RecordInputStream;
public class UnknownPtg public class UnknownPtg
extends Ptg extends Ptg
{ {
private short size; private short size = 1;
/** Creates new UnknownPtg */ /** Creates new UnknownPtg */

View File

@ -21,6 +21,16 @@
package org.apache.poi.hssf.record; 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; import junit.framework.TestCase;
/** /**
@ -108,6 +118,52 @@ public class TestFormulaRecord
assertEquals("Offset 22", 1, output[26]); 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) public static void main(String [] ignored_args)
{ {

View File

@ -1013,11 +1013,9 @@ extends TestCase {
/** /**
* Bug 42618: RecordFormatException reading a file containing * Bug 42618: RecordFormatException reading a file containing
* =CHOOSE(2,A2,A3,A4) * =CHOOSE(2,A2,A3,A4)
* TODO - support getCellFormula too!
*/ */
public void test42618() throws Exception { 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")); FileInputStream in = new FileInputStream(new File(cwd, "SimpleWithChoose.xls"));
HSSFWorkbook wb = new HSSFWorkbook(in); HSSFWorkbook wb = new HSSFWorkbook(in);
in.close(); in.close();
@ -1031,7 +1029,23 @@ extends TestCase {
wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
assertTrue("No Exceptions while reading file", true); 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());
} }
} }