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
01fc557873
commit
bfd5ebe008
@ -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() {
|
||||||
|
@ -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 + ")");
|
||||||
|
@ -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 )
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
|
Binary file not shown.
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user