true
if the specified column has a page break
*/
public boolean isColumnBroken(short column) {
- return (colBreaks == null) ? false : colBreaks.getBreak(column) != null;
+ return getColumnBreaksRecord().getBreak(column) != null;
}
/**
@@ -2433,7 +2353,7 @@ public final class Sheet implements Model {
* @param count
*/
public void shiftRowBreaks(int startingRow, int endingRow, int count) {
- shiftBreaks(rowBreaks, (short)startingRow, (short)endingRow, (short)count);
+ shiftBreaks(getRowBreaksRecord(), startingRow, endingRow, count);
}
/**
@@ -2443,50 +2363,46 @@ public final class Sheet implements Model {
* @param count
*/
public void shiftColumnBreaks(short startingCol, short endingCol, short count) {
- shiftBreaks(colBreaks, startingCol, endingCol, count);
+ shiftBreaks(getColumnBreaksRecord(), startingCol, endingCol, count);
}
/**
- * Returns all the row page breaks
- * @return all the row page breaks
+ * @return all the horizontal page breaks, never null
*/
- public Iterator getRowBreaks() {
- return rowBreaks.getBreaksIterator();
+ public int[] getRowBreaks() {
+ return getRowBreaksRecord().getBreaks();
}
/**
- * Returns the number of row page breaks
* @return the number of row page breaks
*/
public int getNumRowBreaks(){
- return (rowBreaks == null) ? 0 : (int)rowBreaks.getNumBreaks();
+ return getRowBreaksRecord().getNumBreaks();
}
/**
- * Returns all the column page breaks
- * @return all the column page breaks
+ * @return all the column page breaks, never null
*/
- public Iterator getColumnBreaks(){
- return colBreaks.getBreaksIterator();
+ public int[] getColumnBreaks(){
+ return getColumnBreaksRecord().getBreaks();
}
/**
- * Returns the number of column page breaks
* @return the number of column page breaks
*/
public int getNumColumnBreaks(){
- return (colBreaks == null) ? 0 : (int)colBreaks.getNumBreaks();
+ return getColumnBreaksRecord().getNumBreaks();
}
public void setColumnGroupCollapsed( short columnNumber, boolean collapsed )
{
if (collapsed)
{
- columns.collapseColumn( columnNumber );
+ _columnInfos.collapseColumn( columnNumber );
}
else
{
- columns.expandColumn( columnNumber );
+ _columnInfos.expandColumn( columnNumber );
}
}
@@ -2577,7 +2493,7 @@ public final class Sheet implements Model {
private void recalcRowGutter()
{
int maxLevel = 0;
- Iterator iterator = rows.getIterator();
+ Iterator iterator = _rowsAggregate.getIterator();
while ( iterator.hasNext() )
{
RowRecord rowRecord = (RowRecord) iterator.next();
@@ -2585,11 +2501,7 @@ public final class Sheet implements Model {
}
// Grab the guts record, adding if needed
- GutsRecord guts = (GutsRecord) findFirstRecordBySid( GutsRecord.sid );
- if(guts == null) {
- guts = new GutsRecord();
- records.add(guts);
- }
+ GutsRecord guts = getGutsRecord();
// Set the levels onto it
guts.setRowLevelMax( (short) ( maxLevel + 1 ) );
guts.setLeftRowGutter( (short) ( 29 + (12 * (maxLevel)) ) );
@@ -2599,16 +2511,18 @@ public final class Sheet implements Model {
{
if (collapse)
{
- rows.collapseRow( row );
+ _rowsAggregate.collapseRow( row );
}
else
{
- rows.expandRow( row );
+ _rowsAggregate.expandRow( row );
}
}
public DataValidityTable getOrCreateDataValidityTable() {
if (_dataValidityTable == null) {
- _dataValidityTable = DataValidityTable.createForSheet(records);
+ DataValidityTable result = new DataValidityTable();
+ RecordOrderer.addNewSheetRecord(records, result);
+ _dataValidityTable = result;
}
return _dataValidityTable;
}
diff --git a/src/java/org/apache/poi/hssf/record/AreaFormatRecord.java b/src/java/org/apache/poi/hssf/record/AreaFormatRecord.java
index 6482112e6..843128120 100644
--- a/src/java/org/apache/poi/hssf/record/AreaFormatRecord.java
+++ b/src/java/org/apache/poi/hssf/record/AreaFormatRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,13 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* The area format record is used to define the colours and patterns for an area.
@@ -30,16 +29,16 @@ import org.apache.poi.util.*;
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class AreaFormatRecord
- extends Record
-{
- public final static short sid = 0x100a;
+public final class AreaFormatRecord extends Record {
+ public final static short sid = 0x100A;
+
+ private static final BitField automatic = BitFieldFactory.getInstance(0x1);
+ private static final BitField invert = BitFieldFactory.getInstance(0x2);
+
private int field_1_foregroundColor;
private int field_2_backgroundColor;
private short field_3_pattern;
private short field_4_formatFlags;
- private BitField automatic = BitFieldFactory.getInstance(0x1);
- private BitField invert = BitFieldFactory.getInstance(0x2);
private short field_5_forecolorIndex;
private short field_6_backcolorIndex;
@@ -297,10 +296,4 @@ public class AreaFormatRecord
{
return invert.isSet(field_4_formatFlags);
}
-
-
-} // END OF CLASS
-
-
-
-
+}
diff --git a/src/java/org/apache/poi/hssf/record/AreaRecord.java b/src/java/org/apache/poi/hssf/record/AreaRecord.java
index 32aa57eed..fd6528946 100644
--- a/src/java/org/apache/poi/hssf/record/AreaRecord.java
+++ b/src/java/org/apache/poi/hssf/record/AreaRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,13 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* The area record is used to define a area chart.
@@ -30,14 +29,12 @@ import org.apache.poi.util.*;
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class AreaRecord
- extends Record
-{
+public final class AreaRecord extends Record {
public final static short sid = 0x101A;
private short field_1_formatFlags;
- private BitField stacked = BitFieldFactory.getInstance(0x1);
- private BitField displayAsPercentage = BitFieldFactory.getInstance(0x2);
- private BitField shadow = BitFieldFactory.getInstance(0x4);
+ private static final BitField stacked = BitFieldFactory.getInstance(0x1);
+ private static final BitField displayAsPercentage = BitFieldFactory.getInstance(0x2);
+ private static final BitField shadow = BitFieldFactory.getInstance(0x4);
public AreaRecord()
@@ -197,10 +194,4 @@ public class AreaRecord
{
return shadow.isSet(field_1_formatFlags);
}
-
-
-} // END OF CLASS
-
-
-
-
+}
diff --git a/src/java/org/apache/poi/hssf/record/AxisOptionsRecord.java b/src/java/org/apache/poi/hssf/record/AxisOptionsRecord.java
index be359b80a..8be3f200b 100644
--- a/src/java/org/apache/poi/hssf/record/AxisOptionsRecord.java
+++ b/src/java/org/apache/poi/hssf/record/AxisOptionsRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,13 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* The axis options record provides unit information and other various tidbits about the axis.
@@ -30,27 +29,27 @@ import org.apache.poi.util.*;
* @author Andrew C. Oliver(acoliver at apache.org)
*/
-public class AxisOptionsRecord
- extends Record
-{
- public final static short sid = 0x1062;
- private short field_1_minimumCategory;
- private short field_2_maximumCategory;
- private short field_3_majorUnitValue;
- private short field_4_majorUnit;
- private short field_5_minorUnitValue;
- private short field_6_minorUnit;
- private short field_7_baseUnit;
- private short field_8_crossingPoint;
- private short field_9_options;
- private BitField defaultMinimum = BitFieldFactory.getInstance(0x1);
- private BitField defaultMaximum = BitFieldFactory.getInstance(0x2);
- private BitField defaultMajor = BitFieldFactory.getInstance(0x4);
- private BitField defaultMinorUnit = BitFieldFactory.getInstance(0x8);
- private BitField isDate = BitFieldFactory.getInstance(0x10);
- private BitField defaultBase = BitFieldFactory.getInstance(0x20);
- private BitField defaultCross = BitFieldFactory.getInstance(0x40);
- private BitField defaultDateSettings = BitFieldFactory.getInstance(0x80);
+public final class AxisOptionsRecord extends Record {
+ public final static short sid = 0x1062;
+
+ private static final BitField defaultMinimum = BitFieldFactory.getInstance(0x01);
+ private static final BitField defaultMaximum = BitFieldFactory.getInstance(0x02);
+ private static final BitField defaultMajor = BitFieldFactory.getInstance(0x04);
+ private static final BitField defaultMinorUnit = BitFieldFactory.getInstance(0x08);
+ private static final BitField isDate = BitFieldFactory.getInstance(0x10);
+ private static final BitField defaultBase = BitFieldFactory.getInstance(0x20);
+ private static final BitField defaultCross = BitFieldFactory.getInstance(0x40);
+ private static final BitField defaultDateSettings = BitFieldFactory.getInstance(0x80);
+
+ private short field_1_minimumCategory;
+ private short field_2_maximumCategory;
+ private short field_3_majorUnitValue;
+ private short field_4_majorUnit;
+ private short field_5_minorUnitValue;
+ private short field_6_minorUnit;
+ private short field_7_baseUnit;
+ private short field_8_crossingPoint;
+ private short field_9_options;
public AxisOptionsRecord()
@@ -488,10 +487,4 @@ public class AxisOptionsRecord
{
return defaultDateSettings.isSet(field_9_options);
}
-
-
-} // END OF CLASS
-
-
-
-
+}
diff --git a/src/java/org/apache/poi/hssf/record/BarRecord.java b/src/java/org/apache/poi/hssf/record/BarRecord.java
index 794247e3a..0c88385ba 100644
--- a/src/java/org/apache/poi/hssf/record/BarRecord.java
+++ b/src/java/org/apache/poi/hssf/record/BarRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,13 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* The bar record is used to define a bar chart.
@@ -30,17 +29,17 @@ import org.apache.poi.util.*;
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class BarRecord
- extends Record
-{
- public final static short sid = 0x1017;
+public final class BarRecord extends Record {
+ public final static short sid = 0x1017;
+
+ private static final BitField horizontal = BitFieldFactory.getInstance(0x1);
+ private static final BitField stacked = BitFieldFactory.getInstance(0x2);
+ private static final BitField displayAsPercentage = BitFieldFactory.getInstance(0x4);
+ private static final BitField shadow = BitFieldFactory.getInstance(0x8);
+
private short field_1_barSpace;
private short field_2_categorySpace;
private short field_3_formatFlags;
- private BitField horizontal = BitFieldFactory.getInstance(0x1);
- private BitField stacked = BitFieldFactory.getInstance(0x2);
- private BitField displayAsPercentage = BitFieldFactory.getInstance(0x4);
- private BitField shadow = BitFieldFactory.getInstance(0x8);
public BarRecord()
@@ -264,10 +263,4 @@ public class BarRecord
{
return shadow.isSet(field_3_formatFlags);
}
-
-
-} // END OF CLASS
-
-
-
-
+}
diff --git a/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java b/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java
index 78daff2eb..2ef4c67d2 100644
--- a/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java
+++ b/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,10 +14,10 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
+import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.StringUtil;
@@ -33,12 +32,10 @@ import org.apache.poi.util.StringUtil;
* @author Sergei Kozello (sergeikozello at mail.ru)
* @version 2.0-pre
*/
+public final class BoundSheetRecord extends Record {
+ public final static short sid = 0x0085;
-public class BoundSheetRecord
- extends Record
-{
- private static final short HIDDEN_FLAG_MASK = 0x01;
- public final static short sid = 0x85;
+ private static final BitField hiddenFlag = BitFieldFactory.getInstance(0x01);
private int field_1_position_of_BOF;
private short field_2_option_flags;
private byte field_3_sheetname_length;
@@ -305,10 +302,10 @@ public class BoundSheetRecord
}
public boolean isHidden() {
- return BitFieldFactory.getInstance(HIDDEN_FLAG_MASK).isSet(field_2_option_flags);
+ return hiddenFlag.isSet(field_2_option_flags);
}
public void setHidden(boolean hidden) {
- field_2_option_flags = BitFieldFactory.getInstance(HIDDEN_FLAG_MASK).setShortBoolean(field_2_option_flags, hidden);
+ field_2_option_flags = hiddenFlag.setShortBoolean(field_2_option_flags, hidden);
}
}
diff --git a/src/java/org/apache/poi/hssf/record/CFRuleRecord.java b/src/java/org/apache/poi/hssf/record/CFRuleRecord.java
index d000b5311..06256c5cc 100644
--- a/src/java/org/apache/poi/hssf/record/CFRuleRecord.java
+++ b/src/java/org/apache/poi/hssf/record/CFRuleRecord.java
@@ -31,8 +31,7 @@ import org.apache.poi.util.LittleEndian;
* Conditional Formatting Rule Record.
* @author Dmitriy Kumshayev
*/
-public final class CFRuleRecord extends Record
-{
+public final class CFRuleRecord extends Record {
public static final short sid = 0x01B1;
diff --git a/src/java/org/apache/poi/hssf/record/CategorySeriesAxisRecord.java b/src/java/org/apache/poi/hssf/record/CategorySeriesAxisRecord.java
index 7e38d6f6e..0521ea709 100644
--- a/src/java/org/apache/poi/hssf/record/CategorySeriesAxisRecord.java
+++ b/src/java/org/apache/poi/hssf/record/CategorySeriesAxisRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,13 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* This record refers to a category or series axis and is used to specify label/tickmark frequency.
@@ -30,17 +29,17 @@ import org.apache.poi.util.*;
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class CategorySeriesAxisRecord
- extends Record
-{
- public final static short sid = 0x1020;
+public final class CategorySeriesAxisRecord extends Record {
+ public final static short sid = 0x1020;
+
+ private static final BitField valueAxisCrossing = BitFieldFactory.getInstance(0x1);
+ private static final BitField crossesFarRight = BitFieldFactory.getInstance(0x2);
+ private static final BitField reversed = BitFieldFactory.getInstance(0x4);
+
private short field_1_crossingPoint;
private short field_2_labelFrequency;
private short field_3_tickMarkFrequency;
private short field_4_options;
- private BitField valueAxisCrossing = BitFieldFactory.getInstance(0x1);
- private BitField crossesFarRight = BitFieldFactory.getInstance(0x2);
- private BitField reversed = BitFieldFactory.getInstance(0x4);
public CategorySeriesAxisRecord()
@@ -268,10 +267,4 @@ public class CategorySeriesAxisRecord
{
return reversed.isSet(field_4_options);
}
-
-
-} // END OF CLASS
-
-
-
-
+}
diff --git a/src/java/org/apache/poi/hssf/record/ChartFormatRecord.java b/src/java/org/apache/poi/hssf/record/ChartFormatRecord.java
index 7a3691490..f5fd1d953 100644
--- a/src/java/org/apache/poi/hssf/record/ChartFormatRecord.java
+++ b/src/java/org/apache/poi/hssf/record/ChartFormatRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,12 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.LittleEndian;
/**
* Class ChartFormatRecord
@@ -30,19 +28,17 @@ import org.apache.poi.util.BitFieldFactory;
* @author Glen Stampoultzis (glens at apache.org)
* @version %I%, %G%
*/
-
-public class ChartFormatRecord
- extends Record
-{
+public final class ChartFormatRecord extends Record {
public static final short sid = 0x1014;
+ private static final BitField varyDisplayPattern = BitFieldFactory.getInstance(0x01);
+
// ignored?
private int field1_x_position; // lower left
private int field2_y_position; // lower left
private int field3_width;
private int field4_height;
private short field5_grbit;
- private BitField varyDisplayPattern = BitFieldFactory.getInstance(0x01);
public ChartFormatRecord()
{
diff --git a/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java b/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java
index c4768ab0c..dd29f0d65 100644
--- a/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java
+++ b/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,63 +14,64 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* The common object data record is used to store all common preferences for an excel object.
* NOTE: This source is automatically generated please do not modify this file. Either subclass or
* remove the record in src/records/definitions.
-
+ *
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class CommonObjectDataSubRecord
- extends SubRecord
-{
- public final static short sid = 0x15;
+public final class CommonObjectDataSubRecord extends SubRecord {
+ public final static short sid = 0x0015;
+
+ private static final BitField locked = BitFieldFactory.getInstance(0x0001);
+ private static final BitField printable = BitFieldFactory.getInstance(0x0010);
+ private static final BitField autofill = BitFieldFactory.getInstance(0x2000);
+ private static final BitField autoline = BitFieldFactory.getInstance(0x4000);
+
+ public final static short OBJECT_TYPE_GROUP = 0;
+ public final static short OBJECT_TYPE_LINE = 1;
+ public final static short OBJECT_TYPE_RECTANGLE = 2;
+ public final static short OBJECT_TYPE_OVAL = 3;
+ public final static short OBJECT_TYPE_ARC = 4;
+ public final static short OBJECT_TYPE_CHART = 5;
+ public final static short OBJECT_TYPE_TEXT = 6;
+ public final static short OBJECT_TYPE_BUTTON = 7;
+ public final static short OBJECT_TYPE_PICTURE = 8;
+ public final static short OBJECT_TYPE_POLYGON = 9;
+ public final static short OBJECT_TYPE_RESERVED1 = 10;
+ public final static short OBJECT_TYPE_CHECKBOX = 11;
+ public final static short OBJECT_TYPE_OPTION_BUTTON = 12;
+ public final static short OBJECT_TYPE_EDIT_BOX = 13;
+ public final static short OBJECT_TYPE_LABEL = 14;
+ public final static short OBJECT_TYPE_DIALOG_BOX = 15;
+ public final static short OBJECT_TYPE_SPINNER = 16;
+ public final static short OBJECT_TYPE_SCROLL_BAR = 17;
+ public final static short OBJECT_TYPE_LIST_BOX = 18;
+ public final static short OBJECT_TYPE_GROUP_BOX = 19;
+ public final static short OBJECT_TYPE_COMBO_BOX = 20;
+ public final static short OBJECT_TYPE_RESERVED2 = 21;
+ public final static short OBJECT_TYPE_RESERVED3 = 22;
+ public final static short OBJECT_TYPE_RESERVED4 = 23;
+ public final static short OBJECT_TYPE_RESERVED5 = 24;
+ public final static short OBJECT_TYPE_COMMENT = 25;
+ public final static short OBJECT_TYPE_RESERVED6 = 26;
+ public final static short OBJECT_TYPE_RESERVED7 = 27;
+ public final static short OBJECT_TYPE_RESERVED8 = 28;
+ public final static short OBJECT_TYPE_RESERVED9 = 29;
+ public final static short OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING = 30;
+
private short field_1_objectType;
- public final static short OBJECT_TYPE_GROUP = 0;
- public final static short OBJECT_TYPE_LINE = 1;
- public final static short OBJECT_TYPE_RECTANGLE = 2;
- public final static short OBJECT_TYPE_OVAL = 3;
- public final static short OBJECT_TYPE_ARC = 4;
- public final static short OBJECT_TYPE_CHART = 5;
- public final static short OBJECT_TYPE_TEXT = 6;
- public final static short OBJECT_TYPE_BUTTON = 7;
- public final static short OBJECT_TYPE_PICTURE = 8;
- public final static short OBJECT_TYPE_POLYGON = 9;
- public final static short OBJECT_TYPE_RESERVED1 = 10;
- public final static short OBJECT_TYPE_CHECKBOX = 11;
- public final static short OBJECT_TYPE_OPTION_BUTTON = 12;
- public final static short OBJECT_TYPE_EDIT_BOX = 13;
- public final static short OBJECT_TYPE_LABEL = 14;
- public final static short OBJECT_TYPE_DIALOG_BOX = 15;
- public final static short OBJECT_TYPE_SPINNER = 16;
- public final static short OBJECT_TYPE_SCROLL_BAR = 17;
- public final static short OBJECT_TYPE_LIST_BOX = 18;
- public final static short OBJECT_TYPE_GROUP_BOX = 19;
- public final static short OBJECT_TYPE_COMBO_BOX = 20;
- public final static short OBJECT_TYPE_RESERVED2 = 21;
- public final static short OBJECT_TYPE_RESERVED3 = 22;
- public final static short OBJECT_TYPE_RESERVED4 = 23;
- public final static short OBJECT_TYPE_RESERVED5 = 24;
- public final static short OBJECT_TYPE_COMMENT = 25;
- public final static short OBJECT_TYPE_RESERVED6 = 26;
- public final static short OBJECT_TYPE_RESERVED7 = 27;
- public final static short OBJECT_TYPE_RESERVED8 = 28;
- public final static short OBJECT_TYPE_RESERVED9 = 29;
- public final static short OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING = 30;
private short field_2_objectId;
private short field_3_option;
- private BitField locked = BitFieldFactory.getInstance(0x1);
- private BitField printable = BitFieldFactory.getInstance(0x10);
- private BitField autofill = BitFieldFactory.getInstance(0x2000);
- private BitField autoline = BitFieldFactory.getInstance(0x4000);
private int field_4_reserved1;
private int field_5_reserved2;
private int field_6_reserved3;
@@ -431,8 +431,4 @@ public class CommonObjectDataSubRecord
{
return autoline.isSet(field_3_option);
}
-
-
-} // END OF CLASS
-
-
+}
diff --git a/src/java/org/apache/poi/hssf/record/DatRecord.java b/src/java/org/apache/poi/hssf/record/DatRecord.java
index 104599691..476b13291 100644
--- a/src/java/org/apache/poi/hssf/record/DatRecord.java
+++ b/src/java/org/apache/poi/hssf/record/DatRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,13 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* The dat record is used to store options for the chart.
@@ -30,15 +29,15 @@ import org.apache.poi.util.*;
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class DatRecord
- extends Record
-{
- public final static short sid = 0x1063;
+public final class DatRecord extends Record {
+ public final static short sid = 0x1063;
+
+ private static final BitField horizontalBorder = BitFieldFactory.getInstance(0x1);
+ private static final BitField verticalBorder = BitFieldFactory.getInstance(0x2);
+ private static final BitField border = BitFieldFactory.getInstance(0x4);
+ private static final BitField showSeriesKey = BitFieldFactory.getInstance(0x8);
+
private short field_1_options;
- private BitField horizontalBorder = BitFieldFactory.getInstance(0x1);
- private BitField verticalBorder = BitFieldFactory.getInstance(0x2);
- private BitField border = BitFieldFactory.getInstance(0x4);
- private BitField showSeriesKey = BitFieldFactory.getInstance(0x8);
public DatRecord()
@@ -216,10 +215,4 @@ public class DatRecord
{
return showSeriesKey.isSet(field_1_options);
}
-
-
-} // END OF CLASS
-
-
-
-
+}
diff --git a/src/java/org/apache/poi/hssf/record/DataFormatRecord.java b/src/java/org/apache/poi/hssf/record/DataFormatRecord.java
index 027e0c1af..f86834daa 100644
--- a/src/java/org/apache/poi/hssf/record/DataFormatRecord.java
+++ b/src/java/org/apache/poi/hssf/record/DataFormatRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,30 +14,30 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* The data format record is used to index into a series.
* NOTE: This source is automatically generated please do not modify this file. Either subclass or
* remove the record in src/records/definitions.
-
+ *
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class DataFormatRecord
- extends Record
-{
- public final static short sid = 0x1006;
- private short field_1_pointNumber;
- private short field_2_seriesIndex;
- private short field_3_seriesNumber;
- private short field_4_formatFlags;
- private BitField useExcel4Colors = BitFieldFactory.getInstance(0x1);
+public final class DataFormatRecord extends Record {
+ public final static short sid = 0x1006;
+
+ private static final BitField useExcel4Colors = BitFieldFactory.getInstance(0x1);
+
+ private short field_1_pointNumber;
+ private short field_2_seriesIndex;
+ private short field_3_seriesNumber;
+ private short field_4_formatFlags;
public DataFormatRecord()
@@ -228,10 +227,4 @@ public class DataFormatRecord
{
return useExcel4Colors.isSet(field_4_formatFlags);
}
-
-
-} // END OF CLASS
-
-
-
-
+}
diff --git a/src/java/org/apache/poi/hssf/record/FormulaRecord.java b/src/java/org/apache/poi/hssf/record/FormulaRecord.java
index 1583aa039..1aaa155a2 100644
--- a/src/java/org/apache/poi/hssf/record/FormulaRecord.java
+++ b/src/java/org/apache/poi/hssf/record/FormulaRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,7 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
-/*
- * FormulaRecord.java
- *
- * Created on October 28, 2001, 5:44 PM
- */
package org.apache.poi.hssf.record;
import java.util.List;
@@ -39,24 +32,22 @@ import org.apache.poi.util.LittleEndian;
* @author Jason Height (jheight at chariot dot net dot au)
* @version 2.0-pre
*/
-
public final class FormulaRecord
extends Record
implements CellValueRecordInterface, Comparable
{
- public static final short sid =
- 0x06; // docs say 406...because of a bug Microsoft support site article #Q184647)
-
- //private short field_1_row;
+ public static final short sid = 0x0006; // docs say 406...because of a bug Microsoft support site article #Q184647)
+
+ private static final BitField alwaysCalc = BitFieldFactory.getInstance(0x0001);
+ private static final BitField calcOnLoad = BitFieldFactory.getInstance(0x0002);
+ private static final BitField sharedFormula = BitFieldFactory.getInstance(0x0008);
+
private int field_1_row;
private short field_2_column;
private short field_3_xf;
private double field_4_value;
private short field_5_options;
- private BitField alwaysCalc = BitFieldFactory.getInstance(0x0001);
- private BitField calcOnLoad = BitFieldFactory.getInstance(0x0002);
- private BitField sharedFormula = BitFieldFactory.getInstance(0x0008);
private int field_6_zero;
private short field_7_expression_len;
private Stack field_8_parsed_expr;
diff --git a/src/java/org/apache/poi/hssf/record/FrameRecord.java b/src/java/org/apache/poi/hssf/record/FrameRecord.java
index 19ef9e0c6..e4a2bf6c3 100644
--- a/src/java/org/apache/poi/hssf/record/FrameRecord.java
+++ b/src/java/org/apache/poi/hssf/record/FrameRecord.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +14,13 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-
-
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndian;
/**
* The frame record indicates whether there is a border around the displayed text of a chart.
@@ -30,16 +29,16 @@ import org.apache.poi.util.*;
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class FrameRecord
- extends Record
-{
- public final static short sid = 0x1032;
+public final class FrameRecord extends Record {
+ public final static short sid = 0x1032;
+
+ private static final BitField autoSize = BitFieldFactory.getInstance(0x1);
+ private static final BitField autoPosition = BitFieldFactory.getInstance(0x2);
+
private short field_1_borderType;
public final static short BORDER_TYPE_REGULAR = 0;
public final static short BORDER_TYPE_SHADOW = 1;
private short field_2_options;
- private BitField autoSize = BitFieldFactory.getInstance(0x1);
- private BitField autoPosition = BitFieldFactory.getInstance(0x2);
public FrameRecord()
@@ -211,10 +210,4 @@ public class FrameRecord
{
return autoPosition.isSet(field_2_options);
}
-
-
-} // END OF CLASS
-
-
-
-
+}
\ No newline at end of file
diff --git a/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java b/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java
index 05b642a44..a6846300c 100644
--- a/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java
+++ b/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java
@@ -1,60 +1,67 @@
-
/* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ==================================================================== */
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-==================================================================== */
-
package org.apache.poi.hssf.record;
-/**
- * HorizontalPageBreak record that stores page breaks at rows
- * - * This class is just used so that SID compares work properly in the RecordFactory - * @see PageBreakRecord - * @author Danny Mui (dmui at apache dot org) - */ -public class HorizontalPageBreakRecord extends PageBreakRecord { +import java.util.Iterator; + +/** + * HorizontalPageBreak (0x001B) record that stores page breaks at rows
+ * + * @see PageBreakRecord + * @author Danny Mui (dmui at apache dot org) + */ +public final class HorizontalPageBreakRecord extends PageBreakRecord { + + public static final short sid = 0x001B; - public static final short sid = PageBreakRecord.HORIZONTAL_SID; - /** - * + * Creates an empty horizontal page break record */ public HorizontalPageBreakRecord() { - super(); + // } /** - * @param sid - */ - public HorizontalPageBreakRecord(short sid) { - super(sid); - } - - /** - * @param in the RecordInputstream to read the record from + * @param in + * the RecordInputstream to read the record from */ public HorizontalPageBreakRecord(RecordInputStream in) { super(in); } - /* (non-Javadoc) - * @see org.apache.poi.hssf.record.Record#getSid() - */ + protected void validateSid(short id) { + if (id != getSid()) { + throw new RecordFormatException( + "NOT A HorizontalPageBreak or VerticalPageBreak RECORD!! " + id); + } + } + public short getSid() { return sid; } + public Object clone() { + PageBreakRecord result = new HorizontalPageBreakRecord(); + Iterator iterator = getBreaksIterator(); + while (iterator.hasNext()) { + Break original = (Break) iterator.next(); + result.addBreak(original.main, original.subFrom, original.subTo); + } + return result; + } } diff --git a/src/java/org/apache/poi/hssf/record/LegendRecord.java b/src/java/org/apache/poi/hssf/record/LegendRecord.java index 40ddb887c..e9c529ea3 100644 --- a/src/java/org/apache/poi/hssf/record/LegendRecord.java +++ b/src/java/org/apache/poi/hssf/record/LegendRecord.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.hssf.record; - - -import org.apache.poi.util.*; +import org.apache.poi.util.BitField; +import org.apache.poi.util.BitFieldFactory; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.LittleEndian; /** * Defines a legend for a chart. @@ -30,10 +29,16 @@ import org.apache.poi.util.*; * @author Andrew C. Oliver (acoliver at apache.org) */ -public class LegendRecord - extends Record -{ - public final static short sid = 0x1015; +public final class LegendRecord extends Record { + public final static short sid = 0x1015; + + private static final BitField autoPosition = BitFieldFactory.getInstance(0x01); + private static final BitField autoSeries = BitFieldFactory.getInstance(0x02); + private static final BitField autoXPositioning = BitFieldFactory.getInstance(0x04); + private static final BitField autoYPositioning = BitFieldFactory.getInstance(0x08); + private static final BitField vertical = BitFieldFactory.getInstance(0x10); + private static final BitField dataTable = BitFieldFactory.getInstance(0x20); + private int field_1_xAxisUpperLeft; private int field_2_yAxisUpperLeft; private int field_3_xSize; @@ -50,12 +55,6 @@ public class LegendRecord public final static byte SPACING_MEDIUM = 1; public final static byte SPACING_OPEN = 2; private short field_7_options; - private BitField autoPosition = BitFieldFactory.getInstance(0x1); - private BitField autoSeries = BitFieldFactory.getInstance(0x2); - private BitField autoXPositioning = BitFieldFactory.getInstance(0x4); - private BitField autoYPositioning = BitFieldFactory.getInstance(0x8); - private BitField vertical = BitFieldFactory.getInstance(0x10); - private BitField dataTable = BitFieldFactory.getInstance(0x20); public LegendRecord() @@ -437,10 +436,4 @@ public class LegendRecord { return dataTable.isSet(field_7_options); } - - -} // END OF CLASS - - - - +} diff --git a/src/java/org/apache/poi/hssf/record/LineFormatRecord.java b/src/java/org/apache/poi/hssf/record/LineFormatRecord.java index 5e359ab82..8caa8e4a4 100644 --- a/src/java/org/apache/poi/hssf/record/LineFormatRecord.java +++ b/src/java/org/apache/poi/hssf/record/LineFormatRecord.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.hssf.record; - - -import org.apache.poi.util.*; +import org.apache.poi.util.BitField; +import org.apache.poi.util.BitFieldFactory; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.LittleEndian; /** * Describes a line format record. The line format record controls how a line on a chart appears. @@ -30,10 +29,13 @@ import org.apache.poi.util.*; * @author Glen Stampoultzis (glens at apache.org) */ -public class LineFormatRecord - extends Record -{ - public final static short sid = 0x1007; +public final class LineFormatRecord extends Record { + public final static short sid = 0x1007; + + private static final BitField auto = BitFieldFactory.getInstance(0x1); + private static final BitField drawTicks = BitFieldFactory.getInstance(0x4); + private static final BitField unknown = BitFieldFactory.getInstance(0x4); + private int field_1_lineColor; private short field_2_linePattern; public final static short LINE_PATTERN_SOLID = 0; @@ -51,9 +53,6 @@ public class LineFormatRecord public final static short WEIGHT_MEDIUM = 1; public final static short WEIGHT_WIDE = 2; private short field_4_format; - private BitField auto = BitFieldFactory.getInstance(0x1); - private BitField drawTicks = BitFieldFactory.getInstance(0x4); - private BitField unknown = BitFieldFactory.getInstance(0x4); private short field_5_colourPaletteIndex; @@ -342,10 +341,4 @@ public class LineFormatRecord { return unknown.isSet(field_4_format); } - - -} // END OF CLASS - - - - +} diff --git a/src/java/org/apache/poi/hssf/record/LinkedDataRecord.java b/src/java/org/apache/poi/hssf/record/LinkedDataRecord.java index 46d52bf09..093c1a86c 100644 --- a/src/java/org/apache/poi/hssf/record/LinkedDataRecord.java +++ b/src/java/org/apache/poi/hssf/record/LinkedDataRecord.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.hssf.record; - - -import org.apache.poi.util.*; +import org.apache.poi.util.BitField; +import org.apache.poi.util.BitFieldFactory; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.LittleEndian; /** * Describes a linked data record. This record referes to the series data or text. @@ -30,10 +29,11 @@ import org.apache.poi.util.*; * @author Glen Stampoultzis (glens at apache.org) */ -public class LinkedDataRecord - extends Record -{ - public final static short sid = 0x1051; +public final class LinkedDataRecord extends Record { + public final static short sid = 0x1051; + + private static final BitField customNumberFormat= BitFieldFactory.getInstance(0x1); + private byte field_1_linkType; public final static byte LINK_TYPE_TITLE_OR_TEXT = 0; public final static byte LINK_TYPE_VALUES = 1; @@ -45,7 +45,6 @@ public class LinkedDataRecord public final static byte REFERENCE_TYPE_NOT_USED = 3; public final static byte REFERENCE_TYPE_ERROR_REPORTED = 4; private short field_3_options; - private BitField customNumberFormat = BitFieldFactory.getInstance(0x1); private short field_4_indexNumberFmtRecord; private LinkedDataFormulaField field_5_formulaOfLink; @@ -86,7 +85,7 @@ public class LinkedDataRecord field_2_referenceType = in.readByte(); field_3_options = in.readShort(); field_4_indexNumberFmtRecord = in.readShort(); - field_5_formulaOfLink = new org.apache.poi.hssf.record.LinkedDataFormulaField(); + field_5_formulaOfLink = new LinkedDataFormulaField(); field_5_formulaOfLink.fillField(in); } @@ -156,7 +155,7 @@ public class LinkedDataRecord rec.field_2_referenceType = field_2_referenceType; rec.field_3_options = field_3_options; rec.field_4_indexNumberFmtRecord = field_4_indexNumberFmtRecord; - rec.field_5_formulaOfLink = ((org.apache.poi.hssf.record.LinkedDataFormulaField)field_5_formulaOfLink.clone());; + rec.field_5_formulaOfLink = ((LinkedDataFormulaField)field_5_formulaOfLink.clone());; return rec; } @@ -286,10 +285,4 @@ public class LinkedDataRecord { return customNumberFormat.isSet(field_3_options); } - - -} // END OF CLASS - - - - +} diff --git a/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java b/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java index 2e0a417e0..525749dff 100644 --- a/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java +++ b/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java @@ -32,68 +32,51 @@ import org.apache.poi.util.LittleEndian; */ public final class MergeCellsRecord extends Record { public final static short sid = 0x00E5; - private CellRangeAddressList _regions; + /** sometimes the regions array is shared with other MergedCellsRecords */ + private CellRangeAddress[] _regions; + private final int _startIndex; + private final int _numberOfRegions; - /** - * Creates an empty MergedCellsRecord - */ - public MergeCellsRecord() { - _regions = new CellRangeAddressList(); + public MergeCellsRecord(CellRangeAddress[] regions, int startIndex, int numberOfRegions) { + _regions = regions; + _startIndex = startIndex; + _numberOfRegions = numberOfRegions; } - /** * Constructs a MergedCellsRecord and sets its fields appropriately * @param in the RecordInputstream to read the record from */ public MergeCellsRecord(RecordInputStream in) { - super(in); + int nRegions = in.readUShort(); + CellRangeAddress[] cras = new CellRangeAddress[nRegions]; + for (int i = 0; i < nRegions; i++) { + cras[i] = new org.apache.poi.hssf.util.CellRangeAddress(in); + } + _numberOfRegions = nRegions; + _startIndex = 0; + _regions = cras; } - protected void fillFields(RecordInputStream in) { - _regions = new org.apache.poi.hssf.util.CellRangeAddressList(in); + throw new RuntimeException("obsolete"); } - /** * get the number of merged areas. If this drops down to 0 you should just go * ahead and delete the record. * @return number of areas */ public short getNumAreas() { - return (short)_regions.countRanges(); - } - - /** - * Add an area to consider a merged cell. The index returned is only gauranteed to - * be correct provided you do not add ahead of or remove ahead of it (in which case - * you should increment or decrement appropriately....in other words its an arrayList) - * - * @param firstRow - the upper left hand corner's row - * @param firstCol - the upper left hand corner's col - * @param lastRow - the lower right hand corner's row - * @param lastCol - the lower right hand corner's col - * @return new index of said area (don't depend on it if you add/remove) - */ - public void addArea(int firstRow, int firstCol, int lastRow, int lastCol) { - _regions.addCellRangeAddress(firstRow, firstCol, lastRow, lastCol); - } - - /** - * essentially unmerge the cells in the "area" stored at the passed in index - * @param areaIndex - */ - public void removeAreaAt(int areaIndex) { - _regions.remove(areaIndex); + return (short)_numberOfRegions; } /** * @return MergedRegion at the given index representing the area that is Merged (r1,c1 - r2,c2) */ public CellRangeAddress getAreaAt(int index) { - return _regions.getCellRangeAddress(index); + return _regions[_startIndex + index]; } public int getRecordSize() { - return 4 + _regions.getSize(); + return 4 + CellRangeAddressList.getEncodedSize(_numberOfRegions); } public short getSid() { @@ -101,11 +84,16 @@ public final class MergeCellsRecord extends Record { } public int serialize(int offset, byte [] data) { - int dataSize = _regions.getSize(); + int dataSize = CellRangeAddressList.getEncodedSize(_numberOfRegions); - LittleEndian.putShort(data, offset + 0, sid); + LittleEndian.putUShort(data, offset + 0, sid); LittleEndian.putUShort(data, offset + 2, dataSize); - _regions.serialize(offset + 4, data); + int nItems = _numberOfRegions; + LittleEndian.putUShort(data, offset + 4, nItems); + int pos = 6; + for (int i = 0; i < _numberOfRegions; i++) { + pos += _regions[_startIndex + i].serialize(offset+pos, data); + } return 4 + dataSize; } @@ -113,17 +101,16 @@ public final class MergeCellsRecord extends Record { StringBuffer retval = new StringBuffer(); retval.append("[MERGEDCELLS]").append("\n"); - retval.append(" .sid =").append(sid).append("\n"); retval.append(" .numregions =").append(getNumAreas()) .append("\n"); - for (int k = 0; k < _regions.countRanges(); k++) { - CellRangeAddress region = _regions.getCellRangeAddress(k); + for (int k = 0; k < _numberOfRegions; k++) { + CellRangeAddress region = _regions[_startIndex + k]; retval.append(" .rowfrom =").append(region.getFirstRow()) .append("\n"); - retval.append(" .colfrom =").append(region.getFirstColumn()) - .append("\n"); retval.append(" .rowto =").append(region.getLastRow()) + .append("\n"); + retval.append(" .colfrom =").append(region.getFirstColumn()) .append("\n"); retval.append(" .colto =").append(region.getLastColumn()) .append("\n"); @@ -140,13 +127,11 @@ public final class MergeCellsRecord extends Record { } public Object clone() { - MergeCellsRecord rec = new MergeCellsRecord(); - for (int k = 0; k < _regions.countRanges(); k++) { - CellRangeAddress oldRegion = _regions.getCellRangeAddress(k); - rec.addArea(oldRegion.getFirstRow(), oldRegion.getFirstColumn(), - oldRegion.getLastRow(), oldRegion.getLastColumn()); - } - - return rec; + int nRegions = _numberOfRegions; + CellRangeAddress[] clonedRegions = new CellRangeAddress[nRegions]; + for (int i = 0; i < clonedRegions.length; i++) { + clonedRegions[i] = _regions[_startIndex + i].copy(); + } + return new MergeCellsRecord(clonedRegions, 0, nRegions); } } diff --git a/src/java/org/apache/poi/hssf/record/PageBreakRecord.java b/src/java/org/apache/poi/hssf/record/PageBreakRecord.java index 83eade95d..f11e3395c 100644 --- a/src/java/org/apache/poi/hssf/record/PageBreakRecord.java +++ b/src/java/org/apache/poi/hssf/record/PageBreakRecord.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,11 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hssf.record; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -29,140 +27,128 @@ import org.apache.poi.util.LittleEndian; /** *Record that contains the functionality page breaks (horizontal and vertical)
- * + * *The other two classes just specifically set the SIDS for record creation.
- * + * *REFERENCE: Microsoft Excel SDK page 322 and 420
- * + * * @see HorizontalPageBreakRecord * @see VerticalPageBreakRecord * @author Danny Mui (dmui at apache dot org) */ -public class PageBreakRecord extends Record { - public static final short HORIZONTAL_SID = (short)0x1B; - public static final short VERTICAL_SID = (short)0x1A; - public short sid; - private short numBreaks; - private List breaks; - private Map BreakMap; - +public abstract class PageBreakRecord extends Record { + private static final boolean IS_EMPTY_RECORD_WRITTEN = false; + private static final int[] EMPTY_INT_ARRAY = { }; + + private List _breaks; + private Map _breakMap; + /** - * Since both records store 2byte integers (short), no point in + * Since both records store 2byte integers (short), no point in * differentiating it in the records. *
* The subs (rows or columns, don't seem to be able to set but excel sets
* them automatically)
*/
- public class Break
- {
+ public class Break {
- public short main;
- public short subFrom;
- public short subTo;
+ public static final int ENCODED_SIZE = 6;
+ public int main;
+ public int subFrom;
+ public int subTo;
- public Break(short main, short subFrom, short subTo)
+ public Break(int main, int subFrom, int subTo)
{
this.main = main;
this.subFrom = subFrom;
this.subTo = subTo;
}
+
+ public Break(RecordInputStream in) {
+ main = in.readUShort() - 1;
+ subFrom = in.readUShort();
+ subTo = in.readUShort();
+ }
+
+ public int serialize(int offset, byte[] data) {
+ LittleEndian.putUShort(data, offset + 0, main + 1);
+ LittleEndian.putUShort(data, offset + 2, subFrom);
+ LittleEndian.putUShort(data, offset + 4, subTo);
+ return ENCODED_SIZE;
+ }
}
- public PageBreakRecord()
- {
-
+ protected PageBreakRecord() {
+ _breaks = new ArrayList();
+ _breakMap = new HashMap();
}
- /**
- *
- * @param sid
- */
- public PageBreakRecord(short sid) {
- super();
- this.sid = sid;
- }
-
- public PageBreakRecord(RecordInputStream in)
- {
+ protected PageBreakRecord(RecordInputStream in) {
super(in);
- this.sid = in.getSid();
}
protected void fillFields(RecordInputStream in)
{
- short loadedBreaks = in.readShort();
- setNumBreaks(loadedBreaks);
- for(int k = 0; k < loadedBreaks; k++)
- {
- addBreak((short)(in.readShort()-1), in.readShort(), in.readShort());
+ int nBreaks = in.readShort();
+ _breaks = new ArrayList(nBreaks + 2);
+ _breakMap = new HashMap();
+
+ for(int k = 0; k < nBreaks; k++) {
+ Break br = new Break(in);
+ _breaks.add(br);
+ _breakMap.put(new Integer(br.main), br);
}
}
- public short getSid()
- {
- return sid;
+ private int getDataSize() {
+ return 2 + _breaks.size() * Break.ENCODED_SIZE;
+ }
+ public int getRecordSize() {
+ int nBreaks = _breaks.size();
+ if (!IS_EMPTY_RECORD_WRITTEN && nBreaks < 1) {
+ return 0;
+ }
+ return 4 + getDataSize();
}
- public int serialize(int offset, byte data[])
- {
- int recordsize = getRecordSize();
+
+ public final int serialize(int offset, byte data[]) {
+ int nBreaks = _breaks.size();
+ if (!IS_EMPTY_RECORD_WRITTEN && nBreaks < 1) {
+ return 0;
+ }
+ int dataSize = getDataSize();
+ LittleEndian.putUShort(data, offset + 0, getSid());
+ LittleEndian.putUShort(data, offset + 2, dataSize);
+ LittleEndian.putUShort(data, offset + 4, nBreaks);
int pos = 6;
- LittleEndian.putShort(data, offset + 0, getSid());
- LittleEndian.putShort(data, offset + 2, (short)(recordsize - 4));
- LittleEndian.putShort(data, offset + 4, getNumBreaks());
- for(Iterator iterator = getBreaksIterator(); iterator.hasNext();)
- {
- Break Break = (Break)iterator.next();
- LittleEndian.putShort(data, offset + pos, (short)(Break.main + 1));
- pos += 2;
- LittleEndian.putShort(data, offset + pos, Break.subFrom);
- pos += 2;
- LittleEndian.putShort(data, offset + pos, Break.subTo);
- pos += 2;
+ for (int i=0; i
- * This class is just used so that SID compares work properly in the RecordFactory
+ * VerticalPageBreak (0x001A) record that stores page breaks at columns
* Description: Defined a area in Extern Sheet.
@@ -38,14 +37,16 @@ import org.apache.poi.util.LittleEndian;
public final class Area3DPtg extends OperandPtg implements AreaI {
public final static byte sid = 0x3b;
private final static int SIZE = 11; // 10 + 1 for Ptg
+
+ private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000);
+ private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
+
private short field_1_index_extern_sheet;
private int field_2_first_row;
private int field_3_last_row;
private int field_4_first_column;
private int field_5_last_column;
- private BitField rowRelative = BitFieldFactory.getInstance( 0x8000 );
- private BitField colRelative = BitFieldFactory.getInstance( 0x4000 );
/** Creates new AreaPtg */
public Area3DPtg()
diff --git a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
index 52a5518e4..6b48036fe 100644
--- a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
@@ -36,6 +36,10 @@ import org.apache.poi.util.LittleEndian;
*/
public final class Ref3DPtg extends OperandPtg {
public final static byte sid = 0x3a;
+
+ private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000);
+ private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
+
private final static int SIZE = 7; // 6 + 1 for Ptg
private short field_1_index_extern_sheet;
/** The row index - zero based unsigned 16 bit value */
@@ -46,8 +50,6 @@ public final class Ref3DPtg extends OperandPtg {
* - bit 15 - isColumnRelative
*/
private int field_3_column;
- private BitField rowRelative = BitFieldFactory.getInstance(0x8000);
- private BitField colRelative = BitFieldFactory.getInstance(0x4000);
/** Creates new AreaPtg */
public Ref3DPtg() {}
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
index f110d71f9..9abcebcd7 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
@@ -48,6 +48,7 @@ import org.apache.poi.hssf.record.NoteRecord;
import org.apache.poi.hssf.record.NumberRecord;
import org.apache.poi.hssf.record.ObjRecord;
import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RecordBase;
import org.apache.poi.hssf.record.StringRecord;
import org.apache.poi.hssf.record.SubRecord;
import org.apache.poi.hssf.record.TextObjectRecord;
@@ -1154,7 +1155,7 @@ public class HSSFCell implements Cell
HSSFComment comment = null;
HashMap txshapes = new HashMap(); //map shapeId and TextObjectRecord
for (Iterator it = sheet.getRecords().iterator(); it.hasNext(); ) {
- Record rec = ( Record ) it.next();
+ RecordBase rec = (RecordBase) it.next();
if (rec instanceof NoteRecord){
NoteRecord note = (NoteRecord)rec;
if (note.getRow() == row && note.getColumn() == column){
@@ -1196,7 +1197,7 @@ public class HSSFCell implements Cell
*/
public HSSFHyperlink getHyperlink(){
for (Iterator it = sheet.getRecords().iterator(); it.hasNext(); ) {
- Record rec = ( Record ) it.next();
+ RecordBase rec = (RecordBase) it.next();
if (rec instanceof HyperlinkRecord){
HyperlinkRecord link = (HyperlinkRecord)rec;
if(link.getFirstColumn() == record.getColumn() && link.getFirstRow() == record.getRow()){
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
index dcf68b9cf..7dd85e364 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
@@ -1464,43 +1464,19 @@ public class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet
}
/**
- * Retrieves all the horizontal page breaks
- * @return all the horizontal page breaks, or null if there are no row page breaks
+ * @return row indexes of all the horizontal page breaks, never
- * NOTE: Does not yet work... checking it in just so others
- * can take a look.
- */
- public void createBarChart( HSSFWorkbook workbook, HSSFSheet sheet )
- {
-
- List records = new ArrayList();
- records.add( createMSDrawingObjectRecord() );
- records.add( createOBJRecord() );
- records.add( createBOFRecord() );
- records.add( createHeaderRecord() );
- records.add( createFooterRecord() );
- records.add( createHCenterRecord() );
- records.add( createVCenterRecord() );
- records.add( createPrintSetupRecord() );
- // unknown 33
- records.add( createFontBasisRecord1() );
- records.add( createFontBasisRecord2() );
- records.add( createProtectRecord() );
- records.add( createUnitsRecord() );
- records.add( createChartRecord( 0, 0, 30434904, 19031616 ) );
- records.add( createBeginRecord() );
- records.add( createSCLRecord( (short) 1, (short) 1 ) );
- records.add( createPlotGrowthRecord( 65536, 65536 ) );
- records.add( createFrameRecord1() );
- records.add( createBeginRecord() );
- records.add( createLineFormatRecord(true) );
- records.add( createAreaFormatRecord1() );
- records.add( createEndRecord() );
- records.add( createSeriesRecord() );
- records.add( createBeginRecord() );
- records.add( createTitleLinkedDataRecord() );
- records.add( createValuesLinkedDataRecord() );
- records.add( createCategoriesLinkedDataRecord() );
- records.add( createDataFormatRecord() );
- // records.add(createBeginRecord());
- // unknown
- // records.add(createEndRecord());
- records.add( createSeriesToChartGroupRecord() );
- records.add( createEndRecord() );
- records.add( createSheetPropsRecord() );
- records.add( createDefaultTextRecord( DefaultDataLabelTextPropertiesRecord.CATEGORY_DATA_TYPE_ALL_TEXT_CHARACTERISTIC ) );
- records.add( createAllTextRecord() );
- records.add( createBeginRecord() );
- // unknown
- records.add( createFontIndexRecord( 5 ) );
- records.add( createDirectLinkRecord() );
- records.add( createEndRecord() );
- records.add( createDefaultTextRecord( (short) 3 ) ); // eek, undocumented text type
- records.add( createUnknownTextRecord() );
- records.add( createBeginRecord() );
- records.add( createFontIndexRecord( (short) 6 ) );
- records.add( createDirectLinkRecord() );
- records.add( createEndRecord() );
-
- records.add( createAxisUsedRecord( (short) 1 ) );
- createAxisRecords( records );
-
- records.add( createEndRecord() );
- records.add( createDimensionsRecord() );
- records.add( createSeriesIndexRecord(2) );
- records.add( createSeriesIndexRecord(1) );
- records.add( createSeriesIndexRecord(3) );
- records.add( createEOFRecord() );
-
-
-
- sheet.insertChartRecords( records );
- workbook.insertChartRecord();
- }
-
- /**
- * Returns all the charts for the given sheet.
- *
- * NOTE: You won't be able to do very much with
- * these charts yet, as this is very limited support
- */
- public static HSSFChart[] getSheetCharts(HSSFSheet sheet) {
- List charts = new ArrayList();
- HSSFChart lastChart = null;
-
- // Find records of interest
- List records = sheet.getSheet().getRecords();
- for(Iterator it = records.iterator(); it.hasNext();) {
- Record r = (Record)it.next();
-
- if(r instanceof ChartRecord) {
- lastChart = new HSSFChart((ChartRecord)r);
- charts.add(lastChart);
- }
- if(r instanceof LegendRecord) {
- lastChart.legendRecord = (LegendRecord)r;
- }
- if(r instanceof SeriesRecord) {
- HSSFSeries series = lastChart.new HSSFSeries( (SeriesRecord)r );
- lastChart.series.add(series);
- }
- if(r instanceof ChartTitleFormatRecord) {
- lastChart.chartTitleFormat =
- (ChartTitleFormatRecord)r;
- }
- if(r instanceof SeriesTextRecord) {
- // Applies to a series, unless we've seen
- // a legend already
- SeriesTextRecord str = (SeriesTextRecord)r;
- if(lastChart.legendRecord == null &&
- lastChart.series.size() > 0) {
- HSSFSeries series = (HSSFSeries)
- lastChart.series.get(lastChart.series.size()-1);
- series.seriesTitleText = str;
- } else {
- lastChart.chartTitleText = str;
- }
- }
- }
-
- return (HSSFChart[])
- charts.toArray( new HSSFChart[charts.size()] );
- }
-
- /** Get the X offset of the chart */
- public int getChartX() { return chartRecord.getX(); }
- /** Get the Y offset of the chart */
- public int getChartY() { return chartRecord.getY(); }
- /** Get the width of the chart. {@link ChartRecord} */
- public int getChartWidth() { return chartRecord.getWidth(); }
- /** Get the height of the chart. {@link ChartRecord} */
- public int getChartHeight() { return chartRecord.getHeight(); }
-
- /** Sets the X offset of the chart */
- public void setChartX(int x) { chartRecord.setX(x); }
- /** Sets the Y offset of the chart */
- public void setChartY(int y) { chartRecord.setY(y); }
- /** Sets the width of the chart. {@link ChartRecord} */
- public void setChartWidth(int width) { chartRecord.setWidth(width); }
- /** Sets the height of the chart. {@link ChartRecord} */
- public void setChartHeight(int height) { chartRecord.setHeight(height); }
-
- /**
- * Returns the series of the chart
- */
- public HSSFSeries[] getSeries() {
- return (HSSFSeries[])
- series.toArray(new HSSFSeries[series.size()]);
- }
-
- /**
- * Returns the chart's title, if there is one,
- * or null if not
- */
- public String getChartTitle() {
- if(chartTitleText != null) {
- return chartTitleText.getText();
- }
- return null;
- }
-
- /**
- * Changes the chart's title, but only if there
- * was one already.
- * TODO - add in the records if not
- */
- public void setChartTitle(String title) {
- if(chartTitleText != null) {
- chartTitleText.setText(title);
- } else {
- throw new IllegalStateException("No chart title found to change");
- }
- }
-
-
- private EOFRecord createEOFRecord()
- {
- return new EOFRecord();
- }
-
- private SeriesIndexRecord createSeriesIndexRecord( int index )
- {
- SeriesIndexRecord r = new SeriesIndexRecord();
- r.setIndex((short)index);
- return r;
- }
-
- private DimensionsRecord createDimensionsRecord()
- {
- DimensionsRecord r = new DimensionsRecord();
- r.setFirstRow(0);
- r.setLastRow(31);
- r.setFirstCol((short)0);
- r.setLastCol((short)1);
- return r;
- }
-
- private HCenterRecord createHCenterRecord()
- {
- HCenterRecord r = new HCenterRecord();
- r.setHCenter(false);
- return r;
- }
-
- private VCenterRecord createVCenterRecord()
- {
- VCenterRecord r = new VCenterRecord();
- r.setVCenter(false);
- return r;
- }
-
- private PrintSetupRecord createPrintSetupRecord()
- {
- PrintSetupRecord r = new PrintSetupRecord();
- r.setPaperSize((short)0);
- r.setScale((short)18);
- r.setPageStart((short)1);
- r.setFitWidth((short)1);
- r.setFitHeight((short)1);
- r.setLeftToRight(false);
- r.setLandscape(false);
- r.setValidSettings(true);
- r.setNoColor(false);
- r.setDraft(false);
- r.setNotes(false);
- r.setNoOrientation(false);
- r.setUsePage(false);
- r.setHResolution((short)0);
- r.setVResolution((short)0);
- r.setHeaderMargin(0.5);
- r.setFooterMargin(0.5);
- r.setCopies((short)15); // what the ??
- return r;
- }
-
- private FontBasisRecord createFontBasisRecord1()
- {
- FontBasisRecord r = new FontBasisRecord();
- r.setXBasis((short)9120);
- r.setYBasis((short)5640);
- r.setHeightBasis((short)200);
- r.setScale((short)0);
- r.setIndexToFontTable((short)5);
- return r;
- }
-
- private FontBasisRecord createFontBasisRecord2()
- {
- FontBasisRecord r = createFontBasisRecord1();
- r.setIndexToFontTable((short)6);
- return r;
- }
-
- private ProtectRecord createProtectRecord()
- {
- ProtectRecord r = new ProtectRecord();
- r.setProtect(false);
- return r;
- }
-
- private FooterRecord createFooterRecord()
- {
- FooterRecord r = new FooterRecord();
- r.setFooter(null);
- return r;
- }
-
- private HeaderRecord createHeaderRecord()
- {
- HeaderRecord r = new HeaderRecord();
- r.setHeader(null);
- return r;
- }
-
- private BOFRecord createBOFRecord()
- {
- BOFRecord r = new BOFRecord();
- r.setVersion((short)600);
- r.setType((short)20);
- r.setBuild((short)0x1CFE);
- r.setBuildYear((short)1997);
- r.setHistoryBitMask(0x40C9);
- r.setRequiredVersion(106);
- return r;
- }
-
- private UnknownRecord createOBJRecord()
- {
- byte[] data = {
- (byte) 0x15, (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x11, (byte) 0x60, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xB8, (byte) 0x03,
- (byte) 0x87, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
- };
-
- return new UnknownRecord( (short) 0x005D, data );
- }
-
- private UnknownRecord createMSDrawingObjectRecord()
- {
- // Since we haven't created this object yet we'll just put in the raw
- // form for the moment.
-
- byte[] data = {
- (byte)0x0F, (byte)0x00, (byte)0x02, (byte)0xF0, (byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x08, (byte)0xF0, (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x0F, (byte)0x00, (byte)0x03, (byte)0xF0, (byte)0xA8, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x0F, (byte)0x00, (byte)0x04, (byte)0xF0, (byte)0x28, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, (byte)0xF0, (byte)0x10, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x02, (byte)0x00, (byte)0x0A, (byte)0xF0, (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x05, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x0F, (byte)0x00, (byte)0x04, (byte)0xF0, (byte)0x70, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x92, (byte)0x0C, (byte)0x0A, (byte)0xF0, (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x02, (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0A, (byte)0x00, (byte)0x00, (byte)0x93, (byte)0x00, (byte)0x0B, (byte)0xF0, (byte)0x36, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x7F, (byte)0x00, (byte)0x04, (byte)0x01, (byte)0x04, (byte)0x01, (byte)0xBF, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x81, (byte)0x01, (byte)0x4E, (byte)0x00,
- (byte)0x00, (byte)0x08, (byte)0x83, (byte)0x01, (byte)0x4D, (byte)0x00, (byte)0x00, (byte)0x08, (byte)0xBF, (byte)0x01, (byte)0x10, (byte)0x00, (byte)0x11, (byte)0x00, (byte)0xC0, (byte)0x01,
- (byte)0x4D, (byte)0x00, (byte)0x00, (byte)0x08, (byte)0xFF, (byte)0x01, (byte)0x08, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x3F, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x00,
- (byte)0xBF, (byte)0x03, (byte)0x00, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x10, (byte)0xF0, (byte)0x12, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x04, (byte)0x00, (byte)0xC0, (byte)0x02, (byte)0x0A, (byte)0x00, (byte)0xF4, (byte)0x00, (byte)0x0E, (byte)0x00, (byte)0x66, (byte)0x01, (byte)0x20, (byte)0x00, (byte)0xE9, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x11, (byte)0xF0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
- };
-
- return new UnknownRecord((short)0x00EC, data);
- }
-
- private void createAxisRecords( List records )
- {
- records.add( createAxisParentRecord() );
- records.add( createBeginRecord() );
- records.add( createAxisRecord( AxisRecord.AXIS_TYPE_CATEGORY_OR_X_AXIS ) );
- records.add( createBeginRecord() );
- records.add( createCategorySeriesAxisRecord() );
- records.add( createAxisOptionsRecord() );
- records.add( createTickRecord1() );
- records.add( createEndRecord() );
- records.add( createAxisRecord( AxisRecord.AXIS_TYPE_VALUE_AXIS ) );
- records.add( createBeginRecord() );
- records.add( createValueRangeRecord() );
- records.add( createTickRecord2() );
- records.add( createAxisLineFormatRecord( AxisLineFormatRecord.AXIS_TYPE_MAJOR_GRID_LINE ) );
- records.add( createLineFormatRecord(false) );
- records.add( createEndRecord() );
- records.add( createPlotAreaRecord() );
- records.add( createFrameRecord2() );
- records.add( createBeginRecord() );
- records.add( createLineFormatRecord2() );
- records.add( createAreaFormatRecord2() );
- records.add( createEndRecord() );
- records.add( createChartFormatRecord() );
- records.add( createBeginRecord() );
- records.add( createBarRecord() );
- // unknown 1022
- records.add( createLegendRecord() );
- records.add( createBeginRecord() );
- // unknown 104f
- records.add( createTextRecord() );
- records.add( createBeginRecord() );
- // unknown 104f
- records.add( createLinkedDataRecord() );
- records.add( createEndRecord() );
- records.add( createEndRecord() );
- records.add( createEndRecord() );
- records.add( createEndRecord() );
- }
-
- private LinkedDataRecord createLinkedDataRecord()
- {
- LinkedDataRecord r = new LinkedDataRecord();
- r.setLinkType(LinkedDataRecord.LINK_TYPE_TITLE_OR_TEXT);
- r.setReferenceType(LinkedDataRecord.REFERENCE_TYPE_DIRECT);
- r.setCustomNumberFormat(false);
- r.setIndexNumberFmtRecord((short)0);
- r.setFormulaOfLink( new LinkedDataFormulaField() );
- return r;
- }
-
- private TextRecord createTextRecord()
- {
- TextRecord r = new TextRecord();
- r.setHorizontalAlignment(TextRecord.HORIZONTAL_ALIGNMENT_CENTER);
- r.setVerticalAlignment(TextRecord.VERTICAL_ALIGNMENT_CENTER);
- r.setDisplayMode((short)1);
- r.setRgbColor(0x00000000);
- r.setX(-37);
- r.setY(-60);
- r.setWidth(0);
- r.setHeight(0);
- r.setAutoColor(true);
- r.setShowKey(false);
- r.setShowValue(false);
- r.setVertical(false);
- r.setAutoGeneratedText(true);
- r.setGenerated(true);
- r.setAutoLabelDeleted(false);
- r.setAutoBackground(true);
- r.setRotation((short)0);
- r.setShowCategoryLabelAsPercentage(false);
- r.setShowValueAsPercentage(false);
- r.setShowBubbleSizes(false);
- r.setShowLabel(false);
- r.setIndexOfColorValue((short)77);
- r.setDataLabelPlacement((short)0);
- r.setTextRotation((short)0);
- return r;
- }
-
- private LegendRecord createLegendRecord()
- {
- LegendRecord r = new LegendRecord();
- r.setXAxisUpperLeft(3542);
- r.setYAxisUpperLeft(1566);
- r.setXSize(437);
- r.setYSize(213);
- r.setType(LegendRecord.TYPE_RIGHT);
- r.setSpacing(LegendRecord.SPACING_MEDIUM);
- r.setAutoPosition(true);
- r.setAutoSeries(true);
- r.setAutoXPositioning(true);
- r.setAutoYPositioning(true);
- r.setVertical(true);
- r.setDataTable(false);
- return r;
- }
-
- private BarRecord createBarRecord()
- {
- BarRecord r = new BarRecord();
- r.setBarSpace((short)0);
- r.setCategorySpace((short)150);
- r.setHorizontal(false);
- r.setStacked(false);
- r.setDisplayAsPercentage(false);
- r.setShadow(false);
- return r;
- }
-
- private ChartFormatRecord createChartFormatRecord()
- {
- ChartFormatRecord r = new ChartFormatRecord();
- r.setXPosition(0);
- r.setYPosition(0);
- r.setWidth(0);
- r.setHeight(0);
- r.setVaryDisplayPattern(false);
- return r;
- }
-
- private PlotAreaRecord createPlotAreaRecord()
- {
- PlotAreaRecord r = new PlotAreaRecord( );
- return r;
- }
-
- private AxisLineFormatRecord createAxisLineFormatRecord( short format )
- {
- AxisLineFormatRecord r = new AxisLineFormatRecord();
- r.setAxisType( format );
- return r;
- }
-
- private ValueRangeRecord createValueRangeRecord()
- {
- ValueRangeRecord r = new ValueRangeRecord();
- r.setMinimumAxisValue( 0.0 );
- r.setMaximumAxisValue( 0.0 );
- r.setMajorIncrement( 0 );
- r.setMinorIncrement( 0 );
- r.setCategoryAxisCross( 0 );
- r.setAutomaticMinimum( true );
- r.setAutomaticMaximum( true );
- r.setAutomaticMajor( true );
- r.setAutomaticMinor( true );
- r.setAutomaticCategoryCrossing( true );
- r.setLogarithmicScale( false );
- r.setValuesInReverse( false );
- r.setCrossCategoryAxisAtMaximum( false );
- r.setReserved( true ); // what's this do??
- return r;
- }
-
- private TickRecord createTickRecord1()
- {
- TickRecord r = new TickRecord();
- r.setMajorTickType( (byte) 2 );
- r.setMinorTickType( (byte) 0 );
- r.setLabelPosition( (byte) 3 );
- r.setBackground( (byte) 1 );
- r.setLabelColorRgb( 0 );
- r.setZero1( (short) 0 );
- r.setZero2( (short) 0 );
- r.setZero3( (short) 45 );
- r.setAutorotate( true );
- r.setAutoTextBackground( true );
- r.setRotation( (short) 0 );
- r.setAutorotate( true );
- r.setTickColor( (short) 77 );
- return r;
- }
-
- private TickRecord createTickRecord2()
- {
- TickRecord r = createTickRecord1();
- r.setZero3((short)0);
- return r;
- }
-
- private AxisOptionsRecord createAxisOptionsRecord()
- {
- AxisOptionsRecord r = new AxisOptionsRecord();
- r.setMinimumCategory( (short) -28644 );
- r.setMaximumCategory( (short) -28715 );
- r.setMajorUnitValue( (short) 2 );
- r.setMajorUnit( (short) 0 );
- r.setMinorUnitValue( (short) 1 );
- r.setMinorUnit( (short) 0 );
- r.setBaseUnit( (short) 0 );
- r.setCrossingPoint( (short) -28644 );
- r.setDefaultMinimum( true );
- r.setDefaultMaximum( true );
- r.setDefaultMajor( true );
- r.setDefaultMinorUnit( true );
- r.setIsDate( true );
- r.setDefaultBase( true );
- r.setDefaultCross( true );
- r.setDefaultDateSettings( true );
- return r;
- }
-
- private CategorySeriesAxisRecord createCategorySeriesAxisRecord()
- {
- CategorySeriesAxisRecord r = new CategorySeriesAxisRecord();
- r.setCrossingPoint( (short) 1 );
- r.setLabelFrequency( (short) 1 );
- r.setTickMarkFrequency( (short) 1 );
- r.setValueAxisCrossing( true );
- r.setCrossesFarRight( false );
- r.setReversed( false );
- return r;
- }
-
- private AxisRecord createAxisRecord( short axisType )
- {
- AxisRecord r = new AxisRecord();
- r.setAxisType( axisType );
- return r;
- }
-
- private AxisParentRecord createAxisParentRecord()
- {
- AxisParentRecord r = new AxisParentRecord();
- r.setAxisType( AxisParentRecord.AXIS_TYPE_MAIN );
- r.setX( 479 );
- r.setY( 221 );
- r.setWidth( 2995 );
- r.setHeight( 2902 );
- return r;
- }
-
- private AxisUsedRecord createAxisUsedRecord( short numAxis )
- {
- AxisUsedRecord r = new AxisUsedRecord();
- r.setNumAxis( numAxis );
- return r;
- }
-
- private LinkedDataRecord createDirectLinkRecord()
- {
- LinkedDataRecord r = new LinkedDataRecord();
- r.setLinkType( LinkedDataRecord.LINK_TYPE_TITLE_OR_TEXT );
- r.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_DIRECT );
- r.setCustomNumberFormat( false );
- r.setIndexNumberFmtRecord( (short) 0 );
- r.setFormulaOfLink( new LinkedDataFormulaField() );
- return r;
- }
-
- private FontIndexRecord createFontIndexRecord( int index )
- {
- FontIndexRecord r = new FontIndexRecord();
- r.setFontIndex( (short) index );
- return r;
- }
-
- private TextRecord createAllTextRecord()
- {
- TextRecord r = new TextRecord();
- r.setHorizontalAlignment( TextRecord.HORIZONTAL_ALIGNMENT_CENTER );
- r.setVerticalAlignment( TextRecord.VERTICAL_ALIGNMENT_CENTER );
- r.setDisplayMode( TextRecord.DISPLAY_MODE_TRANSPARENT );
- r.setRgbColor( 0 );
- r.setX( -37 );
- r.setY( -60 );
- r.setWidth( 0 );
- r.setHeight( 0 );
- r.setAutoColor( true );
- r.setShowKey( false );
- r.setShowValue( true );
- r.setVertical( false );
- r.setAutoGeneratedText( true );
- r.setGenerated( true );
- r.setAutoLabelDeleted( false );
- r.setAutoBackground( true );
- r.setRotation( (short) 0 );
- r.setShowCategoryLabelAsPercentage( false );
- r.setShowValueAsPercentage( false );
- r.setShowBubbleSizes( false );
- r.setShowLabel( false );
- r.setIndexOfColorValue( (short) 77 );
- r.setDataLabelPlacement( (short) 0 );
- r.setTextRotation( (short) 0 );
- return r;
- }
-
- private TextRecord createUnknownTextRecord()
- {
- TextRecord r = new TextRecord();
- r.setHorizontalAlignment( TextRecord.HORIZONTAL_ALIGNMENT_CENTER );
- r.setVerticalAlignment( TextRecord.VERTICAL_ALIGNMENT_CENTER );
- r.setDisplayMode( TextRecord.DISPLAY_MODE_TRANSPARENT );
- r.setRgbColor( 0 );
- r.setX( -37 );
- r.setY( -60 );
- r.setWidth( 0 );
- r.setHeight( 0 );
- r.setAutoColor( true );
- r.setShowKey( false );
- r.setShowValue( false );
- r.setVertical( false );
- r.setAutoGeneratedText( true );
- r.setGenerated( true );
- r.setAutoLabelDeleted( false );
- r.setAutoBackground( true );
- r.setRotation( (short) 0 );
- r.setShowCategoryLabelAsPercentage( false );
- r.setShowValueAsPercentage( false );
- r.setShowBubbleSizes( false );
- r.setShowLabel( false );
- r.setIndexOfColorValue( (short) 77 );
- r.setDataLabelPlacement( (short) 11088 );
- r.setTextRotation( (short) 0 );
- return r;
- }
-
- private DefaultDataLabelTextPropertiesRecord createDefaultTextRecord( short categoryDataType )
- {
- DefaultDataLabelTextPropertiesRecord r = new DefaultDataLabelTextPropertiesRecord();
- r.setCategoryDataType( categoryDataType );
- return r;
- }
-
- private SheetPropertiesRecord createSheetPropsRecord()
- {
- SheetPropertiesRecord r = new SheetPropertiesRecord();
- r.setChartTypeManuallyFormatted( false );
- r.setPlotVisibleOnly( true );
- r.setDoNotSizeWithWindow( false );
- r.setDefaultPlotDimensions( true );
- r.setAutoPlotArea( false );
- return r;
- }
-
- private SeriesToChartGroupRecord createSeriesToChartGroupRecord()
- {
- return new SeriesToChartGroupRecord();
- }
-
- private DataFormatRecord createDataFormatRecord()
- {
- DataFormatRecord r = new DataFormatRecord();
- r.setPointNumber( (short) -1 );
- r.setSeriesIndex( (short) 0 );
- r.setSeriesNumber( (short) 0 );
- r.setUseExcel4Colors( false );
- return r;
- }
-
- private LinkedDataRecord createCategoriesLinkedDataRecord()
- {
- LinkedDataRecord r = new LinkedDataRecord();
- r.setLinkType( LinkedDataRecord.LINK_TYPE_CATEGORIES );
- r.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_WORKSHEET );
- r.setCustomNumberFormat( false );
- r.setIndexNumberFmtRecord( (short) 0 );
- LinkedDataFormulaField formula = new LinkedDataFormulaField();
- Stack tokens = new Stack();
- Area3DPtg p = new Area3DPtg();
- p.setExternSheetIndex( (short) 0 );
- p.setFirstColumn( (short) 1 );
- p.setLastColumn( (short) 1 );
- p.setFirstRow( (short) 0 );
- p.setLastRow( (short) 31 );
- tokens.add( p );
- formula.setFormulaTokens( tokens );
- r.setFormulaOfLink( formula );
- return r;
- }
-
- private LinkedDataRecord createValuesLinkedDataRecord()
- {
- LinkedDataRecord r = new LinkedDataRecord();
- r.setLinkType( LinkedDataRecord.LINK_TYPE_VALUES );
- r.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_WORKSHEET );
- r.setCustomNumberFormat( false );
- r.setIndexNumberFmtRecord( (short) 0 );
- LinkedDataFormulaField formula = new LinkedDataFormulaField();
- Stack tokens = new Stack();
- Area3DPtg p = new Area3DPtg();
- p.setExternSheetIndex( (short) 0 );
- p.setFirstColumn( (short) 0 );
- p.setLastColumn( (short) 0 );
- p.setFirstRow( (short) 0 );
- p.setLastRow( (short) 31 );
- tokens.add( p );
- formula.setFormulaTokens( tokens );
- r.setFormulaOfLink( formula );
- return r;
- }
-
- private LinkedDataRecord createTitleLinkedDataRecord()
- {
- LinkedDataRecord r = new LinkedDataRecord();
- r.setLinkType( LinkedDataRecord.LINK_TYPE_TITLE_OR_TEXT );
- r.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_DIRECT );
- r.setCustomNumberFormat( false );
- r.setIndexNumberFmtRecord( (short) 0 );
- r.setFormulaOfLink( new LinkedDataFormulaField() );
- return r;
- }
-
- private SeriesRecord createSeriesRecord()
- {
- SeriesRecord r = new SeriesRecord();
- r.setCategoryDataType( SeriesRecord.CATEGORY_DATA_TYPE_NUMERIC );
- r.setValuesDataType( SeriesRecord.VALUES_DATA_TYPE_NUMERIC );
- r.setNumCategories( (short) 32 );
- r.setNumValues( (short) 31 );
- r.setBubbleSeriesType( SeriesRecord.BUBBLE_SERIES_TYPE_NUMERIC );
- r.setNumBubbleValues( (short) 0 );
- return r;
- }
-
- private EndRecord createEndRecord()
- {
- return new EndRecord();
- }
-
- private AreaFormatRecord createAreaFormatRecord1()
- {
- AreaFormatRecord r = new AreaFormatRecord();
- r.setForegroundColor( 16777215 ); // RGB Color
- r.setBackgroundColor( 0 ); // RGB Color
- r.setPattern( (short) 1 ); // TODO: Add Pattern constants to record
- r.setAutomatic( true );
- r.setInvert( false );
- r.setForecolorIndex( (short) 78 );
- r.setBackcolorIndex( (short) 77 );
- return r;
- }
-
- private AreaFormatRecord createAreaFormatRecord2()
- {
- AreaFormatRecord r = new AreaFormatRecord();
- r.setForegroundColor(0x00c0c0c0);
- r.setBackgroundColor(0x00000000);
- r.setPattern((short)1);
- r.setAutomatic(false);
- r.setInvert(false);
- r.setForecolorIndex((short)22);
- r.setBackcolorIndex((short)79);
- return r;
- }
-
- private LineFormatRecord createLineFormatRecord( boolean drawTicks )
- {
- LineFormatRecord r = new LineFormatRecord();
- r.setLineColor( 0 );
- r.setLinePattern( LineFormatRecord.LINE_PATTERN_SOLID );
- r.setWeight( (short) -1 );
- r.setAuto( true );
- r.setDrawTicks( drawTicks );
- r.setColourPaletteIndex( (short) 77 ); // what colour is this?
- return r;
- }
-
- private LineFormatRecord createLineFormatRecord2()
- {
- LineFormatRecord r = new LineFormatRecord();
- r.setLineColor( 0x00808080 );
- r.setLinePattern( (short) 0 );
- r.setWeight( (short) 0 );
- r.setAuto( false );
- r.setDrawTicks( false );
- r.setUnknown( false );
- r.setColourPaletteIndex( (short) 23 );
- return r;
- }
-
- private FrameRecord createFrameRecord1()
- {
- FrameRecord r = new FrameRecord();
- r.setBorderType( FrameRecord.BORDER_TYPE_REGULAR );
- r.setAutoSize( false );
- r.setAutoPosition( true );
- return r;
- }
-
- private FrameRecord createFrameRecord2()
- {
- FrameRecord r = new FrameRecord();
- r.setBorderType( FrameRecord.BORDER_TYPE_REGULAR );
- r.setAutoSize( true );
- r.setAutoPosition( true );
- return r;
- }
-
- private PlotGrowthRecord createPlotGrowthRecord( int horizScale, int vertScale )
- {
- PlotGrowthRecord r = new PlotGrowthRecord();
- r.setHorizontalScale( horizScale );
- r.setVerticalScale( vertScale );
- return r;
- }
-
- private SCLRecord createSCLRecord( short numerator, short denominator )
- {
- SCLRecord r = new SCLRecord();
- r.setDenominator( denominator );
- r.setNumerator( numerator );
- return r;
- }
-
- private BeginRecord createBeginRecord()
- {
- return new BeginRecord();
- }
-
- private ChartRecord createChartRecord( int x, int y, int width, int height )
- {
- ChartRecord r = new ChartRecord();
- r.setX( x );
- r.setY( y );
- r.setWidth( width );
- r.setHeight( height );
- return r;
- }
-
- private UnitsRecord createUnitsRecord()
- {
- UnitsRecord r = new UnitsRecord();
- r.setUnits( (short) 0 );
- return r;
- }
-
-
- /**
- * A series in a chart
- */
- public class HSSFSeries {
- private SeriesRecord series;
- private SeriesTextRecord seriesTitleText;
-
- private HSSFSeries(SeriesRecord series) {
- this.series = series;
- }
-
- public short getNumValues() {
- return series.getNumValues();
- }
- /**
- * See {@link SeriesRecord}
- */
- public short getValueType() {
- return series.getValuesDataType();
- }
-
- /**
- * Returns the series' title, if there is one,
- * or null if not
- */
- public String getSeriesTitle() {
- if(seriesTitleText != null) {
- return seriesTitleText.getText();
- }
- return null;
- }
-
- /**
- * Changes the series' title, but only if there
- * was one already.
- * TODO - add in the records if not
- */
- public void setSeriesTitle(String title) {
- if(seriesTitleText != null) {
- seriesTitleText.setText(title);
- } else {
- throw new IllegalStateException("No series title found to change");
- }
- }
- }
+ /**
+ * Creates a bar chart. API needs some work. :)
+ *
+ * NOTE: Does not yet work... checking it in just so others
+ * can take a look.
+ */
+ public void createBarChart( HSSFWorkbook workbook, HSSFSheet sheet )
+ {
+
+ List records = new ArrayList();
+ records.add( createMSDrawingObjectRecord() );
+ records.add( createOBJRecord() );
+ records.add( createBOFRecord() );
+ records.add( createHeaderRecord() );
+ records.add( createFooterRecord() );
+ records.add( createHCenterRecord() );
+ records.add( createVCenterRecord() );
+ records.add( createPrintSetupRecord() );
+ // unknown 33
+ records.add( createFontBasisRecord1() );
+ records.add( createFontBasisRecord2() );
+ records.add( createProtectRecord() );
+ records.add( createUnitsRecord() );
+ records.add( createChartRecord( 0, 0, 30434904, 19031616 ) );
+ records.add( createBeginRecord() );
+ records.add( createSCLRecord( (short) 1, (short) 1 ) );
+ records.add( createPlotGrowthRecord( 65536, 65536 ) );
+ records.add( createFrameRecord1() );
+ records.add( createBeginRecord() );
+ records.add( createLineFormatRecord(true) );
+ records.add( createAreaFormatRecord1() );
+ records.add( createEndRecord() );
+ records.add( createSeriesRecord() );
+ records.add( createBeginRecord() );
+ records.add( createTitleLinkedDataRecord() );
+ records.add( createValuesLinkedDataRecord() );
+ records.add( createCategoriesLinkedDataRecord() );
+ records.add( createDataFormatRecord() );
+ // records.add(createBeginRecord());
+ // unknown
+ // records.add(createEndRecord());
+ records.add( createSeriesToChartGroupRecord() );
+ records.add( createEndRecord() );
+ records.add( createSheetPropsRecord() );
+ records.add( createDefaultTextRecord( DefaultDataLabelTextPropertiesRecord.CATEGORY_DATA_TYPE_ALL_TEXT_CHARACTERISTIC ) );
+ records.add( createAllTextRecord() );
+ records.add( createBeginRecord() );
+ // unknown
+ records.add( createFontIndexRecord( 5 ) );
+ records.add( createDirectLinkRecord() );
+ records.add( createEndRecord() );
+ records.add( createDefaultTextRecord( (short) 3 ) ); // eek, undocumented text type
+ records.add( createUnknownTextRecord() );
+ records.add( createBeginRecord() );
+ records.add( createFontIndexRecord( (short) 6 ) );
+ records.add( createDirectLinkRecord() );
+ records.add( createEndRecord() );
+
+ records.add( createAxisUsedRecord( (short) 1 ) );
+ createAxisRecords( records );
+
+ records.add( createEndRecord() );
+ records.add( createDimensionsRecord() );
+ records.add( createSeriesIndexRecord(2) );
+ records.add( createSeriesIndexRecord(1) );
+ records.add( createSeriesIndexRecord(3) );
+ records.add( createEOFRecord() );
+
+
+
+ sheet.insertChartRecords( records );
+ workbook.insertChartRecord();
+ }
+
+ /**
+ * Returns all the charts for the given sheet.
+ *
+ * NOTE: You won't be able to do very much with
+ * these charts yet, as this is very limited support
+ */
+ public static HSSFChart[] getSheetCharts(HSSFSheet sheet) {
+ List charts = new ArrayList();
+ HSSFChart lastChart = null;
+
+ // Find records of interest
+ List records = sheet.getSheet().getRecords();
+ for(Iterator it = records.iterator(); it.hasNext();) {
+ RecordBase r = (RecordBase)it.next();
+
+ if(r instanceof ChartRecord) {
+ lastChart = new HSSFChart((ChartRecord)r);
+ charts.add(lastChart);
+ }
+ if(r instanceof LegendRecord) {
+ lastChart.legendRecord = (LegendRecord)r;
+ }
+ if(r instanceof SeriesRecord) {
+ HSSFSeries series = lastChart.new HSSFSeries( (SeriesRecord)r );
+ lastChart.series.add(series);
+ }
+ if(r instanceof ChartTitleFormatRecord) {
+ lastChart.chartTitleFormat =
+ (ChartTitleFormatRecord)r;
+ }
+ if(r instanceof SeriesTextRecord) {
+ // Applies to a series, unless we've seen
+ // a legend already
+ SeriesTextRecord str = (SeriesTextRecord)r;
+ if(lastChart.legendRecord == null &&
+ lastChart.series.size() > 0) {
+ HSSFSeries series = (HSSFSeries)
+ lastChart.series.get(lastChart.series.size()-1);
+ series.seriesTitleText = str;
+ } else {
+ lastChart.chartTitleText = str;
+ }
+ }
+ }
+
+ return (HSSFChart[])
+ charts.toArray( new HSSFChart[charts.size()] );
+ }
+
+ /** Get the X offset of the chart */
+ public int getChartX() { return chartRecord.getX(); }
+ /** Get the Y offset of the chart */
+ public int getChartY() { return chartRecord.getY(); }
+ /** Get the width of the chart. {@link ChartRecord} */
+ public int getChartWidth() { return chartRecord.getWidth(); }
+ /** Get the height of the chart. {@link ChartRecord} */
+ public int getChartHeight() { return chartRecord.getHeight(); }
+
+ /** Sets the X offset of the chart */
+ public void setChartX(int x) { chartRecord.setX(x); }
+ /** Sets the Y offset of the chart */
+ public void setChartY(int y) { chartRecord.setY(y); }
+ /** Sets the width of the chart. {@link ChartRecord} */
+ public void setChartWidth(int width) { chartRecord.setWidth(width); }
+ /** Sets the height of the chart. {@link ChartRecord} */
+ public void setChartHeight(int height) { chartRecord.setHeight(height); }
+
+ /**
+ * Returns the series of the chart
+ */
+ public HSSFSeries[] getSeries() {
+ return (HSSFSeries[])
+ series.toArray(new HSSFSeries[series.size()]);
+ }
+
+ /**
+ * Returns the chart's title, if there is one,
+ * or null if not
+ */
+ public String getChartTitle() {
+ if(chartTitleText != null) {
+ return chartTitleText.getText();
+ }
+ return null;
+ }
+
+ /**
+ * Changes the chart's title, but only if there
+ * was one already.
+ * TODO - add in the records if not
+ */
+ public void setChartTitle(String title) {
+ if(chartTitleText != null) {
+ chartTitleText.setText(title);
+ } else {
+ throw new IllegalStateException("No chart title found to change");
+ }
+ }
+
+
+ private EOFRecord createEOFRecord()
+ {
+ return new EOFRecord();
+ }
+
+ private SeriesIndexRecord createSeriesIndexRecord( int index )
+ {
+ SeriesIndexRecord r = new SeriesIndexRecord();
+ r.setIndex((short)index);
+ return r;
+ }
+
+ private DimensionsRecord createDimensionsRecord()
+ {
+ DimensionsRecord r = new DimensionsRecord();
+ r.setFirstRow(0);
+ r.setLastRow(31);
+ r.setFirstCol((short)0);
+ r.setLastCol((short)1);
+ return r;
+ }
+
+ private HCenterRecord createHCenterRecord()
+ {
+ HCenterRecord r = new HCenterRecord();
+ r.setHCenter(false);
+ return r;
+ }
+
+ private VCenterRecord createVCenterRecord()
+ {
+ VCenterRecord r = new VCenterRecord();
+ r.setVCenter(false);
+ return r;
+ }
+
+ private PrintSetupRecord createPrintSetupRecord()
+ {
+ PrintSetupRecord r = new PrintSetupRecord();
+ r.setPaperSize((short)0);
+ r.setScale((short)18);
+ r.setPageStart((short)1);
+ r.setFitWidth((short)1);
+ r.setFitHeight((short)1);
+ r.setLeftToRight(false);
+ r.setLandscape(false);
+ r.setValidSettings(true);
+ r.setNoColor(false);
+ r.setDraft(false);
+ r.setNotes(false);
+ r.setNoOrientation(false);
+ r.setUsePage(false);
+ r.setHResolution((short)0);
+ r.setVResolution((short)0);
+ r.setHeaderMargin(0.5);
+ r.setFooterMargin(0.5);
+ r.setCopies((short)15); // what the ??
+ return r;
+ }
+
+ private FontBasisRecord createFontBasisRecord1()
+ {
+ FontBasisRecord r = new FontBasisRecord();
+ r.setXBasis((short)9120);
+ r.setYBasis((short)5640);
+ r.setHeightBasis((short)200);
+ r.setScale((short)0);
+ r.setIndexToFontTable((short)5);
+ return r;
+ }
+
+ private FontBasisRecord createFontBasisRecord2()
+ {
+ FontBasisRecord r = createFontBasisRecord1();
+ r.setIndexToFontTable((short)6);
+ return r;
+ }
+
+ private ProtectRecord createProtectRecord()
+ {
+ ProtectRecord r = new ProtectRecord();
+ r.setProtect(false);
+ return r;
+ }
+
+ private FooterRecord createFooterRecord()
+ {
+ FooterRecord r = new FooterRecord();
+ r.setFooter(null);
+ return r;
+ }
+
+ private HeaderRecord createHeaderRecord()
+ {
+ HeaderRecord r = new HeaderRecord();
+ r.setHeader(null);
+ return r;
+ }
+
+ private BOFRecord createBOFRecord()
+ {
+ BOFRecord r = new BOFRecord();
+ r.setVersion((short)600);
+ r.setType((short)20);
+ r.setBuild((short)0x1CFE);
+ r.setBuildYear((short)1997);
+ r.setHistoryBitMask(0x40C9);
+ r.setRequiredVersion(106);
+ return r;
+ }
+
+ private UnknownRecord createOBJRecord()
+ {
+ byte[] data = {
+ (byte) 0x15, (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x11, (byte) 0x60, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xB8, (byte) 0x03,
+ (byte) 0x87, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ };
+
+ return new UnknownRecord( (short) 0x005D, data );
+ }
+
+ private UnknownRecord createMSDrawingObjectRecord()
+ {
+ // Since we haven't created this object yet we'll just put in the raw
+ // form for the moment.
+
+ byte[] data = {
+ (byte)0x0F, (byte)0x00, (byte)0x02, (byte)0xF0, (byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x08, (byte)0xF0, (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x0F, (byte)0x00, (byte)0x03, (byte)0xF0, (byte)0xA8, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x0F, (byte)0x00, (byte)0x04, (byte)0xF0, (byte)0x28, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, (byte)0xF0, (byte)0x10, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x02, (byte)0x00, (byte)0x0A, (byte)0xF0, (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x05, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x0F, (byte)0x00, (byte)0x04, (byte)0xF0, (byte)0x70, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x92, (byte)0x0C, (byte)0x0A, (byte)0xF0, (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x02, (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0A, (byte)0x00, (byte)0x00, (byte)0x93, (byte)0x00, (byte)0x0B, (byte)0xF0, (byte)0x36, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x7F, (byte)0x00, (byte)0x04, (byte)0x01, (byte)0x04, (byte)0x01, (byte)0xBF, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x81, (byte)0x01, (byte)0x4E, (byte)0x00,
+ (byte)0x00, (byte)0x08, (byte)0x83, (byte)0x01, (byte)0x4D, (byte)0x00, (byte)0x00, (byte)0x08, (byte)0xBF, (byte)0x01, (byte)0x10, (byte)0x00, (byte)0x11, (byte)0x00, (byte)0xC0, (byte)0x01,
+ (byte)0x4D, (byte)0x00, (byte)0x00, (byte)0x08, (byte)0xFF, (byte)0x01, (byte)0x08, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x3F, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x00,
+ (byte)0xBF, (byte)0x03, (byte)0x00, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x10, (byte)0xF0, (byte)0x12, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x04, (byte)0x00, (byte)0xC0, (byte)0x02, (byte)0x0A, (byte)0x00, (byte)0xF4, (byte)0x00, (byte)0x0E, (byte)0x00, (byte)0x66, (byte)0x01, (byte)0x20, (byte)0x00, (byte)0xE9, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x11, (byte)0xF0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
+ };
+
+ return new UnknownRecord((short)0x00EC, data);
+ }
+
+ private void createAxisRecords( List records )
+ {
+ records.add( createAxisParentRecord() );
+ records.add( createBeginRecord() );
+ records.add( createAxisRecord( AxisRecord.AXIS_TYPE_CATEGORY_OR_X_AXIS ) );
+ records.add( createBeginRecord() );
+ records.add( createCategorySeriesAxisRecord() );
+ records.add( createAxisOptionsRecord() );
+ records.add( createTickRecord1() );
+ records.add( createEndRecord() );
+ records.add( createAxisRecord( AxisRecord.AXIS_TYPE_VALUE_AXIS ) );
+ records.add( createBeginRecord() );
+ records.add( createValueRangeRecord() );
+ records.add( createTickRecord2() );
+ records.add( createAxisLineFormatRecord( AxisLineFormatRecord.AXIS_TYPE_MAJOR_GRID_LINE ) );
+ records.add( createLineFormatRecord(false) );
+ records.add( createEndRecord() );
+ records.add( createPlotAreaRecord() );
+ records.add( createFrameRecord2() );
+ records.add( createBeginRecord() );
+ records.add( createLineFormatRecord2() );
+ records.add( createAreaFormatRecord2() );
+ records.add( createEndRecord() );
+ records.add( createChartFormatRecord() );
+ records.add( createBeginRecord() );
+ records.add( createBarRecord() );
+ // unknown 1022
+ records.add( createLegendRecord() );
+ records.add( createBeginRecord() );
+ // unknown 104f
+ records.add( createTextRecord() );
+ records.add( createBeginRecord() );
+ // unknown 104f
+ records.add( createLinkedDataRecord() );
+ records.add( createEndRecord() );
+ records.add( createEndRecord() );
+ records.add( createEndRecord() );
+ records.add( createEndRecord() );
+ }
+
+ private LinkedDataRecord createLinkedDataRecord()
+ {
+ LinkedDataRecord r = new LinkedDataRecord();
+ r.setLinkType(LinkedDataRecord.LINK_TYPE_TITLE_OR_TEXT);
+ r.setReferenceType(LinkedDataRecord.REFERENCE_TYPE_DIRECT);
+ r.setCustomNumberFormat(false);
+ r.setIndexNumberFmtRecord((short)0);
+ r.setFormulaOfLink( new LinkedDataFormulaField() );
+ return r;
+ }
+
+ private TextRecord createTextRecord()
+ {
+ TextRecord r = new TextRecord();
+ r.setHorizontalAlignment(TextRecord.HORIZONTAL_ALIGNMENT_CENTER);
+ r.setVerticalAlignment(TextRecord.VERTICAL_ALIGNMENT_CENTER);
+ r.setDisplayMode((short)1);
+ r.setRgbColor(0x00000000);
+ r.setX(-37);
+ r.setY(-60);
+ r.setWidth(0);
+ r.setHeight(0);
+ r.setAutoColor(true);
+ r.setShowKey(false);
+ r.setShowValue(false);
+ r.setVertical(false);
+ r.setAutoGeneratedText(true);
+ r.setGenerated(true);
+ r.setAutoLabelDeleted(false);
+ r.setAutoBackground(true);
+ r.setRotation((short)0);
+ r.setShowCategoryLabelAsPercentage(false);
+ r.setShowValueAsPercentage(false);
+ r.setShowBubbleSizes(false);
+ r.setShowLabel(false);
+ r.setIndexOfColorValue((short)77);
+ r.setDataLabelPlacement((short)0);
+ r.setTextRotation((short)0);
+ return r;
+ }
+
+ private LegendRecord createLegendRecord()
+ {
+ LegendRecord r = new LegendRecord();
+ r.setXAxisUpperLeft(3542);
+ r.setYAxisUpperLeft(1566);
+ r.setXSize(437);
+ r.setYSize(213);
+ r.setType(LegendRecord.TYPE_RIGHT);
+ r.setSpacing(LegendRecord.SPACING_MEDIUM);
+ r.setAutoPosition(true);
+ r.setAutoSeries(true);
+ r.setAutoXPositioning(true);
+ r.setAutoYPositioning(true);
+ r.setVertical(true);
+ r.setDataTable(false);
+ return r;
+ }
+
+ private BarRecord createBarRecord()
+ {
+ BarRecord r = new BarRecord();
+ r.setBarSpace((short)0);
+ r.setCategorySpace((short)150);
+ r.setHorizontal(false);
+ r.setStacked(false);
+ r.setDisplayAsPercentage(false);
+ r.setShadow(false);
+ return r;
+ }
+
+ private ChartFormatRecord createChartFormatRecord()
+ {
+ ChartFormatRecord r = new ChartFormatRecord();
+ r.setXPosition(0);
+ r.setYPosition(0);
+ r.setWidth(0);
+ r.setHeight(0);
+ r.setVaryDisplayPattern(false);
+ return r;
+ }
+
+ private PlotAreaRecord createPlotAreaRecord()
+ {
+ PlotAreaRecord r = new PlotAreaRecord( );
+ return r;
+ }
+
+ private AxisLineFormatRecord createAxisLineFormatRecord( short format )
+ {
+ AxisLineFormatRecord r = new AxisLineFormatRecord();
+ r.setAxisType( format );
+ return r;
+ }
+
+ private ValueRangeRecord createValueRangeRecord()
+ {
+ ValueRangeRecord r = new ValueRangeRecord();
+ r.setMinimumAxisValue( 0.0 );
+ r.setMaximumAxisValue( 0.0 );
+ r.setMajorIncrement( 0 );
+ r.setMinorIncrement( 0 );
+ r.setCategoryAxisCross( 0 );
+ r.setAutomaticMinimum( true );
+ r.setAutomaticMaximum( true );
+ r.setAutomaticMajor( true );
+ r.setAutomaticMinor( true );
+ r.setAutomaticCategoryCrossing( true );
+ r.setLogarithmicScale( false );
+ r.setValuesInReverse( false );
+ r.setCrossCategoryAxisAtMaximum( false );
+ r.setReserved( true ); // what's this do??
+ return r;
+ }
+
+ private TickRecord createTickRecord1()
+ {
+ TickRecord r = new TickRecord();
+ r.setMajorTickType( (byte) 2 );
+ r.setMinorTickType( (byte) 0 );
+ r.setLabelPosition( (byte) 3 );
+ r.setBackground( (byte) 1 );
+ r.setLabelColorRgb( 0 );
+ r.setZero1( (short) 0 );
+ r.setZero2( (short) 0 );
+ r.setZero3( (short) 45 );
+ r.setAutorotate( true );
+ r.setAutoTextBackground( true );
+ r.setRotation( (short) 0 );
+ r.setAutorotate( true );
+ r.setTickColor( (short) 77 );
+ return r;
+ }
+
+ private TickRecord createTickRecord2()
+ {
+ TickRecord r = createTickRecord1();
+ r.setZero3((short)0);
+ return r;
+ }
+
+ private AxisOptionsRecord createAxisOptionsRecord()
+ {
+ AxisOptionsRecord r = new AxisOptionsRecord();
+ r.setMinimumCategory( (short) -28644 );
+ r.setMaximumCategory( (short) -28715 );
+ r.setMajorUnitValue( (short) 2 );
+ r.setMajorUnit( (short) 0 );
+ r.setMinorUnitValue( (short) 1 );
+ r.setMinorUnit( (short) 0 );
+ r.setBaseUnit( (short) 0 );
+ r.setCrossingPoint( (short) -28644 );
+ r.setDefaultMinimum( true );
+ r.setDefaultMaximum( true );
+ r.setDefaultMajor( true );
+ r.setDefaultMinorUnit( true );
+ r.setIsDate( true );
+ r.setDefaultBase( true );
+ r.setDefaultCross( true );
+ r.setDefaultDateSettings( true );
+ return r;
+ }
+
+ private CategorySeriesAxisRecord createCategorySeriesAxisRecord()
+ {
+ CategorySeriesAxisRecord r = new CategorySeriesAxisRecord();
+ r.setCrossingPoint( (short) 1 );
+ r.setLabelFrequency( (short) 1 );
+ r.setTickMarkFrequency( (short) 1 );
+ r.setValueAxisCrossing( true );
+ r.setCrossesFarRight( false );
+ r.setReversed( false );
+ return r;
+ }
+
+ private AxisRecord createAxisRecord( short axisType )
+ {
+ AxisRecord r = new AxisRecord();
+ r.setAxisType( axisType );
+ return r;
+ }
+
+ private AxisParentRecord createAxisParentRecord()
+ {
+ AxisParentRecord r = new AxisParentRecord();
+ r.setAxisType( AxisParentRecord.AXIS_TYPE_MAIN );
+ r.setX( 479 );
+ r.setY( 221 );
+ r.setWidth( 2995 );
+ r.setHeight( 2902 );
+ return r;
+ }
+
+ private AxisUsedRecord createAxisUsedRecord( short numAxis )
+ {
+ AxisUsedRecord r = new AxisUsedRecord();
+ r.setNumAxis( numAxis );
+ return r;
+ }
+
+ private LinkedDataRecord createDirectLinkRecord()
+ {
+ LinkedDataRecord r = new LinkedDataRecord();
+ r.setLinkType( LinkedDataRecord.LINK_TYPE_TITLE_OR_TEXT );
+ r.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_DIRECT );
+ r.setCustomNumberFormat( false );
+ r.setIndexNumberFmtRecord( (short) 0 );
+ r.setFormulaOfLink( new LinkedDataFormulaField() );
+ return r;
+ }
+
+ private FontIndexRecord createFontIndexRecord( int index )
+ {
+ FontIndexRecord r = new FontIndexRecord();
+ r.setFontIndex( (short) index );
+ return r;
+ }
+
+ private TextRecord createAllTextRecord()
+ {
+ TextRecord r = new TextRecord();
+ r.setHorizontalAlignment( TextRecord.HORIZONTAL_ALIGNMENT_CENTER );
+ r.setVerticalAlignment( TextRecord.VERTICAL_ALIGNMENT_CENTER );
+ r.setDisplayMode( TextRecord.DISPLAY_MODE_TRANSPARENT );
+ r.setRgbColor( 0 );
+ r.setX( -37 );
+ r.setY( -60 );
+ r.setWidth( 0 );
+ r.setHeight( 0 );
+ r.setAutoColor( true );
+ r.setShowKey( false );
+ r.setShowValue( true );
+ r.setVertical( false );
+ r.setAutoGeneratedText( true );
+ r.setGenerated( true );
+ r.setAutoLabelDeleted( false );
+ r.setAutoBackground( true );
+ r.setRotation( (short) 0 );
+ r.setShowCategoryLabelAsPercentage( false );
+ r.setShowValueAsPercentage( false );
+ r.setShowBubbleSizes( false );
+ r.setShowLabel( false );
+ r.setIndexOfColorValue( (short) 77 );
+ r.setDataLabelPlacement( (short) 0 );
+ r.setTextRotation( (short) 0 );
+ return r;
+ }
+
+ private TextRecord createUnknownTextRecord()
+ {
+ TextRecord r = new TextRecord();
+ r.setHorizontalAlignment( TextRecord.HORIZONTAL_ALIGNMENT_CENTER );
+ r.setVerticalAlignment( TextRecord.VERTICAL_ALIGNMENT_CENTER );
+ r.setDisplayMode( TextRecord.DISPLAY_MODE_TRANSPARENT );
+ r.setRgbColor( 0 );
+ r.setX( -37 );
+ r.setY( -60 );
+ r.setWidth( 0 );
+ r.setHeight( 0 );
+ r.setAutoColor( true );
+ r.setShowKey( false );
+ r.setShowValue( false );
+ r.setVertical( false );
+ r.setAutoGeneratedText( true );
+ r.setGenerated( true );
+ r.setAutoLabelDeleted( false );
+ r.setAutoBackground( true );
+ r.setRotation( (short) 0 );
+ r.setShowCategoryLabelAsPercentage( false );
+ r.setShowValueAsPercentage( false );
+ r.setShowBubbleSizes( false );
+ r.setShowLabel( false );
+ r.setIndexOfColorValue( (short) 77 );
+ r.setDataLabelPlacement( (short) 11088 );
+ r.setTextRotation( (short) 0 );
+ return r;
+ }
+
+ private DefaultDataLabelTextPropertiesRecord createDefaultTextRecord( short categoryDataType )
+ {
+ DefaultDataLabelTextPropertiesRecord r = new DefaultDataLabelTextPropertiesRecord();
+ r.setCategoryDataType( categoryDataType );
+ return r;
+ }
+
+ private SheetPropertiesRecord createSheetPropsRecord()
+ {
+ SheetPropertiesRecord r = new SheetPropertiesRecord();
+ r.setChartTypeManuallyFormatted( false );
+ r.setPlotVisibleOnly( true );
+ r.setDoNotSizeWithWindow( false );
+ r.setDefaultPlotDimensions( true );
+ r.setAutoPlotArea( false );
+ return r;
+ }
+
+ private SeriesToChartGroupRecord createSeriesToChartGroupRecord()
+ {
+ return new SeriesToChartGroupRecord();
+ }
+
+ private DataFormatRecord createDataFormatRecord()
+ {
+ DataFormatRecord r = new DataFormatRecord();
+ r.setPointNumber( (short) -1 );
+ r.setSeriesIndex( (short) 0 );
+ r.setSeriesNumber( (short) 0 );
+ r.setUseExcel4Colors( false );
+ return r;
+ }
+
+ private LinkedDataRecord createCategoriesLinkedDataRecord()
+ {
+ LinkedDataRecord r = new LinkedDataRecord();
+ r.setLinkType( LinkedDataRecord.LINK_TYPE_CATEGORIES );
+ r.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_WORKSHEET );
+ r.setCustomNumberFormat( false );
+ r.setIndexNumberFmtRecord( (short) 0 );
+ LinkedDataFormulaField formula = new LinkedDataFormulaField();
+ Stack tokens = new Stack();
+ Area3DPtg p = new Area3DPtg();
+ p.setExternSheetIndex( (short) 0 );
+ p.setFirstColumn( (short) 1 );
+ p.setLastColumn( (short) 1 );
+ p.setFirstRow( (short) 0 );
+ p.setLastRow( (short) 31 );
+ tokens.add( p );
+ formula.setFormulaTokens( tokens );
+ r.setFormulaOfLink( formula );
+ return r;
+ }
+
+ private LinkedDataRecord createValuesLinkedDataRecord()
+ {
+ LinkedDataRecord r = new LinkedDataRecord();
+ r.setLinkType( LinkedDataRecord.LINK_TYPE_VALUES );
+ r.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_WORKSHEET );
+ r.setCustomNumberFormat( false );
+ r.setIndexNumberFmtRecord( (short) 0 );
+ LinkedDataFormulaField formula = new LinkedDataFormulaField();
+ Stack tokens = new Stack();
+ Area3DPtg p = new Area3DPtg();
+ p.setExternSheetIndex( (short) 0 );
+ p.setFirstColumn( (short) 0 );
+ p.setLastColumn( (short) 0 );
+ p.setFirstRow( (short) 0 );
+ p.setLastRow( (short) 31 );
+ tokens.add( p );
+ formula.setFormulaTokens( tokens );
+ r.setFormulaOfLink( formula );
+ return r;
+ }
+
+ private LinkedDataRecord createTitleLinkedDataRecord()
+ {
+ LinkedDataRecord r = new LinkedDataRecord();
+ r.setLinkType( LinkedDataRecord.LINK_TYPE_TITLE_OR_TEXT );
+ r.setReferenceType( LinkedDataRecord.REFERENCE_TYPE_DIRECT );
+ r.setCustomNumberFormat( false );
+ r.setIndexNumberFmtRecord( (short) 0 );
+ r.setFormulaOfLink( new LinkedDataFormulaField() );
+ return r;
+ }
+
+ private SeriesRecord createSeriesRecord()
+ {
+ SeriesRecord r = new SeriesRecord();
+ r.setCategoryDataType( SeriesRecord.CATEGORY_DATA_TYPE_NUMERIC );
+ r.setValuesDataType( SeriesRecord.VALUES_DATA_TYPE_NUMERIC );
+ r.setNumCategories( (short) 32 );
+ r.setNumValues( (short) 31 );
+ r.setBubbleSeriesType( SeriesRecord.BUBBLE_SERIES_TYPE_NUMERIC );
+ r.setNumBubbleValues( (short) 0 );
+ return r;
+ }
+
+ private EndRecord createEndRecord()
+ {
+ return new EndRecord();
+ }
+
+ private AreaFormatRecord createAreaFormatRecord1()
+ {
+ AreaFormatRecord r = new AreaFormatRecord();
+ r.setForegroundColor( 16777215 ); // RGB Color
+ r.setBackgroundColor( 0 ); // RGB Color
+ r.setPattern( (short) 1 ); // TODO: Add Pattern constants to record
+ r.setAutomatic( true );
+ r.setInvert( false );
+ r.setForecolorIndex( (short) 78 );
+ r.setBackcolorIndex( (short) 77 );
+ return r;
+ }
+
+ private AreaFormatRecord createAreaFormatRecord2()
+ {
+ AreaFormatRecord r = new AreaFormatRecord();
+ r.setForegroundColor(0x00c0c0c0);
+ r.setBackgroundColor(0x00000000);
+ r.setPattern((short)1);
+ r.setAutomatic(false);
+ r.setInvert(false);
+ r.setForecolorIndex((short)22);
+ r.setBackcolorIndex((short)79);
+ return r;
+ }
+
+ private LineFormatRecord createLineFormatRecord( boolean drawTicks )
+ {
+ LineFormatRecord r = new LineFormatRecord();
+ r.setLineColor( 0 );
+ r.setLinePattern( LineFormatRecord.LINE_PATTERN_SOLID );
+ r.setWeight( (short) -1 );
+ r.setAuto( true );
+ r.setDrawTicks( drawTicks );
+ r.setColourPaletteIndex( (short) 77 ); // what colour is this?
+ return r;
+ }
+
+ private LineFormatRecord createLineFormatRecord2()
+ {
+ LineFormatRecord r = new LineFormatRecord();
+ r.setLineColor( 0x00808080 );
+ r.setLinePattern( (short) 0 );
+ r.setWeight( (short) 0 );
+ r.setAuto( false );
+ r.setDrawTicks( false );
+ r.setUnknown( false );
+ r.setColourPaletteIndex( (short) 23 );
+ return r;
+ }
+
+ private FrameRecord createFrameRecord1()
+ {
+ FrameRecord r = new FrameRecord();
+ r.setBorderType( FrameRecord.BORDER_TYPE_REGULAR );
+ r.setAutoSize( false );
+ r.setAutoPosition( true );
+ return r;
+ }
+
+ private FrameRecord createFrameRecord2()
+ {
+ FrameRecord r = new FrameRecord();
+ r.setBorderType( FrameRecord.BORDER_TYPE_REGULAR );
+ r.setAutoSize( true );
+ r.setAutoPosition( true );
+ return r;
+ }
+
+ private PlotGrowthRecord createPlotGrowthRecord( int horizScale, int vertScale )
+ {
+ PlotGrowthRecord r = new PlotGrowthRecord();
+ r.setHorizontalScale( horizScale );
+ r.setVerticalScale( vertScale );
+ return r;
+ }
+
+ private SCLRecord createSCLRecord( short numerator, short denominator )
+ {
+ SCLRecord r = new SCLRecord();
+ r.setDenominator( denominator );
+ r.setNumerator( numerator );
+ return r;
+ }
+
+ private BeginRecord createBeginRecord()
+ {
+ return new BeginRecord();
+ }
+
+ private ChartRecord createChartRecord( int x, int y, int width, int height )
+ {
+ ChartRecord r = new ChartRecord();
+ r.setX( x );
+ r.setY( y );
+ r.setWidth( width );
+ r.setHeight( height );
+ return r;
+ }
+
+ private UnitsRecord createUnitsRecord()
+ {
+ UnitsRecord r = new UnitsRecord();
+ r.setUnits( (short) 0 );
+ return r;
+ }
+
+
+ /**
+ * A series in a chart
+ */
+ public class HSSFSeries {
+ private SeriesRecord series;
+ private SeriesTextRecord seriesTitleText;
+
+ /* package */ HSSFSeries(SeriesRecord series) {
+ this.series = series;
+ }
+
+ public short getNumValues() {
+ return series.getNumValues();
+ }
+ /**
+ * See {@link SeriesRecord}
+ */
+ public short getValueType() {
+ return series.getValuesDataType();
+ }
+
+ /**
+ * Returns the series' title, if there is one,
+ * or null if not
+ */
+ public String getSeriesTitle() {
+ if(seriesTitleText != null) {
+ return seriesTitleText.getText();
+ }
+ return null;
+ }
+
+ /**
+ * Changes the series' title, but only if there
+ * was one already.
+ * TODO - add in the records if not
+ */
+ public void setSeriesTitle(String title) {
+ if(seriesTitleText != null) {
+ seriesTitleText.setText(title);
+ } else {
+ throw new IllegalStateException("No series title found to change");
+ }
+ }
+ }
}
diff --git a/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java b/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java
index d28b8a877..d244d3372 100644
--- a/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java
+++ b/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java
@@ -14,26 +14,18 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
+
package org.apache.poi.hssf.usermodel;
-import java.io.File;
-import java.io.FileInputStream;
-
-import org.apache.poi.hssf.record.SeriesRecord;
-
import junit.framework.TestCase;
-public class TestHSSFChart extends TestCase {
- private String dirName;
+import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.record.SeriesRecord;
- protected void setUp() throws Exception {
- dirName = System.getProperty("HSSF.testdata.path");
- }
+public final class TestHSSFChart extends TestCase {
public void testSingleChart() throws Exception {
- HSSFWorkbook wb = new HSSFWorkbook(
- new FileInputStream(new File(dirName, "WithChart.xls"))
- );
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("WithChart.xls");
HSSFSheet s1 = wb.getSheetAt(0);
HSSFSheet s2 = wb.getSheetAt(1);
@@ -62,9 +54,7 @@ public class TestHSSFChart extends TestCase {
}
public void testTwoCharts() throws Exception {
- HSSFWorkbook wb = new HSSFWorkbook(
- new FileInputStream(new File(dirName, "WithTwoCharts.xls"))
- );
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("WithTwoCharts.xls");
HSSFSheet s1 = wb.getSheetAt(0);
HSSFSheet s2 = wb.getSheetAt(1);
@@ -96,9 +86,7 @@ public class TestHSSFChart extends TestCase {
}
public void testThreeCharts() throws Exception {
- HSSFWorkbook wb = new HSSFWorkbook(
- new FileInputStream(new File(dirName, "WithThreeCharts.xls"))
- );
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xls");
HSSFSheet s1 = wb.getSheetAt(0);
HSSFSheet s2 = wb.getSheetAt(1);
diff --git a/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java b/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java
index 0913ab725..cb028edfa 100644
--- a/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java
+++ b/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java
@@ -32,7 +32,7 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem;
*/
public final class TestExcelExtractor extends TestCase {
- private static final ExcelExtractor createExtractor(String sampleFileName) {
+ private static ExcelExtractor createExtractor(String sampleFileName) {
InputStream is = HSSFTestDataSamples.openSampleFileStream(sampleFileName);
@@ -192,18 +192,16 @@ public final class TestExcelExtractor extends TestCase {
* Embded in a non-excel file
*/
public void testWithEmbeded() throws Exception {
+ // TODO - encapsulate sys prop 'POIFS.testdata.path' similar to HSSFTestDataSamples
String pdirname = System.getProperty("POIFS.testdata.path");
String filename = pdirname + "/word_with_embeded.doc";
POIFSFileSystem fs = new POIFSFileSystem(
new FileInputStream(filename)
);
- DirectoryNode objPool = (DirectoryNode)
- fs.getRoot().getEntry("ObjectPool");
- DirectoryNode dirA = (DirectoryNode)
- objPool.getEntry("_1269427460");
- DirectoryNode dirB = (DirectoryNode)
- objPool.getEntry("_1269427461");
+ DirectoryNode objPool = (DirectoryNode) fs.getRoot().getEntry("ObjectPool");
+ DirectoryNode dirA = (DirectoryNode) objPool.getEntry("_1269427460");
+ DirectoryNode dirB = (DirectoryNode) objPool.getEntry("_1269427461");
HSSFWorkbook wbA = new HSSFWorkbook(dirA, fs, true);
HSSFWorkbook wbB = new HSSFWorkbook(dirB, fs, true);
@@ -224,16 +222,15 @@ public final class TestExcelExtractor extends TestCase {
* Excel embeded in excel
*/
public void testWithEmbededInOwn() throws Exception {
+ // TODO - encapsulate sys prop 'POIFS.testdata.path' similar to HSSFTestDataSamples
String pdirname = System.getProperty("POIFS.testdata.path");
String filename = pdirname + "/excel_with_embeded.xls";
POIFSFileSystem fs = new POIFSFileSystem(
new FileInputStream(filename)
);
- DirectoryNode dirA = (DirectoryNode)
- fs.getRoot().getEntry("MBD0000A3B5");
- DirectoryNode dirB = (DirectoryNode)
- fs.getRoot().getEntry("MBD0000A3B4");
+ DirectoryNode dirA = (DirectoryNode) fs.getRoot().getEntry("MBD0000A3B5");
+ DirectoryNode dirB = (DirectoryNode) fs.getRoot().getEntry("MBD0000A3B4");
HSSFWorkbook wbA = new HSSFWorkbook(dirA, fs, true);
HSSFWorkbook wbB = new HSSFWorkbook(dirB, fs, true);
@@ -260,15 +257,15 @@ public final class TestExcelExtractor extends TestCase {
* Test that we get text from headers and footers
*/
public void test45538() throws Exception {
- String[] files = new String[] {
+ String[] files = {
"45538_classic_Footer.xls", "45538_form_Footer.xls",
"45538_classic_Header.xls", "45538_form_Header.xls"
};
for(int i=0; inull
if no column info found for the specified column
+ */
+ public ColumnInfoRecord findColumnInfo(int columnIndex) {
+ int nInfos = records.size();
+ for(int i=0; i< nInfos; i++) {
+ ColumnInfoRecord ci = getColInfo(i);
+ if (ci.getFirstColumn() <= columnIndex && columnIndex <= ci.getLastColumn()) {
+ return ci;
+ }
+ }
+ return null;
+ }
+ public int getMaxOutlineLevel() {
+ int result = 0;
+ int count=records.size();
+ for (int i=0; i
@@ -40,7 +32,6 @@ import org.apache.poi.hssf.record.WindowTwoRecord;
*/
public final class DataValidityTable extends RecordAggregate {
- private static final short sid = -0x01B2; // not a real record
private final DVALRecord _headerRec;
/**
* The list of data validations for the current sheet.
@@ -57,120 +48,21 @@ public final class DataValidityTable extends RecordAggregate {
_validationList = temp;
}
- private DataValidityTable() {
+ public DataValidityTable() {
_headerRec = new DVALRecord();
_validationList = new ArrayList();
}
- public short getSid() {
- return sid;
- }
-
- public int serialize(int offset, byte[] data) {
- int result = _headerRec.serialize(offset, data);
+ public void visitContainedRecords(RecordVisitor rv) {
+ if (_validationList.isEmpty()) {
+ return;
+ }
+ rv.visitRecord(_headerRec);
for (int i = 0; i < _validationList.size(); i++) {
- result += ((Record) _validationList.get(i)).serialize(offset + result, data);
+ rv.visitRecord((Record) _validationList.get(i));
}
- return result;
- }
-
- public int getRecordSize() {
- int result = _headerRec.getRecordSize();
- for (int i = _validationList.size() - 1; i >= 0; i--) {
- result += ((Record) _validationList.get(i)).getRecordSize();
- }
- return result;
- }
-
- /**
- * Creates a new DataValidityTable and inserts it in the right
- * place in the sheetRecords list.
- */
- public static DataValidityTable createForSheet(List sheetRecords) {
- int index = findDVTableInsertPos(sheetRecords);
-
- DataValidityTable result = new DataValidityTable();
- sheetRecords.add(index, result);
- return result;
}
- /**
- * Finds the index where the sheet validations header record should be inserted
- * @param records the records for this sheet
- *
- * + WINDOW2
- * o SCL
- * o PANE
- * oo SELECTION
- * o STANDARDWIDTH
- * oo MERGEDCELLS
- * o LABELRANGES
- * o PHONETICPR
- * o Conditional Formatting Table
- * o Hyperlink Table
- * o Data Validity Table
- * o SHEETLAYOUT
- * o SHEETPROTECTION
- * o RANGEPROTECTION
- * + EOF
- */
- private static int findDVTableInsertPos(List records) {
- int i = records.size() - 1;
- if (!(records.get(i) instanceof EOFRecord)) {
- throw new IllegalStateException("Last sheet record should be EOFRecord");
- }
- while (i > 0) {
- i--;
- Record rec = (Record) records.get(i);
- if (isPriorRecord(rec.getSid())) {
- Record nextRec = (Record) records.get(i + 1);
- if (!isSubsequentRecord(nextRec.getSid())) {
- throw new IllegalStateException("Unexpected (" + nextRec.getClass().getName()
- + ") found after (" + rec.getClass().getName() + ")");
- }
- return i;
- }
- if (!isSubsequentRecord(rec.getSid())) {
- throw new IllegalStateException("Unexpected (" + rec.getClass().getName()
- + ") while looking for DV Table insert pos");
- }
- }
- return 0;
- }
-
- // TODO - add UninterpretedRecord as base class for many of these
- // unimplemented sids
-
- private static boolean isPriorRecord(short sid) {
- switch(sid) {
- case WindowTwoRecord.sid:
- case 0x00A0: // SCL
- case PaneRecord.sid:
- case SelectionRecord.sid:
- case 0x0099: // STANDARDWIDTH
- case MergeCellsRecord.sid:
- case 0x015F: // LABELRANGES
- case 0x00EF: // PHONETICPR
- case CFHeaderRecord.sid:
- case CFRuleRecord.sid:
- case HyperlinkRecord.sid:
- case 0x0800: // QUICKTIP
- return true;
- }
- return false;
- }
-
- private static boolean isSubsequentRecord(short sid) {
- switch(sid) {
- case 0x0862: // SHEETLAYOUT
- case 0x0867: // SHEETPROTECTION
- case 0x0868: // RANGEPROTECTION
- case EOFRecord.sid:
- return true;
- }
- return false;
- }
-
public void addDataValidation(DVRecord dvRecord) {
_validationList.add(dvRecord);
_headerRec.setDVRecNo(_validationList.size());
diff --git a/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java b/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java
new file mode 100644
index 000000000..b7384a019
--- /dev/null
+++ b/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java
@@ -0,0 +1,122 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record.aggregates;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.hssf.model.RecordStream;
+import org.apache.poi.hssf.record.MergeCellsRecord;
+import org.apache.poi.hssf.util.CellRangeAddress;
+import org.apache.poi.hssf.util.CellRangeAddressList;
+
+/**
+ *
+ * @author Josh Micich
+ */
+public final class MergedCellsTable extends RecordAggregate {
+ private static int MAX_MERGED_REGIONS = 1027; // enforced by the 8224 byte limit
+
+ private final List _mergedRegions;
+
+ /**
+ * Creates an empty aggregate
+ */
+ public MergedCellsTable() {
+ _mergedRegions = new ArrayList();
+ }
+
+ public MergedCellsTable(RecordStream rs) {
+ List temp = new ArrayList();
+ while (rs.peekNextClass() == MergeCellsRecord.class) {
+ MergeCellsRecord mcr = (MergeCellsRecord) rs.getNext();
+ int nRegions = mcr.getNumAreas();
+ for (int i = 0; i < nRegions; i++) {
+ temp.add(mcr.getAreaAt(i));
+ }
+ }
+ _mergedRegions = temp;
+ }
+
+ public int getRecordSize() {
+ // a bit cheaper than the default impl
+ int nRegions = _mergedRegions.size();
+ if (nRegions < 1) {
+ // no need to write a single empty MergeCellsRecord
+ return 0;
+ }
+ int nMergedCellsRecords = nRegions / MAX_MERGED_REGIONS;
+ int nLeftoverMergedRegions = nRegions % MAX_MERGED_REGIONS;
+
+ int result = nMergedCellsRecords
+ * (4 + CellRangeAddressList.getEncodedSize(MAX_MERGED_REGIONS)) + 4
+ + CellRangeAddressList.getEncodedSize(nLeftoverMergedRegions);
+ return result;
+ }
+
+ public void visitContainedRecords(RecordVisitor rv) {
+ int nRegions = _mergedRegions.size();
+ if (nRegions < 1) {
+ // no need to write a single empty MergeCellsRecord
+ return;
+ }
+
+ int nFullMergedCellsRecords = nRegions / MAX_MERGED_REGIONS;
+ int nLeftoverMergedRegions = nRegions % MAX_MERGED_REGIONS;
+ CellRangeAddress[] cras = new CellRangeAddress[nRegions];
+ _mergedRegions.toArray(cras);
+
+ for (int i = 0; i < nFullMergedCellsRecords; i++) {
+ int startIx = i * MAX_MERGED_REGIONS;
+ rv.visitRecord(new MergeCellsRecord(cras, startIx, MAX_MERGED_REGIONS));
+ }
+ if (nLeftoverMergedRegions > 0) {
+ int startIx = nFullMergedCellsRecords * MAX_MERGED_REGIONS;
+ rv.visitRecord(new MergeCellsRecord(cras, startIx, nLeftoverMergedRegions));
+ }
+ }
+
+ public void add(MergeCellsRecord mcr) {
+ _mergedRegions.add(mcr);
+ }
+
+ public CellRangeAddress get(int index) {
+ checkIndex(index);
+ return (CellRangeAddress) _mergedRegions.get(index);
+ }
+
+ public void remove(int index) {
+ checkIndex(index);
+ _mergedRegions.remove(index);
+ }
+
+ private void checkIndex(int index) {
+ if (index < 0 || index >= _mergedRegions.size()) {
+ throw new IllegalArgumentException("Specified CF index " + index
+ + " is outside the allowable range (0.." + (_mergedRegions.size() - 1) + ")");
+ }
+ }
+
+ public void addArea(int rowFrom, int colFrom, int rowTo, int colTo) {
+ _mergedRegions.add(new CellRangeAddress(rowFrom, rowTo, colFrom, colTo));
+ }
+
+ public int getNumberOfMergedRegions() {
+ return _mergedRegions.size();
+ }
+}
diff --git a/src/java/org/apache/poi/hssf/record/aggregates/RecordAggregate.java b/src/java/org/apache/poi/hssf/record/aggregates/RecordAggregate.java
index 3a86871e8..ce0bf8945 100644
--- a/src/java/org/apache/poi/hssf/record/aggregates/RecordAggregate.java
+++ b/src/java/org/apache/poi/hssf/record/aggregates/RecordAggregate.java
@@ -18,6 +18,7 @@
package org.apache.poi.hssf.record.aggregates;
import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RecordBase;
import org.apache.poi.hssf.record.RecordInputStream;
/**
@@ -27,15 +28,66 @@ import org.apache.poi.hssf.record.RecordInputStream;
*
* @author Josh Micich
*/
-public abstract class RecordAggregate extends Record {
- // TODO - convert existing aggregate classes to proper subclasses of this one
+public abstract class RecordAggregate extends RecordBase {
+ // TODO - delete these methods when all subclasses have been converted
protected final void validateSid(short id) {
- // TODO - break class hierarchy and make separate from Record
throw new RuntimeException("Should not be called");
}
protected final void fillFields(RecordInputStream in) {
throw new RuntimeException("Should not be called");
}
- // force subclassses to provide better implementation than default
- public abstract int getRecordSize();
+ public final short getSid() {
+ throw new RuntimeException("Should not be called");
+ }
+
+ public abstract void visitContainedRecords(RecordVisitor rv);
+
+ public final int serialize(int offset, byte[] data) {
+ SerializingRecordVisitor srv = new SerializingRecordVisitor(data, offset);
+ visitContainedRecords(srv);
+ return srv.countBytesWritten();
+ }
+ public int getRecordSize() {
+ RecordSizingVisitor rsv = new RecordSizingVisitor();
+ visitContainedRecords(rsv);
+ return rsv.getTotalSize();
+ }
+
+ public interface RecordVisitor {
+ void visitRecord(Record r);
+ }
+
+ private static final class SerializingRecordVisitor implements RecordVisitor {
+
+ private final byte[] _data;
+ private final int _startOffset;
+ private int _countBytesWritten;
+
+ public SerializingRecordVisitor(byte[] data, int startOffset) {
+ _data = data;
+ _startOffset = startOffset;
+ _countBytesWritten = 0;
+ }
+ public int countBytesWritten() {
+ return _countBytesWritten;
+ }
+ public void visitRecord(Record r) {
+ int currentOffset = _startOffset + _countBytesWritten;
+ _countBytesWritten += r.serialize(currentOffset, _data);
+ }
+ }
+ private static final class RecordSizingVisitor implements RecordVisitor {
+
+ private int _totalSize;
+
+ public RecordSizingVisitor() {
+ _totalSize = 0;
+ }
+ public int getTotalSize() {
+ return _totalSize;
+ }
+ public void visitRecord(Record r) {
+ _totalSize += r.getRecordSize();
+ }
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
index 8deaa919f..3c9404ac3 100644
--- a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
@@ -25,7 +25,6 @@ import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian;
-
/**
* Title: Area 3D Ptg - 3D reference (Sheet + Area)null
*/
public int[] getRowBreaks(){
//we can probably cache this information, but this should be a sparsely used function
- int count = sheet.getNumRowBreaks();
- if (count > 0) {
- int[] returnValue = new int[count];
- Iterator iterator = sheet.getRowBreaks();
- int i = 0;
- while (iterator.hasNext()) {
- PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
- returnValue[i++] = breakItem.main;
- }
- return returnValue;
- }
- return null;
+ return sheet.getRowBreaks();
}
/**
- * Retrieves all the vertical page breaks
- * @return all the vertical page breaks, or null if there are no column page breaks
+ * @return column indexes of all the vertical page breaks, never null
*/
- public short[] getColumnBreaks(){
+ public int[] getColumnBreaks(){
//we can probably cache this information, but this should be a sparsely used function
- int count = sheet.getNumColumnBreaks();
- if (count > 0) {
- short[] returnValue = new short[count];
- Iterator iterator = sheet.getColumnBreaks();
- int i = 0;
- while (iterator.hasNext()) {
- PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
- returnValue[i++] = breakItem.main;
- }
- return returnValue;
- }
- return null;
+ return sheet.getColumnBreaks();
}
diff --git a/src/java/org/apache/poi/ss/util/CellRangeAddressList.java b/src/java/org/apache/poi/ss/util/CellRangeAddressList.java
index 8773c34ee..72b588248 100644
--- a/src/java/org/apache/poi/ss/util/CellRangeAddressList.java
+++ b/src/java/org/apache/poi/ss/util/CellRangeAddressList.java
@@ -99,7 +99,14 @@ public class CellRangeAddressList {
}
public int getSize() {
- return 2 + CellRangeAddress.getEncodedSize(_list.size());
+ return getEncodedSize(_list.size());
+ }
+ /**
+ * @return the total size of for the specified number of ranges,
+ * including the initial 2 byte range count
+ */
+ public static int getEncodedSize(int numberOfRanges) {
+ return 2 + CellRangeAddress.getEncodedSize(numberOfRanges);
}
public int serialize(int offset, byte[] data) {
diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
index 055f8452d..b04b5d453 100644
--- a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
+++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
@@ -631,7 +631,7 @@ public interface Sheet extends Iterable