Bug 56295: Fix cloning of styles across workbooks and handling of default value of attribute applyFill
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1666736 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1849741d43
commit
30d20582af
@ -154,6 +154,13 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
_cellXf = CTXf.Factory.parse(
|
_cellXf = CTXf.Factory.parse(
|
||||||
src.getCoreXf().toString()
|
src.getCoreXf().toString()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// bug 56295: ensure that the fills is available and set correctly
|
||||||
|
CTFill fill = CTFill.Factory.parse(
|
||||||
|
src.getCTFill().toString()
|
||||||
|
);
|
||||||
|
addFill(fill);
|
||||||
|
|
||||||
// Swap it over
|
// Swap it over
|
||||||
_stylesSource.replaceCellXfAt(_cellXfId, _cellXf);
|
_stylesSource.replaceCellXfAt(_cellXfId, _cellXf);
|
||||||
} catch(XmlException e) {
|
} catch(XmlException e) {
|
||||||
@ -187,6 +194,13 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addFill(CTFill fill) {
|
||||||
|
int idx = _stylesSource.putFill(new XSSFCellFill(fill));
|
||||||
|
|
||||||
|
_cellXf.setFillId(idx);
|
||||||
|
_cellXf.setApplyFill(true);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the type of horizontal alignment for the cell
|
* Get the type of horizontal alignment for the cell
|
||||||
*
|
*
|
||||||
@ -444,7 +458,8 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
* @return XSSFColor - fill color or <code>null</code> if not set
|
* @return XSSFColor - fill color or <code>null</code> if not set
|
||||||
*/
|
*/
|
||||||
public XSSFColor getFillBackgroundXSSFColor() {
|
public XSSFColor getFillBackgroundXSSFColor() {
|
||||||
if(!_cellXf.getApplyFill()) return null;
|
// bug 56295: handle missing applyFill attribute as "true" because Excel does as well
|
||||||
|
if(_cellXf.isSetApplyFill() && !_cellXf.getApplyFill()) return null;
|
||||||
|
|
||||||
int fillIndex = (int)_cellXf.getFillId();
|
int fillIndex = (int)_cellXf.getFillId();
|
||||||
XSSFCellFill fg = _stylesSource.getFillAt(fillIndex);
|
XSSFCellFill fg = _stylesSource.getFillAt(fillIndex);
|
||||||
@ -480,7 +495,8 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
* @return XSSFColor - fill color or <code>null</code> if not set
|
* @return XSSFColor - fill color or <code>null</code> if not set
|
||||||
*/
|
*/
|
||||||
public XSSFColor getFillForegroundXSSFColor() {
|
public XSSFColor getFillForegroundXSSFColor() {
|
||||||
if(!_cellXf.getApplyFill()) return null;
|
// bug 56295: handle missing applyFill attribute as "true" because Excel does as well
|
||||||
|
if(_cellXf.isSetApplyFill() && !_cellXf.getApplyFill()) return null;
|
||||||
|
|
||||||
int fillIndex = (int)_cellXf.getFillId();
|
int fillIndex = (int)_cellXf.getFillId();
|
||||||
XSSFCellFill fg = _stylesSource.getFillAt(fillIndex);
|
XSSFCellFill fg = _stylesSource.getFillAt(fillIndex);
|
||||||
@ -515,7 +531,8 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
* @see org.apache.poi.ss.usermodel.CellStyle#DIAMONDS
|
* @see org.apache.poi.ss.usermodel.CellStyle#DIAMONDS
|
||||||
*/
|
*/
|
||||||
public short getFillPattern() {
|
public short getFillPattern() {
|
||||||
if(!_cellXf.getApplyFill()) return 0;
|
// bug 56295: handle missing applyFill attribute as "true" because Excel does as well
|
||||||
|
if(_cellXf.isSetApplyFill() && !_cellXf.getApplyFill()) return 0;
|
||||||
|
|
||||||
int fillIndex = (int)_cellXf.getFillId();
|
int fillIndex = (int)_cellXf.getFillId();
|
||||||
XSSFCellFill fill = _stylesSource.getFillAt(fillIndex);
|
XSSFCellFill fill = _stylesSource.getFillAt(fillIndex);
|
||||||
@ -996,10 +1013,7 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
ptrn.setBgColor(color.getCTColor());
|
ptrn.setBgColor(color.getCTColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
int idx = _stylesSource.putFill(new XSSFCellFill(ct));
|
addFill(ct);
|
||||||
|
|
||||||
_cellXf.setFillId(idx);
|
|
||||||
_cellXf.setApplyFill(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1052,10 +1066,7 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
ptrn.setFgColor(color.getCTColor());
|
ptrn.setFgColor(color.getCTColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
int idx = _stylesSource.putFill(new XSSFCellFill(ct));
|
addFill(ct);
|
||||||
|
|
||||||
_cellXf.setFillId(idx);
|
|
||||||
_cellXf.setApplyFill(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1076,7 +1087,8 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
*/
|
*/
|
||||||
private CTFill getCTFill(){
|
private CTFill getCTFill(){
|
||||||
CTFill ct;
|
CTFill ct;
|
||||||
if(_cellXf.getApplyFill()) {
|
// bug 56295: handle missing applyFill attribute as "true" because Excel does as well
|
||||||
|
if(!_cellXf.isSetApplyFill() || _cellXf.getApplyFill()) {
|
||||||
int fillIndex = (int)_cellXf.getFillId();
|
int fillIndex = (int)_cellXf.getFillId();
|
||||||
XSSFCellFill cf = _stylesSource.getFillAt(fillIndex);
|
XSSFCellFill cf = _stylesSource.getFillAt(fillIndex);
|
||||||
|
|
||||||
@ -1135,10 +1147,7 @@ public class XSSFCellStyle implements CellStyle {
|
|||||||
if(fp == NO_FILL && ptrn.isSetPatternType()) ptrn.unsetPatternType();
|
if(fp == NO_FILL && ptrn.isSetPatternType()) ptrn.unsetPatternType();
|
||||||
else ptrn.setPatternType(STPatternType.Enum.forInt(fp + 1));
|
else ptrn.setPatternType(STPatternType.Enum.forInt(fp + 1));
|
||||||
|
|
||||||
int idx = _stylesSource.putFill(new XSSFCellFill(ct));
|
addFill(ct);
|
||||||
|
|
||||||
_cellXf.setFillId(idx);
|
|
||||||
_cellXf.setApplyFill(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,6 +31,7 @@ import java.io.File;
|
|||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -2308,4 +2309,60 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
|||||||
// TODO Re-check sheet contents
|
// TODO Re-check sheet contents
|
||||||
// TODO Re-check formula evaluation
|
// TODO Re-check formula evaluation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBug56295_MergeXlslsWithStyles() throws IOException {
|
||||||
|
XSSFWorkbook xlsToAppendWorkbook = XSSFTestDataSamples.openSampleWorkbook("56295.xlsx");
|
||||||
|
XSSFSheet sheet = xlsToAppendWorkbook.getSheetAt(0);
|
||||||
|
XSSFRow srcRow = sheet.getRow(0);
|
||||||
|
XSSFCell oldCell = srcRow.getCell(0);
|
||||||
|
XSSFCellStyle cellStyle = oldCell.getCellStyle();
|
||||||
|
|
||||||
|
checkStyle(cellStyle);
|
||||||
|
|
||||||
|
// StylesTable table = xlsToAppendWorkbook.getStylesSource();
|
||||||
|
// List<XSSFCellFill> fills = table.getFills();
|
||||||
|
// System.out.println("Having " + fills.size() + " fills");
|
||||||
|
// for(XSSFCellFill fill : fills) {
|
||||||
|
// System.out.println("Fill: " + fill.getFillBackgroundColor() + "/" + fill.getFillForegroundColor());
|
||||||
|
// }
|
||||||
|
|
||||||
|
XSSFWorkbook targetWorkbook = new XSSFWorkbook();
|
||||||
|
XSSFSheet newSheet = targetWorkbook.createSheet(sheet.getSheetName());
|
||||||
|
XSSFRow destRow = newSheet.createRow(0);
|
||||||
|
XSSFCell newCell = destRow.createCell(0);
|
||||||
|
|
||||||
|
//newCell.getCellStyle().cloneStyleFrom(cellStyle);
|
||||||
|
CellStyle newCellStyle = targetWorkbook.createCellStyle();
|
||||||
|
newCellStyle.cloneStyleFrom(cellStyle);
|
||||||
|
newCell.setCellStyle(newCellStyle);
|
||||||
|
checkStyle(newCell.getCellStyle());
|
||||||
|
newCell.setCellValue(oldCell.getStringCellValue());
|
||||||
|
|
||||||
|
// OutputStream os = new FileOutputStream("output.xlsm");
|
||||||
|
// try {
|
||||||
|
// targetWorkbook.write(os);
|
||||||
|
// } finally {
|
||||||
|
// os.close();
|
||||||
|
// }
|
||||||
|
|
||||||
|
XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(targetWorkbook);
|
||||||
|
XSSFCellStyle styleBack = wbBack.getSheetAt(0).getRow(0).getCell(0).getCellStyle();
|
||||||
|
checkStyle(styleBack);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkStyle(XSSFCellStyle cellStyle) {
|
||||||
|
assertNotNull(cellStyle);
|
||||||
|
assertEquals(0, cellStyle.getFillForegroundColor());
|
||||||
|
assertNotNull(cellStyle.getFillForegroundXSSFColor());
|
||||||
|
XSSFColor fgColor = cellStyle.getFillForegroundColorColor();
|
||||||
|
assertNotNull(fgColor);
|
||||||
|
assertEquals("FF00FFFF", fgColor.getARGBHex());
|
||||||
|
|
||||||
|
assertEquals(0, cellStyle.getFillBackgroundColor());
|
||||||
|
assertNotNull(cellStyle.getFillBackgroundXSSFColor());
|
||||||
|
XSSFColor bgColor = cellStyle.getFillBackgroundColorColor();
|
||||||
|
assertNotNull(bgColor);
|
||||||
|
assertEquals("FF00FFFF", fgColor.getARGBHex());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
|
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
|
||||||
@ -82,6 +84,9 @@ public class TestXSSFCellStyle extends TestCase {
|
|||||||
stylesTable.putCellStyleXf(cellStyleXf);
|
stylesTable.putCellStyleXf(cellStyleXf);
|
||||||
stylesTable.putCellXf(cellXf);
|
stylesTable.putCellXf(cellXf);
|
||||||
cellStyle = new XSSFCellStyle(1, 1, stylesTable, null);
|
cellStyle = new XSSFCellStyle(1, 1, stylesTable, null);
|
||||||
|
|
||||||
|
assertNotNull(stylesTable.getFillAt(1).getCTFill().getPatternFill());
|
||||||
|
assertEquals(STPatternType.INT_DARK_GRAY, stylesTable.getFillAt(1).getCTFill().getPatternFill().getPatternType().intValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderBottom() {
|
public void testGetSetBorderBottom() {
|
||||||
@ -551,7 +556,7 @@ public class TestXSSFCellStyle extends TestCase {
|
|||||||
assertEquals(IndexedColors.AUTOMATIC.getIndex(), cellStyle.getFillBackgroundColor());
|
assertEquals(IndexedColors.AUTOMATIC.getIndex(), cellStyle.getFillBackgroundColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDefaultStyles() {
|
public void testDefaultStyles() throws IOException {
|
||||||
|
|
||||||
XSSFWorkbook wb1 = new XSSFWorkbook();
|
XSSFWorkbook wb1 = new XSSFWorkbook();
|
||||||
|
|
||||||
@ -577,6 +582,7 @@ public class TestXSSFCellStyle extends TestCase {
|
|||||||
assertEquals(style2.getBorderLeft(), style1.getBorderLeft());
|
assertEquals(style2.getBorderLeft(), style1.getBorderLeft());
|
||||||
assertEquals(style2.getBorderRight(), style1.getBorderRight());
|
assertEquals(style2.getBorderRight(), style1.getBorderRight());
|
||||||
assertEquals(style2.getBorderTop(), style1.getBorderTop());
|
assertEquals(style2.getBorderTop(), style1.getBorderTop());
|
||||||
|
wb2.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -618,7 +624,7 @@ public class TestXSSFCellStyle extends TestCase {
|
|||||||
|
|
||||||
public void testGetFillPattern() {
|
public void testGetFillPattern() {
|
||||||
|
|
||||||
assertEquals(CellStyle.NO_FILL, cellStyle.getFillPattern());
|
assertEquals(STPatternType.INT_DARK_GRAY-1, cellStyle.getFillPattern());
|
||||||
|
|
||||||
int num = stylesTable.getFills().size();
|
int num = stylesTable.getFills().size();
|
||||||
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
|
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
|
||||||
|
BIN
test-data/spreadsheet/56295.xlsx
Normal file
BIN
test-data/spreadsheet/56295.xlsx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user