_cellXf = CTXf.Factory.parse(
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
_stylesSource.replaceCellXfAt(_cellXfId, _cellXf);
} catch(XmlException e) {
}
}
+ 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
*
* @return XSSFColor - fill color or <code>null</code> if not set
*/
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();
XSSFCellFill fg = _stylesSource.getFillAt(fillIndex);
* @return XSSFColor - fill color or <code>null</code> if not set
*/
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();
XSSFCellFill fg = _stylesSource.getFillAt(fillIndex);
* @see org.apache.poi.ss.usermodel.CellStyle#DIAMONDS
*/
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();
XSSFCellFill fill = _stylesSource.getFillAt(fillIndex);
ptrn.setBgColor(color.getCTColor());
}
- int idx = _stylesSource.putFill(new XSSFCellFill(ct));
-
- _cellXf.setFillId(idx);
- _cellXf.setApplyFill(true);
+ addFill(ct);
}
/**
ptrn.setFgColor(color.getCTColor());
}
- int idx = _stylesSource.putFill(new XSSFCellFill(ct));
-
- _cellXf.setFillId(idx);
- _cellXf.setApplyFill(true);
+ addFill(ct);
}
/**
*/
private CTFill getCTFill(){
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();
XSSFCellFill cf = _stylesSource.getFillAt(fillIndex);
if(fp == NO_FILL && ptrn.isSetPatternType()) ptrn.unsetPatternType();
else ptrn.setPatternType(STPatternType.Enum.forInt(fp + 1));
- int idx = _stylesSource.putFill(new XSSFCellFill(ct));
-
- _cellXf.setFillId(idx);
- _cellXf.setApplyFill(true);
+ addFill(ct);
}
/**
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.List;
// TODO Re-check sheet contents
// 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());
+ }
}
package org.apache.poi.xssf.usermodel;
+import java.io.IOException;
+
import junit.framework.TestCase;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
stylesTable.putCellStyleXf(cellStyleXf);
stylesTable.putCellXf(cellXf);
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() {
assertEquals(IndexedColors.AUTOMATIC.getIndex(), cellStyle.getFillBackgroundColor());
}
- public void testDefaultStyles() {
+ public void testDefaultStyles() throws IOException {
XSSFWorkbook wb1 = new XSSFWorkbook();
assertEquals(style2.getBorderLeft(), style1.getBorderLeft());
assertEquals(style2.getBorderRight(), style1.getBorderRight());
assertEquals(style2.getBorderTop(), style1.getBorderTop());
+ wb2.close();
}
public void testGetFillPattern() {
- assertEquals(CellStyle.NO_FILL, cellStyle.getFillPattern());
+ assertEquals(STPatternType.INT_DARK_GRAY-1, cellStyle.getFillPattern());
int num = stylesTable.getFills().size();
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);