-
/* ====================================================================
* The Apache Software License, Version 1.1
*
public class Area3DPtg extends Ptg
{
- public final static byte sid = 0x3b;
- private final static int SIZE = 11; // 10 + 1 for Ptg
- private short field_1_index_extern_sheet;
- private short field_2_first_row;
- private short field_3_last_row;
- private short field_4_first_column;
- private short field_5_last_column;
-
- private BitField rowRelative = new BitField(0x8000);
- private BitField colRelative = new BitField(0x4000);
+ public final static byte sid = 0x3b;
+ private final static int SIZE = 11; // 10 + 1 for Ptg
+ private short field_1_index_extern_sheet;
+ private short field_2_first_row;
+ private short field_3_last_row;
+ private short field_4_first_column;
+ private short field_5_last_column;
+
+ private BitField rowRelative = new BitField( 0x8000 );
+ private BitField colRelative = new BitField( 0x4000 );
/** Creates new AreaPtg */
- public Area3DPtg() {}
-
- public Area3DPtg(String arearef, short externIdx) {
- AreaReference ar = new AreaReference(arearef);
-
- setFirstRow((short)ar.getCells()[0].getRow());
- setFirstColumn((short)ar.getCells()[0].getCol());
- setLastRow((short)ar.getCells()[1].getRow());
- setLastColumn((short)ar.getCells()[1].getCol());
- setFirstColRelative(!ar.getCells()[0].isColAbsolute());
- setLastColRelative(!ar.getCells()[1].isColAbsolute());
- setFirstRowRelative(!ar.getCells()[0].isRowAbsolute());
- setLastRowRelative(!ar.getCells()[1].isRowAbsolute());
- setExternSheetIndex(externIdx);
-
- }
- public Area3DPtg(byte[] data, int offset)
+ public Area3DPtg()
+ {
+ }
+
+ public Area3DPtg( String arearef, short externIdx )
+ {
+ AreaReference ar = new AreaReference( arearef );
+
+ setFirstRow( (short) ar.getCells()[0].getRow() );
+ setFirstColumn( (short) ar.getCells()[0].getCol() );
+ setLastRow( (short) ar.getCells()[1].getRow() );
+ setLastColumn( (short) ar.getCells()[1].getCol() );
+ setFirstColRelative( !ar.getCells()[0].isColAbsolute() );
+ setLastColRelative( !ar.getCells()[1].isColAbsolute() );
+ setFirstRowRelative( !ar.getCells()[0].isRowAbsolute() );
+ setLastRowRelative( !ar.getCells()[1].isRowAbsolute() );
+ setExternSheetIndex( externIdx );
+
+ }
+
+ public Area3DPtg( byte[] data, int offset )
{
offset++;
- field_1_index_extern_sheet = LittleEndian.getShort(data, 0 + offset);
- field_2_first_row = LittleEndian.getShort(data, 2 + offset);
- field_3_last_row = LittleEndian.getShort(data, 4 + offset);
- field_4_first_column = LittleEndian.getShort(data, 6 + offset);
- field_5_last_column = LittleEndian.getShort(data, 8 + offset);
+ field_1_index_extern_sheet = LittleEndian.getShort( data, 0 + offset );
+ field_2_first_row = LittleEndian.getShort( data, 2 + offset );
+ field_3_last_row = LittleEndian.getShort( data, 4 + offset );
+ field_4_first_column = LittleEndian.getShort( data, 6 + offset );
+ field_5_last_column = LittleEndian.getShort( data, 8 + offset );
}
public String toString()
{
StringBuffer buffer = new StringBuffer();
- buffer.append("AreaPtg\n");
- buffer.append("Index to Extern Sheet = " + getExternSheetIndex()).append("\n");
- buffer.append("firstRow = " + getFirstRow()).append("\n");
- buffer.append("lastRow = " + getLastRow()).append("\n");
- buffer.append("firstCol = " + getFirstColumn()).append("\n");
- buffer.append("lastCol = " + getLastColumn()).append("\n");
- buffer.append("firstColRel= "
- + isFirstRowRelative()).append("\n");
- buffer.append("lastColRowRel = "
- + isLastRowRelative()).append("\n");
- buffer.append("firstColRel = " + isFirstColRelative()).append("\n");
- buffer.append("lastColRel = " + isLastColRelative()).append("\n");
+ buffer.append( "AreaPtg\n" );
+ buffer.append( "Index to Extern Sheet = " + getExternSheetIndex() ).append( "\n" );
+ buffer.append( "firstRow = " + getFirstRow() ).append( "\n" );
+ buffer.append( "lastRow = " + getLastRow() ).append( "\n" );
+ buffer.append( "firstCol = " + getFirstColumn() ).append( "\n" );
+ buffer.append( "lastCol = " + getLastColumn() ).append( "\n" );
+ buffer.append( "firstColRel= "
+ + isFirstRowRelative() ).append( "\n" );
+ buffer.append( "lastColRowRel = "
+ + isLastRowRelative() ).append( "\n" );
+ buffer.append( "firstColRel = " + isFirstColRelative() ).append( "\n" );
+ buffer.append( "lastColRel = " + isLastColRelative() ).append( "\n" );
return buffer.toString();
}
- public void writeBytes(byte [] array, int offset)
+ public void writeBytes( byte[] array, int offset )
{
- array[ 0 + offset ] = (byte) (sid + ptgClass);
- LittleEndian.putShort(array, 1 + offset , getExternSheetIndex());
- LittleEndian.putShort(array, 3 + offset , getFirstRow());
- LittleEndian.putShort(array, 5 + offset , getLastRow());
- LittleEndian.putShort(array, 7 + offset , getFirstColumnRaw());
- LittleEndian.putShort(array, 9 + offset , getLastColumnRaw());
+ array[0 + offset] = (byte) ( sid + ptgClass );
+ LittleEndian.putShort( array, 1 + offset, getExternSheetIndex() );
+ LittleEndian.putShort( array, 3 + offset, getFirstRow() );
+ LittleEndian.putShort( array, 5 + offset, getLastRow() );
+ LittleEndian.putShort( array, 7 + offset, getFirstColumnRaw() );
+ LittleEndian.putShort( array, 9 + offset, getLastColumnRaw() );
}
public int getSize()
return SIZE;
}
- public short getExternSheetIndex(){
+ public short getExternSheetIndex()
+ {
return field_1_index_extern_sheet;
}
- public void setExternSheetIndex(short index){
+ public void setExternSheetIndex( short index )
+ {
field_1_index_extern_sheet = index;
}
return field_2_first_row;
}
- public void setFirstRow(short row)
+ public void setFirstRow( short row )
{
field_2_first_row = row;
}
return field_3_last_row;
}
- public void setLastRow(short row)
+ public void setLastRow( short row )
{
field_3_last_row = row;
}
public short getFirstColumn()
{
- return ( short ) (field_4_first_column & 0xFF);
+ return (short) ( field_4_first_column & 0xFF );
}
public short getFirstColumnRaw()
public boolean isFirstRowRelative()
{
- return rowRelative.isSet(field_4_first_column);
+ return rowRelative.isSet( field_4_first_column );
}
-
+
public boolean isFirstColRelative()
{
- return colRelative.isSet(field_4_first_column);
+ return colRelative.isSet( field_4_first_column );
}
- public void setFirstColumn(short column)
+ public void setFirstColumn( short column )
{
field_4_first_column &= 0xFF00;
field_4_first_column |= column & 0xFF;
}
- public void setFirstColumnRaw(short column)
+ public void setFirstColumnRaw( short column )
{
field_4_first_column = column;
}
public short getLastColumn()
{
- return ( short ) (field_5_last_column & 0xFF);
+ return (short) ( field_5_last_column & 0xFF );
}
public short getLastColumnRaw()
return field_5_last_column;
}
- public boolean isLastRowRelative()
+ public boolean isLastRowRelative()
{
- return rowRelative.isSet(field_5_last_column);
+ return rowRelative.isSet( field_5_last_column );
}
+
public boolean isLastColRelative()
{
- return colRelative.isSet(field_5_last_column);
+ return colRelative.isSet( field_5_last_column );
}
-
- public void setLastColumn(short column)
+
+ public void setLastColumn( short column )
{
field_5_last_column &= 0xFF00;
field_5_last_column |= column & 0xFF;
}
- public void setLastColumnRaw(short column)
+ public void setLastColumnRaw( short column )
{
field_5_last_column = column;
}
-
- /**
+
+ /**
* sets the first row to relative or not
* @param isRelative or not.
*/
- public void setFirstRowRelative(boolean rel) {
- field_4_first_column=rowRelative.setShortBoolean(field_4_first_column,rel);
+ public void setFirstRowRelative( boolean rel )
+ {
+ field_4_first_column = rowRelative.setShortBoolean( field_4_first_column, rel );
}
/**
- * set whether the first column is relative
+ * set whether the first column is relative
*/
- public void setFirstColRelative(boolean rel) {
- field_4_first_column=colRelative.setShortBoolean(field_4_first_column,rel);
+ public void setFirstColRelative( boolean rel )
+ {
+ field_4_first_column = colRelative.setShortBoolean( field_4_first_column, rel );
}
-
+
/**
* set whether the last row is relative or not
* @param last row relative
*/
- public void setLastRowRelative(boolean rel) {
- field_5_last_column=rowRelative.setShortBoolean(field_5_last_column,rel);
+ public void setLastRowRelative( boolean rel )
+ {
+ field_5_last_column = rowRelative.setShortBoolean( field_5_last_column, rel );
}
-
+
/**
* set whether the last column should be relative or not
*/
- public void setLastColRelative(boolean rel) {
- field_5_last_column=colRelative.setShortBoolean(field_5_last_column,rel);
+ public void setLastColRelative( boolean rel )
+ {
+ field_5_last_column = colRelative.setShortBoolean( field_5_last_column, rel );
}
-
+
/*public String getArea(){
RangeAddress ra = new RangeAddress( getFirstColumn(),getFirstRow() + 1, getLastColumn(), getLastRow() + 1);
return result;
}*/
- public void setArea(String ref){
- RangeAddress ra = new RangeAddress(ref);
+ public void setArea( String ref )
+ {
+ RangeAddress ra = new RangeAddress( ref );
String from = ra.getFromCell();
- String to = ra.getToCell();
+ String to = ra.getToCell();
- setFirstColumn((short) (ra.getXPosition(from) -1));
- setFirstRow((short) (ra.getYPosition(from) -1));
- setLastColumn((short) (ra.getXPosition(to) -1));
- setLastRow((short) (ra.getYPosition(to) -1));
+ setFirstColumn( (short) ( ra.getXPosition( from ) - 1 ) );
+ setFirstRow( (short) ( ra.getYPosition( from ) - 1 ) );
+ setLastColumn( (short) ( ra.getXPosition( to ) - 1 ) );
+ setLastRow( (short) ( ra.getYPosition( to ) - 1 ) );
}
- public String toFormulaString(SheetReferences refs)
+ public String toFormulaString( SheetReferences refs )
{
StringBuffer retval = new StringBuffer();
- if (refs != null) {
- retval.append(refs.getSheetName(this.field_1_index_extern_sheet));
- retval.append('!');
+ if ( refs != null )
+ {
+ retval.append( refs.getSheetName( this.field_1_index_extern_sheet ) );
+ retval.append( '!' );
}
- retval.append((new CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative())).toString());
- retval.append(':');
- retval.append((new CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative())).toString());
+ retval.append( ( new CellReference( getFirstRow(), getFirstColumn(), !isFirstRowRelative(), !isFirstColRelative() ) ).toString() );
+ retval.append( ':' );
+ retval.append( ( new CellReference( getLastRow(), getLastColumn(), !isLastRowRelative(), !isLastColRelative() ) ).toString() );
return retval.toString();
}
- public byte getDefaultOperandClass() {
- return Ptg.CLASS_REF;
- }
+ public byte getDefaultOperandClass()
+ {
+ return Ptg.CLASS_REF;
+ }
+
+ public Object clone()
+ {
+ Area3DPtg ptg = new Area3DPtg();
+ ptg.field_1_index_extern_sheet = field_1_index_extern_sheet;
+ ptg.field_2_first_row = field_2_first_row;
+ ptg.field_3_last_row = field_3_last_row;
+ ptg.field_4_first_column = field_4_first_column;
+ ptg.field_5_last_column = field_5_last_column;
+ return ptg;
+ }
+
+
+ public boolean equals( Object o )
+ {
+ if ( this == o ) return true;
+ if ( !( o instanceof Area3DPtg ) ) return false;
+
+ final Area3DPtg area3DPtg = (Area3DPtg) o;
+
+ if ( field_1_index_extern_sheet != area3DPtg.field_1_index_extern_sheet ) return false;
+ if ( field_2_first_row != area3DPtg.field_2_first_row ) return false;
+ if ( field_3_last_row != area3DPtg.field_3_last_row ) return false;
+ if ( field_4_first_column != area3DPtg.field_4_first_column ) return false;
+ if ( field_5_last_column != area3DPtg.field_5_last_column ) return false;
+
+ return true;
+ }
+
+ public int hashCode()
+ {
+ int result;
+ result = (int) field_1_index_extern_sheet;
+ result = 29 * result + (int) field_2_first_row;
+ result = 29 * result + (int) field_3_last_row;
+ result = 29 * result + (int) field_4_first_column;
+ result = 29 * result + (int) field_5_last_column;
+ return result;
+ }
- public Object clone() {
- Area3DPtg ptg = new Area3DPtg();
- ptg.field_1_index_extern_sheet = field_1_index_extern_sheet;
- ptg.field_2_first_row = field_2_first_row;
- ptg.field_3_last_row = field_3_last_row;
- ptg.field_4_first_column = field_4_first_column;
- ptg.field_5_last_column = field_5_last_column;
- return ptg;
- }
}
import junit.framework.TestCase;
+import org.apache.poi.hssf.record.formula.Area3DPtg;
+
+import java.util.Stack;
/**
* Tests the serialization and deserialization of the LinkedDataRecord
{
/*
- Records that would appear in a simple bar chart
+ The records below are records that would appear in a simple bar chart
The first record links to the series title (linkType = 0). It's
reference type is 1 which means that it links directly to data entered
into the forumula bar. There seems to be no reference to any data
- however. The formulaOfLink field contains two 0 bytes.
+ however. The formulaOfLink field contains two 0 bytes. This probably
+ means that there is no particular heading set.
+
============================================
Offset 0xf9c (3996)
.formulaOfLink = (org.apache.poi.hssf.record.LinkedDataFormulaField@95fd19 )
[/AI]
+
+ The second record links to the series data (linkType=1). The
+ referenceType = 2 which means it's linked to the worksheet.
+ It links using a formula. The formula value is
+ 0B 00 3B 00 00 00 00 1E 00 01 00 01 00.
+
+ 0B 00 11 bytes length
+ 3B (tArea3d) Rectangular area
+ 00 00 index to REF entry in extern sheet
+ 00 00 index to first row
+ 1E 00 index to last row
+ 01 00 index to first column and relative flags
+ 01 00 index to last column and relative flags
+
============================================
Offset 0xfa8 (4008)
rectype = 0x1051, recsize = 0x13
.formulaOfLink = (org.apache.poi.hssf.record.LinkedDataFormulaField@11b9fb1 )
[/AI]
+ The third record links to the series categories (linkType=2). The
+ reference type of 2 means that it's linked to the worksheet.
+ It links using a formula. The formula value is
+ 0B 00 3B 00 00 00 00 1E 00 01 00 01 00
+
+ 0B 00 11 bytes in length
+ 3B (tArea3d) Rectangular area
+ 00 00 index to REF entry in extern sheet
+ 00 00 index to first row
+ 00 1F index to last row
+ 00 00 index to first column and relative flags
+ 00 00 index to last column and relative flags
+
+
============================================
Offset 0xfbf (4031)
rectype = 0x1051, recsize = 0x13
.formulaOfLink = (org.apache.poi.hssf.record.LinkedDataFormulaField@913fe2 )
[/AI]
+This third link type does not seem to be documented and does not appear to
+contain any useful information anyway.
+
============================================
Offset 0xfd6 (4054)
rectype = 0x1051, recsize = 0x8
*/
byte[] data = new byte[]{
- (byte) 0x00,
- (byte) 0x01,
- (byte) 0x00, (byte) 0x00,
- (byte)0x00,(byte)0x00,
- (byte)0x00,(byte)0x00 // not supported
+ (byte)0x01, // link type
+ (byte)0x02, // reference type
+ (byte)0x00,(byte)0x00, // options
+ (byte)0x00,(byte)0x00, // index number format record
+ (byte)0x0B,(byte)0x00, // 11 bytes length
+ (byte)0x3B, // formula of link
+ (byte)0x00,(byte)0x00, // index to ref entry in extern sheet
+ (byte)0x00,(byte)0x00, // index to first row
+ (byte)0x00,(byte)0x1F, // index to last row
+ (byte)0x00,(byte)0x00, // index to first column and relative flags
+ (byte)0x00,(byte)0x00, // index to last column and relative flags
};
public TestLinkedDataRecord(String name)
{
LinkedDataRecord record = new LinkedDataRecord((short)0x1051, (short)data.length, data);
- assertEquals( LinkedDataRecord.LINK_TYPE_TITLE_OR_TEXT, record.getLinkType());
- assertEquals( LinkedDataRecord.REFERENCE_TYPE_DIRECT, record.getReferenceType());
+ assertEquals( LinkedDataRecord.LINK_TYPE_VALUES, record.getLinkType());
+ assertEquals( LinkedDataRecord.REFERENCE_TYPE_WORKSHEET, record.getReferenceType());
assertEquals( 0, record.getOptions());
assertEquals( false, record.isCustomNumberFormat() );
assertEquals( 0, record.getIndexNumberFmtRecord());
+ Area3DPtg ptg = new Area3DPtg();
+ ptg.setExternSheetIndex((short)0);
+ ptg.setFirstColumn((short)0);
+ ptg.setLastColumn((short)0);
+ ptg.setFirstRow((short)0);
+ ptg.setLastRow((short)7936);
+ ptg.setFirstColRelative(false);
+ ptg.setLastColRelative(false);
+ ptg.setFirstRowRelative(false);
+ ptg.setLastRowRelative(false);
+ Stack s = new Stack();
+ s.push(ptg);
+ assertEquals( s, record.getFormulaOfLink().getFormulaTokens() );
- assertEquals( 12, record.getRecordSize() );
+ assertEquals( data.length + 4, record.getRecordSize() );
record.validateSid((short)0x1051);
public void testStore()
{
LinkedDataRecord record = new LinkedDataRecord();
- record.setLinkType( LinkedDataRecord.LINK_TYPE_TITLE_OR_TEXT );
- record.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_DIRECT );
+ record.setLinkType( LinkedDataRecord.LINK_TYPE_VALUES );
+ record.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_WORKSHEET );
record.setOptions( (short)0 );
record.setCustomNumberFormat( false );
record.setIndexNumberFmtRecord( (short)0 );
-
+ Area3DPtg ptg = new Area3DPtg();
+ ptg.setExternSheetIndex((short)0);
+ ptg.setFirstColumn((short)0);
+ ptg.setLastColumn((short)0);
+ ptg.setFirstRow((short)0);
+ ptg.setLastRow((short)7936);
+ ptg.setFirstColRelative(false);
+ ptg.setLastColRelative(false);
+ ptg.setFirstRowRelative(false);
+ ptg.setLastRowRelative(false);
+ Stack s = new Stack();
+ s.push(ptg);
+ LinkedDataFormulaField formulaOfLink = new LinkedDataFormulaField();
+ formulaOfLink.setFormulaTokens(s);
+ record.setFormulaOfLink(formulaOfLink );
byte [] recordBytes = record.serialize();
assertEquals(recordBytes.length - 4, data.length);