You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by dm...@apache.org on 2003/05/08 02:02:03 UTC
cvs commit: jakarta-poi/src/testcases/org/apache/poi/hssf/record/aggregates TestValueRecordsAggregate.java
dmui 2003/05/07 17:02:03
Modified: src/java/org/apache/poi/hssf/dev BiffViewer.java
src/java/org/apache/poi/hssf/eventmodel
EventRecordFactory.java
src/java/org/apache/poi/hssf/record RecordFactory.java
src/java/org/apache/poi/hssf/record/aggregates
FormulaRecordAggregate.java
ValueRecordsAggregate.java
src/java/org/apache/poi/hssf/record/formula ExpPtg.java
src/testcases/org/apache/poi/hssf/record
TestFormulaRecord.java
Added: src/java/org/apache/poi/hssf/record SharedFormulaRecord.java
src/testcases/org/apache/poi/hssf/record/aggregates
TestValueRecordsAggregate.java
Log:
Patch to support reading in Shared Formulas
1) Added new Record: SharedFormulaRecord that is basically a storage area
2) Enabled ExpPtg to store and serialize data for repeating formulas
3) Updated the aggregates to store the SharedFormulaRecord appropriately
Revision Changes Path
1.31 +3 -0 jakarta-poi/src/java/org/apache/poi/hssf/dev/BiffViewer.java
Index: BiffViewer.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/dev/BiffViewer.java,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- BiffViewer.java 30 Apr 2003 04:39:11 -0000 1.30
+++ BiffViewer.java 8 May 2003 00:02:03 -0000 1.31
@@ -630,6 +630,9 @@
case PaneRecord.sid:
retval = new PaneRecord( rectype, size, data );
break;
+ case SharedFormulaRecord.sid:
+ retval = new SharedFormulaRecord( rectype, size, data);
+ break;
default:
retval = new UnknownRecord( rectype, size, data );
}
1.5 +8 -5 jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java
Index: EventRecordFactory.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- EventRecordFactory.java 30 Apr 2003 04:39:19 -0000 1.4
+++ EventRecordFactory.java 8 May 2003 00:02:03 -0000 1.5
@@ -54,12 +54,14 @@
*/
package org.apache.poi.hssf.eventmodel;
-import java.io.InputStream;
import java.io.IOException;
-
-import java.util.*;
-
+import java.io.InputStream;
import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BackupRecord;
@@ -126,6 +128,7 @@
import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.hssf.record.SaveRecalcRecord;
import org.apache.poi.hssf.record.SelectionRecord;
+import org.apache.poi.hssf.record.SharedFormulaRecord;
import org.apache.poi.hssf.record.StringRecord;
import org.apache.poi.hssf.record.StyleRecord;
import org.apache.poi.hssf.record.TabIdRecord;
@@ -189,7 +192,7 @@
BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class,
LeftMarginRecord.class, RightMarginRecord.class,
TopMarginRecord.class, BottomMarginRecord.class,
- PaletteRecord.class, StringRecord.class
+ PaletteRecord.class, StringRecord.class, SharedFormulaRecord.class
};
}
1.16 +2 -2 jakarta-poi/src/java/org/apache/poi/hssf/record/RecordFactory.java
Index: RecordFactory.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/RecordFactory.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- RecordFactory.java 30 Apr 2003 04:38:47 -0000 1.15
+++ RecordFactory.java 8 May 2003 00:02:03 -0000 1.16
@@ -112,7 +112,7 @@
FormulaRecord.class, BoolErrRecord.class, ExternSheetRecord.class,
NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class,
TopMarginRecord.class, BottomMarginRecord.class,
- PaletteRecord.class, StringRecord.class, RecalcIdRecord.class
+ PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class
};
} else {
records = new Class[]
@@ -143,7 +143,7 @@
BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class,
LeftMarginRecord.class, RightMarginRecord.class,
TopMarginRecord.class, BottomMarginRecord.class,
- PaletteRecord.class, StringRecord.class, RecalcIdRecord.class
+ PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class
};
}
1.1 jakarta-poi/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java
Index: SharedFormulaRecord.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hssf.record;
import org.apache.poi.util.LittleEndian;
/**
* Title: SharedFormulaRecord
* Description: Primarily used as an excel optimization so that multiple similar formulas
* are not written out too many times. We should recognize this record and
* serialize as is since this is used when reading templates.
* <p>
* Note: the documentation says that the SID is BC where biffviewer reports 4BC. The hex dump shows
* that the two byte sid representation to be 'BC 04' that is consistent with the other high byte
* record types.
* @author Danny Mui at apache dot org
*/
public class SharedFormulaRecord
extends Record
{
public final static short sid = 0x4BC;
private short size = 0;
private byte[] thedata = null;
int offset = 0;
public SharedFormulaRecord()
{
}
/**
* construct the sharedformula record, save all the information
* @param id id of the record -not validated, just stored for serialization
* @param size size of the data
* @param data the data
*/
public SharedFormulaRecord(short id, short size, byte [] data)
{
super(id, size, data);
this.fillFields(data, size, 0);
}
/**
* spit the record out AS IS. no interperatation or identification
*/
public int serialize(int offset, byte [] data)
{
if (thedata == null)
{
thedata = new byte[ 0 ];
}
LittleEndian.putShort(data, 0 + offset, sid);
LittleEndian.putShort(data, 2 + offset, ( short ) (thedata.length));
if (thedata.length > 0)
{
System.arraycopy(thedata, 0, data, 4 + offset, thedata.length);
}
return getRecordSize();
}
public int getRecordSize()
{
int retval = 4;
if (thedata != null)
{
retval += thedata.length;
}
return retval;
}
protected void validateSid(short id)
{
if (id != this.sid)
{
throw new RecordFormatException("Not a valid SharedFormula");
}
}
/**
* print a sort of string representation ([SHARED FORMULA RECORD] id = x [/SHARED FORMULA RECORD])
*/
public String toString()
{
StringBuffer buffer = new StringBuffer();
buffer.append("[SHARED FORMULA RECORD:" + Integer.toHexString(sid) + "]\n");
buffer.append(" .id = ").append(Integer.toHexString(sid))
.append("\n");
buffer.append("[/SHARED FORMULA RECORD]\n");
return buffer.toString();
}
public short getSid()
{
return this.sid;
}
/**
* Shared formulas are to treated like unknown records, and as a result d
*/
protected void fillFields(byte [] data, short size, int offset)
{
thedata = new byte[size];
System.arraycopy(data, 0, thedata, 0, size);
}
/**
* Mirroring formula records so it is registered in the ValueRecordsAggregate
*/
public boolean isInValueSection()
{
return true;
}
/**
* Register it in the ValueRecordsAggregate so it can go into the FormulaRecordAggregate
*/
public boolean isValue() {
return true;
}
public Object clone() {
SharedFormulaRecord rec = new SharedFormulaRecord();
rec.offset = offset;
rec.size = size;
rec.thedata = thedata;
return rec;
}
}
1.4 +27 -1 jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggregate.java
Index: FormulaRecordAggregate.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggregate.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FormulaRecordAggregate.java 30 Apr 2003 04:39:20 -0000 1.3
+++ FormulaRecordAggregate.java 8 May 2003 00:02:03 -0000 1.4
@@ -58,7 +58,7 @@
/**
* The formula record aggregate is used to join together the formula record and it's
- * (optional) string record.
+ * (optional) string record and (optional) Shared Formula Record (template reads, excel optimization).
*
* @author Glen Stampoultzis (glens at apache.org)
*/
@@ -70,6 +70,11 @@
private FormulaRecord formulaRecord;
private StringRecord stringRecord;
+
+ /**
+ * will only be set through the RecordFactory
+ */
+ private SharedFormulaRecord sharedFormulaRecord;
public FormulaRecordAggregate( FormulaRecord formulaRecord, StringRecord stringRecord )
{
@@ -105,7 +110,12 @@
{
pos += stringRecord.serialize(pos, data);
}
+ if (this.getSharedFormulaRecord() != null)
+ {
+ pos += getSharedFormulaRecord().serialize(pos, data);
+ }
return pos - offset;
+
}
/**
@@ -114,6 +124,7 @@
public int getRecordSize()
{
int size = formulaRecord.getRecordSize() + (stringRecord == null ? 0 : stringRecord.getRecordSize());
+ size += (getSharedFormulaRecord() == null) ? 0 : getSharedFormulaRecord().getRecordSize();
return size;
}
@@ -214,5 +225,20 @@
}
+
+ /**
+ * @return SharedFormulaRecord
+ */
+ public SharedFormulaRecord getSharedFormulaRecord() {
+ return sharedFormulaRecord;
+ }
+
+ /**
+ * Sets the sharedFormulaRecord, only set from RecordFactory since they are not generated by POI and are an Excel optimization
+ * @param sharedFormulaRecord The sharedFormulaRecord to set
+ */
+ public void setSharedFormulaRecord(SharedFormulaRecord sharedFormulaRecord) {
+ this.sharedFormulaRecord = sharedFormulaRecord;
+ }
}
1.8 +5 -0 jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java
Index: ValueRecordsAggregate.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ValueRecordsAggregate.java 30 Apr 2003 04:39:20 -0000 1.7
+++ ValueRecordsAggregate.java 8 May 2003 00:02:03 -0000 1.8
@@ -157,6 +157,11 @@
{
lastFormulaAggregate.setStringRecord((StringRecord)rec);
}
+ else if (rec instanceof SharedFormulaRecord)
+ {
+ //these follow the first formula in a group
+ lastFormulaAggregate.setSharedFormulaRecord((SharedFormulaRecord)rec);
+ }
else if (rec.isValue())
{
insertCell(( CellValueRecordInterface ) rec);
1.7 +7 -0 jakarta-poi/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
Index: ExpPtg.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ExpPtg.java 30 Apr 2003 04:39:02 -0000 1.6
+++ ExpPtg.java 8 May 2003 00:02:03 -0000 1.7
@@ -66,6 +66,7 @@
*
* @author andy
* @author Jason Height (jheight at chariot dot net dot au)
+ * @author dmui (save existing implementation)
*/
public class ExpPtg
@@ -73,6 +74,7 @@
{
private final static int SIZE = 5;
public final static short sid = 0x1;
+ private byte[] existing = null;
/** Creates new ExpPtg */
@@ -84,10 +86,15 @@
public ExpPtg(byte [] array, int offset)
{
+ existing = new byte[this.getSize()];
+ System.arraycopy(array, offset, existing, 0, this.getSize());
}
public void writeBytes(byte [] array, int offset)
{
+ if (existing != null) {
+ System.arraycopy(existing, 0, array, offset, existing.length);
+ }
}
public int getSize()
1.5 +24 -0 jakarta-poi/src/testcases/org/apache/poi/hssf/record/TestFormulaRecord.java
Index: TestFormulaRecord.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/record/TestFormulaRecord.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- TestFormulaRecord.java 30 Apr 2003 04:39:04 -0000 1.4
+++ TestFormulaRecord.java 8 May 2003 00:02:03 -0000 1.5
@@ -121,6 +121,30 @@
}
+ /**
+ * Tests to see if the shared formula cells properly reserialize the expPtg
+ *
+ */
+ public void testExpFormula() {
+ byte[] formulaByte = new byte[27];
+
+ for (int i = 0; i < formulaByte.length; i++) formulaByte[i] = (byte)0;
+
+ formulaByte[4] =(byte)0x0F;
+ formulaByte[14]=(byte)0x08;
+ formulaByte[18]=(byte)0xE0;
+ formulaByte[19]=(byte)0xFD;
+ formulaByte[20]=(byte)0x05;
+ formulaByte[22]=(byte)0x01;
+ FormulaRecord record = new FormulaRecord(FormulaRecord.sid, (short)27, formulaByte);
+ assertEquals("Row", 0, record.getRow());
+ assertEquals("Column", 0, record.getColumn());
+ byte[] output = record.serialize();
+ assertEquals("Output size", 31, output.length); //includes sid+recordlength
+ assertEquals("Offset 22", 1, output[26]);
+ }
+
+
public static void main(String [] ignored_args)
{
String filename = System.getProperty("HSSF.testdata.path");
1.1 jakarta-poi/src/testcases/org/apache/poi/hssf/record/aggregates/TestValueRecordsAggregate.java
Index: TestValueRecordsAggregate.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hssf.record.aggregates;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hssf.record.FormulaRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.SharedFormulaRecord;
public class TestValueRecordsAggregate extends junit.framework.TestCase {
public TestValueRecordsAggregate(String name) {
super (name);
}
/**
* Make sure the shared formula makes it to the FormulaRecordAggregate when being parsed
* as part of the value records
*
*/
public void testSharedFormula() {
List records = new ArrayList();
records.add(new FormulaRecord());
records.add(new SharedFormulaRecord());
ValueRecordsAggregate valueRecord = new ValueRecordsAggregate();
valueRecord.construct(0, records);
Iterator iterator = valueRecord.getIterator();
Record record = (Record)iterator.next();
assertNotNull("Row contains a value", record);
assertTrue("First record is a FormulaRecordsAggregate", (record instanceof FormulaRecordAggregate));
FormulaRecordAggregate aggregate = (FormulaRecordAggregate)record;
assertNotNull("SharedFormulaRecord is null", aggregate.getSharedFormulaRecord());
}
public static void main(String [] args) {
System.out
.println("Testing org.apache.poi.hssf.record.aggregates.TestValueRecordAggregate");
junit.textui.TestRunner.run(TestValueRecordsAggregate.class);
}
}
Re: cvs commit:
jakarta-poi/src/testcases/org/apache/poi/hssf/record/aggregates
TestValueRecordsAggregate.java
Posted by "Andrew C. Oliver" <ac...@apache.org>.
Apparently though I'm not sure how it happened.
On 5/7/03 9:07 PM, "Danny Mui" <da...@muibros.com> wrote:
> ya, that's why I asked about the SID earlier hehe. there's a cvs list now??
>
> Andrew C. Oliver wrote:
>
>> Very cool. Who did this? You?
>>
>> Thanks!
>>
>> -Andy
>>
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: poi-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: poi-dev-help@jakarta.apache.org
>
--
Andrew C. Oliver
http://www.superlinksoftware.com/poi.jsp
Custom enhancements and Commercial Implementation for Jakarta POI
http://jakarta.apache.org/poi
For Java and Excel, Got POI?
Re: cvs commit: jakarta-poi/src/testcases/org/apache/poi/hssf/record/aggregates
TestValueRecordsAggregate.java
Posted by Danny Mui <da...@muibros.com>.
ya, that's why I asked about the SID earlier hehe. there's a cvs list now??
Andrew C. Oliver wrote:
>Very cool. Who did this? You?
>
>Thanks!
>
>-Andy
>
>
Re: cvs commit:
jakarta-poi/src/testcases/org/apache/poi/hssf/record/aggregates
TestValueRecordsAggregate.java
Posted by "Andrew C. Oliver" <ac...@apache.org>.
Very cool. Who did this? You?
Thanks!
-Andy
On 5/7/03 8:02 PM, "dmui@apache.org" <dm...@apache.org> wrote:
> dmui 2003/05/07 17:02:03
>
> Modified: src/java/org/apache/poi/hssf/dev BiffViewer.java
> src/java/org/apache/poi/hssf/eventmodel
> EventRecordFactory.java
> src/java/org/apache/poi/hssf/record RecordFactory.java
> src/java/org/apache/poi/hssf/record/aggregates
> FormulaRecordAggregate.java
> ValueRecordsAggregate.java
> src/java/org/apache/poi/hssf/record/formula ExpPtg.java
> src/testcases/org/apache/poi/hssf/record
> TestFormulaRecord.java
> Added: src/java/org/apache/poi/hssf/record SharedFormulaRecord.java
> src/testcases/org/apache/poi/hssf/record/aggregates
> TestValueRecordsAggregate.java
> Log:
> Patch to support reading in Shared Formulas
> 1) Added new Record: SharedFormulaRecord that is basically a storage area
> 2) Enabled ExpPtg to store and serialize data for repeating formulas
> 3) Updated the aggregates to store the SharedFormulaRecord appropriately
>
> Revision Changes Path
> 1.31 +3 -0
> jakarta-poi/src/java/org/apache/poi/hssf/dev/BiffViewer.java
>
> Index: BiffViewer.java
> ===================================================================
> RCS file:
> /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/dev/BiffViewer.java,v
> retrieving revision 1.30
> retrieving revision 1.31
> diff -u -r1.30 -r1.31
> --- BiffViewer.java 30 Apr 2003 04:39:11 -0000 1.30
> +++ BiffViewer.java 8 May 2003 00:02:03 -0000 1.31
> @@ -630,6 +630,9 @@
> case PaneRecord.sid:
> retval = new PaneRecord( rectype, size, data );
> break;
> + case SharedFormulaRecord.sid:
> + retval = new SharedFormulaRecord( rectype, size, data);
> + break;
> default:
> retval = new UnknownRecord( rectype, size, data );
> }
>
>
>
> 1.5 +8 -5
> jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java
>
> Index: EventRecordFactory.java
> ===================================================================
> RCS file:
> /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/EventRecordFacto
> ry.java,v
> retrieving revision 1.4
> retrieving revision 1.5
> diff -u -r1.4 -r1.5
> --- EventRecordFactory.java 30 Apr 2003 04:39:19 -0000 1.4
> +++ EventRecordFactory.java 8 May 2003 00:02:03 -0000 1.5
> @@ -54,12 +54,14 @@
> */
> package org.apache.poi.hssf.eventmodel;
>
> -import java.io.InputStream;
> import java.io.IOException;
> -
> -import java.util.*;
> -
> +import java.io.InputStream;
> import java.lang.reflect.Constructor;
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Map;
>
> import org.apache.poi.hssf.record.BOFRecord;
> import org.apache.poi.hssf.record.BackupRecord;
> @@ -126,6 +128,7 @@
> import org.apache.poi.hssf.record.SSTRecord;
> import org.apache.poi.hssf.record.SaveRecalcRecord;
> import org.apache.poi.hssf.record.SelectionRecord;
> +import org.apache.poi.hssf.record.SharedFormulaRecord;
> import org.apache.poi.hssf.record.StringRecord;
> import org.apache.poi.hssf.record.StyleRecord;
> import org.apache.poi.hssf.record.TabIdRecord;
> @@ -189,7 +192,7 @@
> BoolErrRecord.class, ExternSheetRecord.class,
> NameRecord.class,
> LeftMarginRecord.class, RightMarginRecord.class,
> TopMarginRecord.class, BottomMarginRecord.class,
> - PaletteRecord.class, StringRecord.class
> + PaletteRecord.class, StringRecord.class,
> SharedFormulaRecord.class
> };
>
> }
>
>
>
> 1.16 +2 -2
> jakarta-poi/src/java/org/apache/poi/hssf/record/RecordFactory.java
>
> Index: RecordFactory.java
> ===================================================================
> RCS file:
> /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/RecordFactory.java,v
> retrieving revision 1.15
> retrieving revision 1.16
> diff -u -r1.15 -r1.16
> --- RecordFactory.java 30 Apr 2003 04:38:47 -0000 1.15
> +++ RecordFactory.java 8 May 2003 00:02:03 -0000 1.16
> @@ -112,7 +112,7 @@
> FormulaRecord.class, BoolErrRecord.class,
> ExternSheetRecord.class,
> NameRecord.class, LeftMarginRecord.class,
> RightMarginRecord.class,
> TopMarginRecord.class, BottomMarginRecord.class,
> - PaletteRecord.class, StringRecord.class, RecalcIdRecord.class
> + PaletteRecord.class, StringRecord.class,
> RecalcIdRecord.class, SharedFormulaRecord.class
> };
> } else {
> records = new Class[]
> @@ -143,7 +143,7 @@
> BoolErrRecord.class, ExternSheetRecord.class,
> NameRecord.class,
> LeftMarginRecord.class, RightMarginRecord.class,
> TopMarginRecord.class, BottomMarginRecord.class,
> - PaletteRecord.class, StringRecord.class, RecalcIdRecord.class
> + PaletteRecord.class, StringRecord.class,
> RecalcIdRecord.class, SharedFormulaRecord.class
> };
>
> }
>
>
>
> 1.1
> jakarta-poi/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java
>
> Index: SharedFormulaRecord.java
> ===================================================================
>
> /* ====================================================================
> * The Apache Software License, Version 1.1
> *
> * Copyright (c) 2003 The Apache Software Foundation. All rights
> * reserved.
> *
> * Redistribution and use in source and binary forms, with or without
> * modification, are permitted provided that the following conditions
> * are met:
> *
> * 1. Redistributions of source code must retain the above copyright
> * notice, this list of conditions and the following disclaimer.
> *
> * 2. Redistributions in binary form must reproduce the above copyright
> * notice, this list of conditions and the following disclaimer in
> * the documentation and/or other materials provided with the
> * distribution.
> *
> * 3. The end-user documentation included with the redistribution,
> * if any, must include the following acknowledgment:
> * "This product includes software developed by the
> * Apache Software Foundation (http://www.apache.org/)."
> * Alternately, this acknowledgment may appear in the software itself,
> * if and wherever such third-party acknowledgments normally appear.
> *
> * 4. The names "Apache" and "Apache Software Foundation" and
> * "Apache POI" must not be used to endorse or promote products
> * derived from this software without prior written permission. For
> * written permission, please contact apache@apache.org.
> *
> * 5. Products derived from this software may not be called "Apache",
> * "Apache POI", nor may "Apache" appear in their name, without
> * prior written permission of the Apache Software Foundation.
> *
> * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
> * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
> * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> * SUCH DAMAGE.
> * ====================================================================
> *
> * This software consists of voluntary contributions made by many
> * individuals on behalf of the Apache Software Foundation. For more
> * information on the Apache Software Foundation, please see
> * <http://www.apache.org/>.
> */
>
> package org.apache.poi.hssf.record;
>
> import org.apache.poi.util.LittleEndian;
>
> /**
> * Title: SharedFormulaRecord
> * Description: Primarily used as an excel optimization so that multiple
> similar formulas
> * are not written out too many times. We should recognize
this record
> and
> * serialize as is since this is used when reading templates.
> * <p>
> * Note: the documentation says that the SID is BC where biffviewer reports
> 4BC. The hex dump shows
> * that the two byte sid representation to be 'BC 04' that is consistent with
> the other high byte
> * record types.
> * @author Danny Mui at apache dot org
> */
>
> public class SharedFormulaRecord
> extends Record
> {
> public final static short sid = 0x4BC;
> private short size = 0;
> private byte[] thedata = null;
> int offset = 0;
>
> public SharedFormulaRecord()
> {
> }
>
> /**
> * construct the sharedformula record, save all the information
> * @param id id of the record -not validated, just stored for
> serialization
> * @param size size of the data
> * @param data the data
> */
>
> public SharedFormulaRecord(short id, short size, byte [] data)
> {
> super(id, size, data);
>
> this.fillFields(data, size, 0);
> }
>
> /**
> * spit the record out AS IS. no interperatation or identification
> */
>
> public int serialize(int offset, byte [] data)
> {
> if (thedata == null)
> {
> thedata = new byte[ 0 ];
> }
> LittleEndian.putShort(data, 0 + offset, sid);
> LittleEndian.putShort(data, 2 + offset, ( short ) (thedata.length));
> if (thedata.length > 0)
> {
> System.arraycopy(thedata, 0, data, 4 + offset, thedata.length);
> }
> return getRecordSize();
> }
>
> public int getRecordSize()
> {
> int retval = 4;
>
> if (thedata != null)
> {
> retval += thedata.length;
> }
> return retval;
> }
>
>
> protected void validateSid(short id)
> {
> if (id != this.sid)
> {
> throw new RecordFormatException("Not a valid SharedFormula");
> }
>
> }
>
> /**
> * print a sort of string representation ([SHARED FORMULA RECORD] id = x
> [/SHARED FORMULA RECORD])
> */
>
> public String toString()
> {
> StringBuffer buffer = new StringBuffer();
>
> buffer.append("[SHARED FORMULA RECORD:" + Integer.toHexString(sid) +
> "]\n");
> buffer.append(" .id = ").append(Integer.toHexString(sid))
> .append("\n");
> buffer.append("[/SHARED FORMULA RECORD]\n");
> return buffer.toString();
> }
>
> public short getSid()
> {
> return this.sid;
> }
>
> /**
> * Shared formulas are to treated like unknown records, and as a result d
> */
> protected void fillFields(byte [] data, short size, int offset)
> {
> thedata = new byte[size];
> System.arraycopy(data, 0, thedata, 0, size);
>
> }
>
> /**
> * Mirroring formula records so it is registered in the ValueRecordsAggregate
> */
> public boolean isInValueSection()
> {
> return true;
> }
>
>
> /**
> * Register it in the ValueRecordsAggregate so it can go into the
> FormulaRecordAggregate
> */
> public boolean isValue() {
> return true;
> }
>
> public Object clone() {
> SharedFormulaRecord rec = new SharedFormulaRecord();
> rec.offset = offset;
> rec.size = size;
> rec.thedata = thedata;
> return rec;
> }
> }
>
>
>
> 1.4 +27 -1
> jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggreg
> ate.java
>
> Index: FormulaRecordAggregate.java
> ===================================================================
> RCS file:
> /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/FormulaRe
> cordAggregate.java,v
> retrieving revision 1.3
> retrieving revision 1.4
> diff -u -r1.3 -r1.4
> --- FormulaRecordAggregate.java 30 Apr 2003 04:39:20 -0000 1.3
> +++ FormulaRecordAggregate.java 8 May 2003 00:02:03 -0000 1.4
> @@ -58,7 +58,7 @@
>
> /**
> * The formula record aggregate is used to join together the formula record
> and it's
> - * (optional) string record.
> + * (optional) string record and (optional) Shared Formula Record (template
> reads, excel optimization).
> *
> * @author Glen Stampoultzis (glens at apache.org)
> */
> @@ -70,6 +70,11 @@
>
> private FormulaRecord formulaRecord;
> private StringRecord stringRecord;
> +
> + /**
> + * will only be set through the RecordFactory
> + */
> + private SharedFormulaRecord sharedFormulaRecord;
>
> public FormulaRecordAggregate( FormulaRecord formulaRecord, StringRecord
> stringRecord )
> {
> @@ -105,7 +110,12 @@
> {
> pos += stringRecord.serialize(pos, data);
> }
> + if (this.getSharedFormulaRecord() != null)
> + {
> + pos += getSharedFormulaRecord().serialize(pos, data);
> + }
> return pos - offset;
> +
> }
>
> /**
> @@ -114,6 +124,7 @@
> public int getRecordSize()
> {
> int size = formulaRecord.getRecordSize() + (stringRecord == null ? 0
> : stringRecord.getRecordSize());
> + size += (getSharedFormulaRecord() == null) ? 0 :
> getSharedFormulaRecord().getRecordSize();
> return size;
> }
>
> @@ -214,5 +225,20 @@
> }
>
>
> +
> + /**
> + * @return SharedFormulaRecord
> + */
> + public SharedFormulaRecord getSharedFormulaRecord() {
> + return sharedFormulaRecord;
> + }
> +
> + /**
> + * Sets the sharedFormulaRecord, only set from RecordFactory since they
> are not generated by POI and are an Excel optimization
> + * @param sharedFormulaRecord The sharedFormulaRecord to set
> + */
> + public void setSharedFormulaRecord(SharedFormulaRecord
> sharedFormulaRecord) {
> + this.sharedFormulaRecord = sharedFormulaRecord;
> + }
>
> }
>
>
>
> 1.8 +5 -0
> jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggrega
> te.java
>
> Index: ValueRecordsAggregate.java
> ===================================================================
> RCS file:
> /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/ValueReco
> rdsAggregate.java,v
> retrieving revision 1.7
> retrieving revision 1.8
> diff -u -r1.7 -r1.8
> --- ValueRecordsAggregate.java 30 Apr 2003 04:39:20 -0000 1.7
> +++ ValueRecordsAggregate.java 8 May 2003 00:02:03 -0000 1.8
> @@ -157,6 +157,11 @@
> {
> lastFormulaAggregate.setStringRecord((StringRecord)rec);
> }
> + else if (rec instanceof SharedFormulaRecord)
> + {
> + //these follow the first formula in a group
> +
> lastFormulaAggregate.setSharedFormulaRecord((SharedFormulaRecord)rec);
> + }
> else if (rec.isValue())
> {
> insertCell(( CellValueRecordInterface ) rec);
>
>
>
> 1.7 +7 -0
> jakarta-poi/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
>
> Index: ExpPtg.java
> ===================================================================
> RCS file:
>
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java,>
v
> retrieving revision 1.6
> retrieving revision 1.7
> diff -u -r1.6 -r1.7
> --- ExpPtg.java 30 Apr 2003 04:39:02 -0000 1.6
> +++ ExpPtg.java 8 May 2003 00:02:03 -0000 1.7
> @@ -66,6 +66,7 @@
> *
> * @author andy
> * @author Jason Height (jheight at chariot dot net dot au)
> + * @author dmui (save existing implementation)
> */
>
> public class ExpPtg
> @@ -73,6 +74,7 @@
> {
> private final static int SIZE = 5;
> public final static short sid = 0x1;
> + private byte[] existing = null;
>
> /** Creates new ExpPtg */
>
> @@ -84,10 +86,15 @@
>
> public ExpPtg(byte [] array, int offset)
> {
> + existing = new byte[this.getSize()];
> + System.arraycopy(array, offset, existing, 0, this.getSize());
> }
>
> public void writeBytes(byte [] array, int offset)
> {
> + if (existing != null) {
> + System.arraycopy(existing, 0, array, offset, existing.length);
> + }
> }
>
> public int getSize()
>
>
>
> 1.5 +24 -0
> jakarta-poi/src/testcases/org/apache/poi/hssf/record/TestFormulaRecord.java
>
> Index: TestFormulaRecord.java
> ===================================================================
> RCS file:
> /home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/record/TestFormulaReco
> rd.java,v
> retrieving revision 1.4
> retrieving revision 1.5
> diff -u -r1.4 -r1.5
> --- TestFormulaRecord.java 30 Apr 2003 04:39:04 -0000 1.4
> +++ TestFormulaRecord.java 8 May 2003 00:02:03 -0000 1.5
> @@ -121,6 +121,30 @@
>
> }
>
> + /**
> + * Tests to see if the shared formula cells properly reserialize the
> expPtg
> + *
> + */
> + public void testExpFormula() {
> + byte[] formulaByte = new byte[27];
> +
> + for (int i = 0; i < formulaByte.length; i++) formulaByte[i] =
(byte)0;
> +
> + formulaByte[4] =(byte)0x0F;
> + formulaByte[14]=(byte)0x08;
> + formulaByte[18]=(byte)0xE0;
> + formulaByte[19]=(byte)0xFD;
> + formulaByte[20]=(byte)0x05;
> + formulaByte[22]=(byte)0x01;
> + FormulaRecord record = new FormulaRecord(FormulaRecord.sid,
(short)27,
> formulaByte);
> + assertEquals("Row", 0, record.getRow());
> + assertEquals("Column", 0, record.getColumn());
> + byte[] output = record.serialize();
> + assertEquals("Output size", 31, output.length); //includes
sid+recordlength
> + assertEquals("Offset 22", 1, output[26]);
> + }
> +
> +
> public static void main(String [] ignored_args)
> {
> String filename = System.getProperty("HSSF.testdata.path");
>
>
>
> 1.1
> jakarta-poi/src/testcases/org/apache/poi/hssf/record/aggregates/TestValueRecor
> dsAggregate.java
>
> Index: TestValueRecordsAggregate.java
> ===================================================================
>
> /* ====================================================================
> * The Apache Software License, Version 1.1
> *
> * Copyright (c) 2003 The Apache Software Foundation. All rights
> * reserved.
> *
> * Redistribution and use in source and binary forms, with or without
> * modification, are permitted provided that the following conditions
> * are met:
> *
> * 1. Redistributions of source code must retain the above copyright
> * notice, this list of conditions and the following disclaimer.
> *
> * 2. Redistributions in binary form must reproduce the above copyright
> * notice, this list of conditions and the following disclaimer in
> * the documentation and/or other materials provided with the
> * distribution.
> *
> * 3. The end-user documentation included with the redistribution,
> * if any, must include the following acknowledgment:
> * "This product includes software developed by the
> * Apache Software Foundation (http://www.apache.org/)."
> * Alternately, this acknowledgment may appear in the software itself,
> * if and wherever such third-party acknowledgments normally appear.
> *
> * 4. The names "Apache" and "Apache Software Foundation" and
> * "Apache POI" must not be used to endorse or promote products
> * derived from this software without prior written permission. For
> * written permission, please contact apache@apache.org.
> *
> * 5. Products derived from this software may not be called "Apache",
> * "Apache POI", nor may "Apache" appear in their name, without
> * prior written permission of the Apache Software Foundation.
> *
> * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
> * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
> * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> * SUCH DAMAGE.
> * ====================================================================
> *
> * This software consists of voluntary contributions made by many
> * individuals on behalf of the Apache Software Foundation. For more
> * information on the Apache Software Foundation, please see
> * <http://www.apache.org/>.
> */
> package org.apache.poi.hssf.record.aggregates;
>
> import java.util.ArrayList;
> import java.util.Iterator;
> import java.util.List;
>
> import org.apache.poi.hssf.record.FormulaRecord;
> import org.apache.poi.hssf.record.Record;
> import org.apache.poi.hssf.record.SharedFormulaRecord;
>
> public class TestValueRecordsAggregate extends junit.framework.TestCase {
> public TestValueRecordsAggregate(String name) {
> super (name);
> }
>
> /**
> * Make sure the shared formula makes it to the FormulaRecordAggregate
> when being parsed
> * as part of the value records
> *
> */
> public void testSharedFormula() {
> List records = new ArrayList();
> records.add(new FormulaRecord());
> records.add(new SharedFormulaRecord());
>
> ValueRecordsAggregate valueRecord = new ValueRecordsAggregate();
> valueRecord.construct(0, records);
> Iterator iterator = valueRecord.getIterator();
> Record record = (Record)iterator.next();
> assertNotNull("Row contains a value", record);
> assertTrue("First record is a FormulaRecordsAggregate", (record instanceof
> FormulaRecordAggregate));
> FormulaRecordAggregate aggregate = (FormulaRecordAggregate)record;
> assertNotNull("SharedFormulaRecord is null",
> aggregate.getSharedFormulaRecord());
>
> }
>
> public static void main(String [] args) {
> System.out
> .println("Testing
> org.apache.poi.hssf.record.aggregates.TestValueRecordAggregate");
> junit.textui.TestRunner.run(TestValueRecordsAggregate.class);
> }
> }
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: poi-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: poi-dev-help@jakarta.apache.org
>
--
Andrew C. Oliver
http://www.superlinksoftware.com/poi.jsp
Custom enhancements and Commercial Implementation for Jakarta POI
http://jakarta.apache.org/poi
For Java and Excel, Got POI?