Преглед на файлове

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
tags/REL_3_12_FINAL
Dominik Stadler преди 9 години
родител
ревизия
7764200fe2

+ 25
- 16
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java Целия файл

_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) {
} }
} }


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
* *
* @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);
* @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);
* @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);
ptrn.setBgColor(color.getCTColor()); ptrn.setBgColor(color.getCTColor());
} }


int idx = _stylesSource.putFill(new XSSFCellFill(ct));

_cellXf.setFillId(idx);
_cellXf.setApplyFill(true);
addFill(ct);
} }


/** /**
ptrn.setFgColor(color.getCTColor()); ptrn.setFgColor(color.getCTColor());
} }


int idx = _stylesSource.putFill(new XSSFCellFill(ct));

_cellXf.setFillId(idx);
_cellXf.setApplyFill(true);
addFill(ct);
} }


/** /**
*/ */
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);


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));

_cellXf.setFillId(idx);
_cellXf.setApplyFill(true);
addFill(ct);
} }


/** /**

+ 57
- 0
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Целия файл

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;
// 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());
}
} }

+ 8
- 2
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java Целия файл



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;
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() {
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();


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();
} }






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);

Двоични данни
test-data/spreadsheet/56295.xlsx Целия файл


Loading…
Отказ
Запис