<!-- Don't forget to update status.xml too! -->
<release version="3.0.2-FINAL" date="2008-??-??">
- <action dev="POI-DEVELOPERS" type="fix">44200 - Enable cloning of sheets with notes </action>
+ <action dev="POI-DEVELOPERS" type="fix">44201 - Enable cloning of sheets with data validation rules</action>
+ <action dev="POI-DEVELOPERS" type="fix">44200 - Enable cloning of sheets with notes</action>
<action dev="POI-DEVELOPERS" type="add">43008 - Add a moveCell method to HSSFRow, and deprecate setCellNum(), which didn't update things properly</action>
<action dev="POI-DEVELOPERS" type="fix">43058 - Support setting row grouping on files from CR IX, which lack GutsRecords</action>
<action dev="POI-DEVELOPERS" type="fix">31795 - Support cloning of sheets with certain drawing objects on them</action>
<!-- Don't forget to update changes.xml too! -->
<changes>
<release version="3.0.2-FINAL" date="2008-??-??">
- <action dev="POI-DEVELOPERS" type="fix">44200 - Enable cloning of sheets with notes </action>
+ <action dev="POI-DEVELOPERS" type="fix">44201 - Enable cloning of sheets with data validation rules</action>
+ <action dev="POI-DEVELOPERS" type="fix">44200 - Enable cloning of sheets with notes</action>
<action dev="POI-DEVELOPERS" type="add">43008 - Add a moveCell method to HSSFRow, and deprecate setCellNum(), which didn't update things properly</action>
<action dev="POI-DEVELOPERS" type="fix">43058 - Support setting row grouping on files from CR IX, which lack GutsRecords</action>
<action dev="POI-DEVELOPERS" type="fix">31795 - Support cloning of sheets with certain drawing objects on them</action>
package org.apache.poi.hssf.record;
-import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public Object clone()
{
- // Do it via a re-serialise
- // It's a cheat, but it works...
- byte[] b = serialize();
- RecordInputStream rinp = new RecordInputStream(
- new ByteArrayInputStream(b)
- );
- rinp.nextRecord();
-
- Record[] r = RecordFactory.createRecord(rinp);
- if(r.length != 1) {
- throw new IllegalStateException("Re-serialised a record to clone it, but got " + r.length + " records back!");
- }
- return r[0];
+ return cloneViaReserialise();
}
public void addEscherRecord(int index, EscherRecord element)
package org.apache.poi.hssf.record;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Stack;
+
+import org.apache.poi.hssf.record.formula.Ptg;
+import org.apache.poi.hssf.util.HSSFCellRangeAddress;
import org.apache.poi.util.BitField;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.StringUtil;
-import org.apache.poi.hssf.util.HSSFCellRangeAddress;
-import org.apache.poi.hssf.record.formula.Ptg;
-
-import java.io.IOException;
-import java.util.Stack;
-import java.util.Hashtable;
-import java.util.Enumeration;
/**
* Title: DV Record<P>
{
return this.sid;
}
+
+ /**
+ * Clones the object. Uses serialisation, as the
+ * contents are somewhat complex
+ */
+ public Object clone() {
+ return cloneViaReserialise();
+ }
/**@todo DVRecord = Serializare */
package org.apache.poi.hssf.record;
+import java.io.ByteArrayInputStream;
+
/**
* Title: Record
* Description: All HSSF Records inherit from this class. It
public Object clone() {
throw new RuntimeException("The class "+getClass().getName()+" needs to define a clone method");
}
+
+ /**
+ * Clone the current record, via a call to serialise
+ * it, and another to create a new record from the
+ * bytes.
+ * May only be used for classes which don't have
+ * internal counts / ids in them. For those which
+ * do, a full record-aware serialise is needed, which
+ * allocates new ids / counts as needed.
+ */
+ public Record cloneViaReserialise()
+ {
+ // Do it via a re-serialise
+ // It's a cheat, but it works...
+ byte[] b = serialize();
+ RecordInputStream rinp = new RecordInputStream(
+ new ByteArrayInputStream(b)
+ );
+ rinp.nextRecord();
+
+ Record[] r = RecordFactory.createRecord(rinp);
+ if(r.length != 1) {
+ throw new IllegalStateException("Re-serialised a record to clone it, but got " + r.length + " records back!");
+ }
+ return r[0];
+ }
}
}
+ /**
+ * Bug 44201: Sheet not cloneable when validation added to excel cell
+ */
+ public void test44201() throws Exception {
+ FileInputStream in = new FileInputStream(new File(cwd, "44201.xls"));
+ HSSFWorkbook wb = new HSSFWorkbook(in);
+ in.close();
+
+ wb.cloneSheet(0);
+ assertTrue("No Exceptions while cloning sheet", true);
+
+ //serialize and read again
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ wb.write(out);
+ out.close();
+
+ wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
+ assertTrue("No Exceptions while reading file", true);
+
+ }
}