diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index d09d49371..45bd6658c 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 50956 - Correct XSSF cell style cloning between workbooks Add get/setForceFormulaRecalculation for XSSF, and promote the methods to the common usermodel Sheet Tweak the logic for sizing the HSSFCells array on a HSSFRow to reduce memory over allocation in many use cases 49765 - Support for adding a picture to a XSSFRun diff --git a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java index e643f9fa1..3a2e87903 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java @@ -297,6 +297,9 @@ public class StylesTable extends POIXMLDocumentPart { xfs.add(cellXf); return xfs.size(); } + public void replaceCellXfAt(int idx, CTXf cellXf) { + xfs.set(idx, cellXf); + } public CTXf getCellStyleXfAt(int idx) { return styleXfs.get(idx); @@ -305,6 +308,10 @@ public class StylesTable extends POIXMLDocumentPart { styleXfs.add(cellStyleXf); return styleXfs.size(); } + public void replaceCellStyleXfAt(int idx, CTXf cellStyleXf) { + styleXfs.set(idx, cellStyleXf); + } + /** * get the size of cell styles */ diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java index 55590a2b4..86a8aac23 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java @@ -33,6 +33,8 @@ import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSide; import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlToken; +import org.w3c.dom.Node; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorderPr; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellAlignment; @@ -144,9 +146,19 @@ public class XSSFCellStyle implements CellStyle { } else { // Copy the style try { + // Remove any children off the current style, to + // avoid orphaned nodes + if(_cellXf.isSetAlignment()) + _cellXf.unsetAlignment(); + if(_cellXf.isSetExtLst()) + _cellXf.unsetExtLst(); + + // Create a new Xf with the same contents _cellXf = CTXf.Factory.parse( src.getCoreXf().toString() ); + // Swap it over + _stylesSource.replaceCellXfAt(_cellXfId, _cellXf); } catch(XmlException e) { throw new POIXMLException(e); } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java index 02b34ae85..14259cf43 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java @@ -25,6 +25,7 @@ import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.model.StylesTable; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill; @@ -656,6 +657,7 @@ public class TestXSSFCellStyle extends TestCase { XSSFWorkbook wbClone = new XSSFWorkbook(); assertEquals(1, wbClone.getNumberOfFonts()); assertEquals(0, wbClone.getStylesSource().getNumberFormats().size()); + assertEquals(1, wbClone.getNumCellStyles()); XSSFDataFormat fmtClone = wbClone.createDataFormat(); XSSFCellStyle clone = wbClone.createCellStyle(); @@ -669,11 +671,24 @@ public class TestXSSFCellStyle extends TestCase { clone.cloneStyleFrom(orig); assertEquals(2, wbClone.getNumberOfFonts()); + assertEquals(2, wbClone.getNumCellStyles()); assertEquals(1, wbClone.getStylesSource().getNumberFormats().size()); assertEquals(HSSFCellStyle.ALIGN_RIGHT, clone.getAlignment()); assertEquals("TestingFont", clone.getFont().getFontName()); assertEquals(fmtClone.getFormat("Test##"), clone.getDataFormat()); assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##")); + + // Save it and re-check + XSSFWorkbook wbReload = XSSFTestDataSamples.writeOutAndReadBack(wbClone); + assertEquals(2, wbReload.getNumberOfFonts()); + assertEquals(2, wbReload.getNumCellStyles()); + assertEquals(1, wbReload.getStylesSource().getNumberFormats().size()); + + XSSFCellStyle reload = wbReload.getCellStyleAt((short)1); + assertEquals(HSSFCellStyle.ALIGN_RIGHT, reload.getAlignment()); + assertEquals("TestingFont", reload.getFont().getFontName()); + assertEquals(fmtClone.getFormat("Test##"), reload.getDataFormat()); + assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##")); } }