]> source.dussan.org Git - poi.git/commitdiff
Fix bug #50956 - Correct XSSF cell style cloning between workbooks
authorNick Burch <nick@apache.org>
Thu, 21 Apr 2011 13:22:18 +0000 (13:22 +0000)
committerNick Burch <nick@apache.org>
Thu, 21 Apr 2011 13:22:18 +0000 (13:22 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1095695 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java

index d09d49371fd673f6f65ed5eb0b25f744f721c3bd..45bd6658c62874201bdcac941c7a67b6bec88d8a 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta3" date="2011-??-??">
+           <action dev="poi-developers" type="fix">50956 - Correct XSSF cell style cloning between workbooks</action>
            <action dev="poi-developers" type="add">Add get/setForceFormulaRecalculation for XSSF, and promote the methods to the common usermodel Sheet</action>
            <action dev="poi-developers" type="fix">Tweak the logic for sizing the HSSFCells array on a HSSFRow to reduce memory over allocation in many use cases</action>
            <action dev="poi-developers" type="add">49765 - Support for adding a picture to a XSSFRun</action>
index e643f9fa1fcc8f58c1cd88998db821638c4d5de3..3a2e87903c1bea7701c87c6b073a1eba836503a2 100644 (file)
@@ -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
         */
index 55590a2b422e116e9e771e25064f9e39fa67672d..86a8aac2358770a4a25559ba64a1ef5d9b05b0f2 100644 (file)
@@ -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);
                }
index 02b34ae85ef2dd4ba42414a94229aff710a9e1a2..14259cf43c41f3ae620e30a9953e881f8369358b 100644 (file)
@@ -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##"));
    }
 }