--- XSSFColor.java (revision 288774) +++ XSSFColor.java (working copy) @@ -23,6 +23,10 @@ import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.util.Internal; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor; +import org.w3c.dom.DOMException; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** * Represents a color in SpreadsheetML @@ -159,7 +163,37 @@ } } - /** + @Override +protected byte[] getRGBOrARGB() { + if (isIndexed()) { + try { + Node parentNode = ctColor.getDomNode().getParentNode(); + while (parentNode.getNodeName().trim() != "styleSheet") { + parentNode = parentNode.getParentNode(); + } + Node colorsNode = ((Element) parentNode).getElementsByTagName("colors").item(0); + Node indexedColorsNode = colorsNode.getFirstChild().getChildNodes().item(getIndex()); + String hexString = indexedColorsNode.getAttributes().getNamedItem("rgb").getNodeValue(); + return hexStringToByteArray(hexString); + } catch (Exception e) { + return super.getRGBOrARGB(); + } + } + return super.getRGBOrARGB(); +} + + private byte[] hexStringToByteArray(String s) { + byte[] b = new byte[s.length() / 2]; + for (int i = 0; i < b.length; i++) { + int index = i * 2; + int v = Integer.parseInt(s.substring(index, index + 2), 16); + b[i] = (byte) v; + } + return b; + } + + +/** * Standard Alpha Red Green Blue ctColor value (ARGB). */ @Override