Author: centic Date: Mon Nov 13 11:46:04 2017 New Revision: 1815086 URL: http://svn.apache.org/viewvc?rev=1815086&view=rev Log: Fix setting a font-color if no previous color is defined for the font Add unit-test to verify this
Modified: poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java Modified: poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java?rev=1815086&r1=1815085&r2=1815086&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java Mon Nov 13 11:46:04 2017 @@ -366,7 +366,7 @@ public class HSSFColor implements Color // Currently the only benefit of this method is to throw an IllegalArgumentException // instead of a ClassCastException. if (color != null && !(color instanceof HSSFColor)) { - throw new IllegalArgumentException("Only HSSFColor objects are supported"); + throw new IllegalArgumentException("Only HSSFColor objects are supported, but had " + color.getClass()); } return (HSSFColor)color; } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java?rev=1815086&r1=1815085&r2=1815086&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java Mon Nov 13 11:46:04 2017 @@ -358,7 +358,7 @@ public class XSSFColor extends ExtendedC // Currently the only benefit of this method is to throw an IllegalArgumentException // instead of a ClassCastException. if (color != null && !(color instanceof XSSFColor)) { - throw new IllegalArgumentException("Only XSSFColor objects are supported"); + throw new IllegalArgumentException("Only XSSFColor objects are supported, but had " + color.getClass()); } return (XSSFColor)color; } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java?rev=1815086&r1=1815085&r2=1815086&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java Mon Nov 13 11:46:04 2017 @@ -121,6 +121,8 @@ public class XSSFFontFormatting implemen XSSFColor xcolor = XSSFColor.toXSSFColor(color); if (xcolor == null) { _font.getColorList().clear(); + } else if(_font.sizeOfColorArray() == 0) { + _font.addNewColor().setRgb(xcolor.getRGB()); } else { _font.setColorArray(0, xcolor.getCTColor()); } Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java?rev=1815086&r1=1815085&r2=1815086&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java Mon Nov 13 11:46:04 2017 @@ -25,6 +25,15 @@ import java.io.IOException; import org.apache.poi.ss.usermodel.BaseTestConditionalFormatting; import org.apache.poi.ss.usermodel.Color; +import org.apache.poi.ss.usermodel.ConditionalFormatting; +import org.apache.poi.ss.usermodel.ConditionalFormattingRule; +import org.apache.poi.ss.usermodel.ExtendedColor; +import org.apache.poi.ss.usermodel.FontFormatting; +import org.apache.poi.ss.usermodel.PatternFormatting; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.SheetConditionalFormatting; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.XSSFITestDataProvider; import org.junit.Test; @@ -56,4 +65,69 @@ public class TestXSSFConditionalFormatti public void testReadOffice2007() throws IOException { testReadOffice2007("NewStyleConditionalFormattings.xlsx"); } + + private final static java.awt.Color PEAK_ORANGE = new java.awt.Color(255, 239, 221); + + @Test + public void testFontFormattingColor() { + Workbook wb = XSSFITestDataProvider.instance.createWorkbook(); + final Sheet sheet = wb.createSheet(); + + final SheetConditionalFormatting formatting = sheet.getSheetConditionalFormatting(); + + // the conditional formatting is not automatically added when it is created... + assertEquals(0, formatting.getNumConditionalFormattings()); + ConditionalFormattingRule formattingRule = formatting.createConditionalFormattingRule("A1"); + assertEquals(0, formatting.getNumConditionalFormattings()); + + // adding the formatting makes it available + int idx = formatting.addConditionalFormatting(new CellRangeAddress[] {}, formattingRule); + + // verify that it can be accessed now + assertEquals(0, idx); + assertEquals(1, formatting.getNumConditionalFormattings()); + assertEquals(1, formatting.getConditionalFormattingAt(idx).getNumberOfRules()); + + // this is confusing: the rule is not connected to the sheet, changes are not applied + // so we need to use setRule() explicitly! + FontFormatting fontFmt = formattingRule.createFontFormatting(); + assertNotNull(formattingRule.getFontFormatting()); + assertEquals(1, formatting.getConditionalFormattingAt(idx).getNumberOfRules()); + formatting.getConditionalFormattingAt(idx).setRule(0, formattingRule); + assertNotNull(formatting.getConditionalFormattingAt(idx).getRule(0).getFontFormatting()); + + fontFmt.setFontStyle(true, false); + + assertEquals(-1, fontFmt.getFontColorIndex()); + + //fontFmt.setFontColorIndex((short)11); + final ExtendedColor extendedColor = new XSSFColor(PEAK_ORANGE); + fontFmt.setFontColor(extendedColor); + + PatternFormatting patternFmt = formattingRule.createPatternFormatting(); + assertNotNull(patternFmt); + patternFmt.setFillBackgroundColor(extendedColor); + + assertEquals(1, formatting.getConditionalFormattingAt(0).getNumberOfRules()); + assertNotNull(formatting.getConditionalFormattingAt(0).getRule(0).getFontFormatting()); + assertNotNull(formatting.getConditionalFormattingAt(0).getRule(0).getFontFormatting().getFontColor()); + assertNotNull(formatting.getConditionalFormattingAt(0).getRule(0).getPatternFormatting().getFillBackgroundColorColor()); + + checkFontFormattingColorWriteOutAndReadBack(wb, extendedColor); + } + + private void checkFontFormattingColorWriteOutAndReadBack(Workbook wb, ExtendedColor extendedColor) { + Workbook wbBack = XSSFITestDataProvider.instance.writeOutAndReadBack(wb); + assertNotNull(wbBack); + + assertEquals(1, wbBack.getSheetAt(0).getSheetConditionalFormatting().getNumConditionalFormattings()); + final ConditionalFormatting formattingBack = wbBack.getSheetAt(0).getSheetConditionalFormatting().getConditionalFormattingAt(0); + assertEquals(1, wbBack.getSheetAt(0).getSheetConditionalFormatting().getConditionalFormattingAt(0).getNumberOfRules()); + final ConditionalFormattingRule ruleBack = formattingBack.getRule(0); + final FontFormatting fontFormattingBack = ruleBack.getFontFormatting(); + assertNotNull(formattingBack); + assertNotNull(fontFormattingBack.getFontColor()); + assertEquals(extendedColor, fontFormattingBack.getFontColor()); + assertEquals(extendedColor, ruleBack.getPatternFormatting().getFillBackgroundColorColor()); + } } Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java?rev=1815086&r1=1815085&r2=1815086&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java Mon Nov 13 11:46:04 2017 @@ -80,6 +80,7 @@ public final class TestXSSFFont extends assertEquals(true, ctFont.getBArray(0).getVal()); } + @SuppressWarnings("deprecation") @Test public void testCharSet() throws IOException { CTFont ctFont=CTFont.Factory.newInstance(); @@ -108,7 +109,9 @@ public final class TestXSSFFont extends try { xssfFont.setCharSet(9999); fail("Shouldn't be able to set an invalid charset"); - } catch(POIXMLException e) {} + } catch(POIXMLException e) { + // expected here + } // Now try with a few sample files @@ -120,7 +123,7 @@ public final class TestXSSFFont extends ); wb1.close(); - // GB2312 charact set + // GB2312 charset XSSFWorkbook wb2 = XSSFTestDataSamples.openSampleWorkbook("49273.xlsx"); assertEquals(134, wb2.getSheetAt(0).getRow(0).getCell(0).getCellStyle().getFont().getCharSet() --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org