mirror of https://github.com/apache/poi.git
Fix bug #50956 - Correct XSSF cell style cloning between workbooks
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1095695 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f7ed387745
commit
11a75497e5
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.8-beta3" date="2011-??-??">
|
<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="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="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>
|
<action dev="poi-developers" type="add">49765 - Support for adding a picture to a XSSFRun</action>
|
||||||
|
|
|
@ -297,6 +297,9 @@ public class StylesTable extends POIXMLDocumentPart {
|
||||||
xfs.add(cellXf);
|
xfs.add(cellXf);
|
||||||
return xfs.size();
|
return xfs.size();
|
||||||
}
|
}
|
||||||
|
public void replaceCellXfAt(int idx, CTXf cellXf) {
|
||||||
|
xfs.set(idx, cellXf);
|
||||||
|
}
|
||||||
|
|
||||||
public CTXf getCellStyleXfAt(int idx) {
|
public CTXf getCellStyleXfAt(int idx) {
|
||||||
return styleXfs.get(idx);
|
return styleXfs.get(idx);
|
||||||
|
@ -305,6 +308,10 @@ public class StylesTable extends POIXMLDocumentPart {
|
||||||
styleXfs.add(cellStyleXf);
|
styleXfs.add(cellStyleXf);
|
||||||
return styleXfs.size();
|
return styleXfs.size();
|
||||||
}
|
}
|
||||||
|
public void replaceCellStyleXfAt(int idx, CTXf cellStyleXf) {
|
||||||
|
styleXfs.set(idx, cellStyleXf);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the size of cell styles
|
* get the size of cell styles
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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.XSSFCellFill;
|
||||||
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSide;
|
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSide;
|
||||||
import org.apache.xmlbeans.XmlException;
|
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.CTBorder;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorderPr;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorderPr;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellAlignment;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellAlignment;
|
||||||
|
@ -144,9 +146,19 @@ public class XSSFCellStyle implements CellStyle {
|
||||||
} else {
|
} else {
|
||||||
// Copy the style
|
// Copy the style
|
||||||
try {
|
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(
|
_cellXf = CTXf.Factory.parse(
|
||||||
src.getCoreXf().toString()
|
src.getCoreXf().toString()
|
||||||
);
|
);
|
||||||
|
// Swap it over
|
||||||
|
_stylesSource.replaceCellXfAt(_cellXfId, _cellXf);
|
||||||
} catch(XmlException e) {
|
} catch(XmlException e) {
|
||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
||||||
import org.apache.poi.ss.usermodel.IndexedColors;
|
import org.apache.poi.ss.usermodel.IndexedColors;
|
||||||
import org.apache.poi.ss.usermodel.VerticalAlignment;
|
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.model.StylesTable;
|
||||||
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
|
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
|
||||||
import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
|
import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
|
||||||
|
@ -656,6 +657,7 @@ public class TestXSSFCellStyle extends TestCase {
|
||||||
XSSFWorkbook wbClone = new XSSFWorkbook();
|
XSSFWorkbook wbClone = new XSSFWorkbook();
|
||||||
assertEquals(1, wbClone.getNumberOfFonts());
|
assertEquals(1, wbClone.getNumberOfFonts());
|
||||||
assertEquals(0, wbClone.getStylesSource().getNumberFormats().size());
|
assertEquals(0, wbClone.getStylesSource().getNumberFormats().size());
|
||||||
|
assertEquals(1, wbClone.getNumCellStyles());
|
||||||
|
|
||||||
XSSFDataFormat fmtClone = wbClone.createDataFormat();
|
XSSFDataFormat fmtClone = wbClone.createDataFormat();
|
||||||
XSSFCellStyle clone = wbClone.createCellStyle();
|
XSSFCellStyle clone = wbClone.createCellStyle();
|
||||||
|
@ -669,11 +671,24 @@ public class TestXSSFCellStyle extends TestCase {
|
||||||
clone.cloneStyleFrom(orig);
|
clone.cloneStyleFrom(orig);
|
||||||
|
|
||||||
assertEquals(2, wbClone.getNumberOfFonts());
|
assertEquals(2, wbClone.getNumberOfFonts());
|
||||||
|
assertEquals(2, wbClone.getNumCellStyles());
|
||||||
assertEquals(1, wbClone.getStylesSource().getNumberFormats().size());
|
assertEquals(1, wbClone.getStylesSource().getNumberFormats().size());
|
||||||
|
|
||||||
assertEquals(HSSFCellStyle.ALIGN_RIGHT, clone.getAlignment());
|
assertEquals(HSSFCellStyle.ALIGN_RIGHT, clone.getAlignment());
|
||||||
assertEquals("TestingFont", clone.getFont().getFontName());
|
assertEquals("TestingFont", clone.getFont().getFontName());
|
||||||
assertEquals(fmtClone.getFormat("Test##"), clone.getDataFormat());
|
assertEquals(fmtClone.getFormat("Test##"), clone.getDataFormat());
|
||||||
assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##"));
|
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##"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue