diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java b/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java index ffbcec50e..584f426fd 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java @@ -170,7 +170,8 @@ public class HSSFSimpleShape extends HSSFShape HSSFRichTextString rtr = (HSSFRichTextString) string; // If font is not set we must set the default one if (rtr.numFormattingRuns() == 0) rtr.applyFont((short) 0); - _textObjectRecord.setStr(rtr); + TextObjectRecord txo = getOrCreateTextObjRecord(); + txo.setStr(rtr); if (string.getString() != null){ setPropertyValue(new EscherSimpleProperty(EscherProperties.TEXT__TEXTID, string.getString().hashCode())); } @@ -234,4 +235,19 @@ public class HSSFSimpleShape extends HSSFShape EscherSpRecord spRecord = getEscherContainer().getChildById(EscherSpRecord.RECORD_ID); spRecord.setShapeType((short) value); } + + private TextObjectRecord getOrCreateTextObjRecord(){ + if (getTextObjectRecord() == null){ + _textObjectRecord = createTextObjRecord(); + } + EscherTextboxRecord escherTextbox = getEscherContainer().getChildById(EscherTextboxRecord.RECORD_ID); + if (null == escherTextbox){ + escherTextbox = new EscherTextboxRecord(); + escherTextbox.setRecordId(EscherTextboxRecord.RECORD_ID); + escherTextbox.setOptions((short) 0x0000); + getEscherContainer().addChildRecord(escherTextbox); + getPatriarch()._getBoundAggregate().associateShapeToObjRecord(escherTextbox, _textObjectRecord); + } + return _textObjectRecord; + } } diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java b/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java index 4260ead63..dacdadd4f 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java @@ -133,7 +133,9 @@ public class HSSFTextbox extends HSSFSimpleShape { void afterInsert(HSSFPatriarch patriarch) { EscherAggregate agg = patriarch._getBoundAggregate(); agg.associateShapeToObjRecord(getEscherContainer().getChildById(EscherClientDataRecord.RECORD_ID), getObjRecord()); - agg.associateShapeToObjRecord(getEscherContainer().getChildById(EscherTextboxRecord.RECORD_ID), getTextObjectRecord()); + if (getTextObjectRecord() != null){ + agg.associateShapeToObjRecord(getEscherContainer().getChildById(EscherTextboxRecord.RECORD_ID), getTextObjectRecord()); + } } /** @@ -231,7 +233,7 @@ public class HSSFTextbox extends HSSFSimpleShape { @Override protected HSSFShape cloneShape() { - TextObjectRecord txo = (TextObjectRecord) getTextObjectRecord().cloneViaReserialise(); + TextObjectRecord txo = getTextObjectRecord() == null ? null : (TextObjectRecord) getTextObjectRecord().cloneViaReserialise(); EscherContainerRecord spContainer = new EscherContainerRecord(); byte[] inSp = getEscherContainer().serialize(); spContainer.fillFields(inSp, 0, new DefaultEscherRecordFactory()); diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 9c566b05b..8f4a4ec65 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -2283,4 +2283,18 @@ if(1==2) { wb = writeOutAndReadBack((HSSFWorkbook) wb); assertEquals(wb.getAllPictures().size(), 1); } + + public void test46250(){ + Workbook wb = openSample("46250.xls"); + Sheet sh = wb.getSheet("Template"); + Sheet cSh = wb.cloneSheet(wb.getSheetIndex(sh)); + + HSSFPatriarch patriarch = (HSSFPatriarch) cSh.createDrawingPatriarch(); + HSSFTextbox tb = (HSSFTextbox) patriarch.getChildren().get(2); + + tb.setString(new HSSFRichTextString("POI test")); + tb.setAnchor(new HSSFClientAnchor(0,0,0,0,(short)0,0,(short)10,10)); + + wb = writeOutAndReadBack((HSSFWorkbook) wb); + } } diff --git a/test-data/spreadsheet/46250.xls b/test-data/spreadsheet/46250.xls new file mode 100644 index 000000000..7260bf3c6 Binary files /dev/null and b/test-data/spreadsheet/46250.xls differ