diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index fbcb3cc42..9bf3cf1da 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 50786 - Fix XSSFColor to fetch the RGB values of old-style indexed colours 50299 - Fix XSSFColor fetching of white and black background themes 50795 - Avoid NPE from xmlbeans when moving XSSF Comments from one cell to another 46664 - When creating HSSF Print Areas, ensure the named range is reference based not value based diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java index 24bb35e2a..2194a4db1 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java @@ -17,6 +17,7 @@ package org.apache.poi.xssf.usermodel; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor; +import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Color; import org.apache.poi.util.Internal; @@ -83,7 +84,22 @@ public class XSSFColor implements Color { * Standard Alpha Red Green Blue ctColor value (ARGB). */ public byte[] getRgb() { - return ctColor.getRgb(); + if(ctColor.isSetIndexed() && ctColor.getIndexed() > 0) { + HSSFColor indexed = HSSFColor.getIndexHash().get((int)ctColor.getIndexed()); + if(indexed != null) { + // Convert it to ARGB form + byte[] rgb = new byte[4]; + rgb[0] = 0; + rgb[1] = (byte)indexed.getTriplet()[0]; + rgb[2] = (byte)indexed.getTriplet()[1]; + rgb[3] = (byte)indexed.getTriplet()[2]; + return rgb; + } else { + // Your indexed value isn't a standard one, sorry... + return null; + } + } + return ctColor.getRgb(); } /** @@ -99,7 +115,7 @@ public class XSSFColor implements Color { /** * Return the ARGB value in hex format, eg FF00FF00. - * For indexed colours, returns null. + * Works for both regular and indexed colours. */ public String getARGBHex() { StringBuffer sb = new StringBuffer(); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index 349ab9bd8..b36a92a4d 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -704,6 +704,26 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { assertEquals(64, s.getRow(1).getCell(8).getCellStyle().getFillBackgroundColor()); } + /** + * Excel .xls style indexed colours in a .xlsx file + */ + public void test50786() throws Exception { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50786-indexed_colours.xlsx"); + XSSFSheet s = wb.getSheetAt(0); + XSSFRow r = s.getRow(2); + + // Check we have the right cell + XSSFCell c = r.getCell(1); + assertEquals("test\u00a0", c.getRichStringCellValue().getString()); + + // It should be light green + XSSFCellStyle cs = c.getCellStyle(); + assertEquals(42, cs.getFillForegroundColor()); + assertEquals(42, cs.getFillForegroundColorColor().getIndexed()); + assertNotNull(cs.getFillForegroundColorColor().getRgb()); + assertEquals("00CCFFCC", cs.getFillForegroundColorColor().getARGBHex()); + } + /** * Fonts where their colours come from the theme rather * then being set explicitly still should allow the diff --git a/test-data/spreadsheet/50786-indexed_colours.xlsx b/test-data/spreadsheet/50786-indexed_colours.xlsx new file mode 100644 index 000000000..df8bab6cd Binary files /dev/null and b/test-data/spreadsheet/50786-indexed_colours.xlsx differ