diff options
author | Nick Burch <nick@apache.org> | 2008-01-09 10:59:04 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2008-01-09 10:59:04 +0000 |
commit | 7b605f32e11d44af4af9f12f0e33ea511c433507 (patch) | |
tree | e1d586d8887f3e94664fac5fc5c749caa4004d08 | |
parent | f97d12c2d52203774d579fac08be27759b9ae4dd (diff) | |
download | poi-7b605f32e11d44af4af9f12f0e33ea511c433507.tar.gz poi-7b605f32e11d44af4af9f12f0e33ea511c433507.zip |
Add clone methods to DrawingRecord and AbstractEscherHolderRecord, which allows cloning of some sheets with drawing objects on them. Fixes bug #31795
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@610336 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/documentation/content/xdocs/changes.xml | 1 | ||||
-rw-r--r-- | src/documentation/content/xdocs/status.xml | 1 | ||||
-rw-r--r-- | src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java | 19 | ||||
-rw-r--r-- | src/java/org/apache/poi/hssf/record/DrawingRecord.java | 17 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls | bin | 0 -> 17408 bytes | |||
-rw-r--r-- | src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java | 20 |
6 files changed, 48 insertions, 10 deletions
diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 7a955b303a..79eb0e9140 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -36,6 +36,7 @@ <!-- Don't forget to update status.xml too! --> <release version="3.0.2-FINAL" date="2008-??-??"> + <action dev="POI-DEVELOPERS" type="fix">31795 - Support cloning of sheets with certain drawing objects on them</action> <action dev="POI-DEVELOPERS" type="fix">43902 - Don't consider merged regions when auto-sizing columns</action> <action dev="POI-DEVELOPERS" type="fix">42464 - Avoid "Expected ExpPtg to be converted from Shared to Non-Shared Formula" on large, formula heavy worksheets</action> <action dev="POI-DEVELOPERS" type="add">42033 - Add support for named ranges with unicode names</action> diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 6c8b47b46f..37383c8169 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ <!-- Don't forget to update changes.xml too! --> <changes> <release version="3.0.2-FINAL" date="2008-??-??"> + <action dev="POI-DEVELOPERS" type="fix">31795 - Support cloning of sheets with certain drawing objects on them</action> <action dev="POI-DEVELOPERS" type="fix">43902 - Don't consider merged regions when auto-sizing columns</action> <action dev="POI-DEVELOPERS" type="fix">42464 - Avoid "Expected ExpPtg to be converted from Shared to Non-Shared Formula" on large, formula heavy worksheets</action> <action dev="POI-DEVELOPERS" type="add">42033 - Add support for named ranges with unicode names</action> diff --git a/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java b/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java index efa83ca330..c9417a9c3a 100644 --- a/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java +++ b/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java @@ -24,6 +24,9 @@ import org.apache.poi.ddf.EscherRecordFactory; import org.apache.poi.ddf.NullEscherSerializationListener; import org.apache.poi.util.LittleEndian; +import java.io.ByteArrayInputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -76,7 +79,7 @@ public abstract class AbstractEscherHolderRecord { if (id != getSid()) { - throw new RecordFormatException("Not an escher record"); + throw new RecordFormatException("Not an escher record! (sid was " + id + ", expecting " + getSid() + ")"); } } @@ -227,7 +230,19 @@ public abstract class AbstractEscherHolderRecord public Object clone() { - throw new IllegalStateException("Not implemented yet."); + // 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]; } public void addEscherRecord(int index, EscherRecord element) diff --git a/src/java/org/apache/poi/hssf/record/DrawingRecord.java b/src/java/org/apache/poi/hssf/record/DrawingRecord.java index d6b34b6be3..009bc31bce 100644 --- a/src/java/org/apache/poi/hssf/record/DrawingRecord.java +++ b/src/java/org/apache/poi/hssf/record/DrawingRecord.java @@ -107,15 +107,16 @@ public class DrawingRecord extends Record } public Object clone() { - if (recordData == null) { - recordData = new byte[ 0 ]; - } - DrawingRecord rec = new DrawingRecord(); - rec.recordData = new byte[ recordData.length ]; - rec.contd = new byte[ contd.length ]; - System.arraycopy(recordData, 0, rec.recordData, 0, recordData.length); - System.arraycopy(contd, 0, rec.contd, 0, contd.length); + + if (recordData != null) { + rec.recordData = new byte[ recordData.length ]; + System.arraycopy(recordData, 0, rec.recordData, 0, recordData.length); + } + if (contd != null) { + System.arraycopy(contd, 0, rec.contd, 0, contd.length); + rec.contd = new byte[ contd.length ]; + } return rec; } diff --git a/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls b/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls Binary files differnew file mode 100644 index 0000000000..e1395291b0 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java index 8a83abde64..6d5afca114 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java @@ -109,4 +109,24 @@ public class TestHSSFWorkbook extends TestCase assertEquals(b.getSelectedTab(), 1); assertEquals(b.getDisplayedTab(), 1); } + + public void testSheetClone() throws Exception { + // First up, try a simple file + HSSFWorkbook b = new HSSFWorkbook(); + assertEquals(0, b.getNumberOfSheets()); + b.createSheet("Sheet One"); + b.createSheet("Sheet Two"); + + assertEquals(2, b.getNumberOfSheets()); + b.cloneSheet(0); + assertEquals(3, b.getNumberOfSheets()); + + // Now try a problem one with drawing records in it + b = new HSSFWorkbook( + new FileInputStream(new File(filename,"SheetWithDrawing.xls")) + ); + assertEquals(1, b.getNumberOfSheets()); + b.cloneSheet(0); + assertEquals(2, b.getNumberOfSheets()); + } }
\ No newline at end of file |