diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 5410a7fab..e2e772a3c 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 50846 - More XSSFColor theme improvements, this time for Cell Borders 50939 - ChartEndObjectRecord is supposed to have 6 bytes at the end, but handle it not HMEF - New component which supports TNEF (Transport Neutral Encoding Format), aka winmail.dat 50313 - support for getting HWPFDocument fields diff --git a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java index 60dad91b0..e643f9fa1 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java @@ -98,9 +98,15 @@ public class StylesTable extends POIXMLDocumentPart { public void setTheme(ThemesTable theme) { this.theme = theme; + + // Pass the themes table along to things which need to + // know about it, but have already been created by now for(XSSFFont font : fonts) { font.setThemesTable(theme); } + for(XSSFCellBorder border : borders) { + border.setThemesTable(theme); + } } /** @@ -144,7 +150,7 @@ public class StylesTable extends POIXMLDocumentPart { CTBorders ctborders = styleSheet.getBorders(); if(ctborders != null) { for (CTBorder border : ctborders.getBorderArray()) { - borders.add(new XSSFCellBorder(border, theme)); + borders.add(new XSSFCellBorder(border)); } } @@ -251,6 +257,7 @@ public class StylesTable extends POIXMLDocumentPart { return idx; } borders.add(border); + border.setThemesTable(theme); return borders.size() - 1; } @@ -437,7 +444,7 @@ public class StylesTable extends POIXMLDocumentPart { fills.add(new XSSFCellFill(ctFill[1])); CTBorder ctBorder = createDefaultBorder(); - borders.add(new XSSFCellBorder(ctBorder, theme)); + borders.add(new XSSFCellBorder(ctBorder)); CTXf styleXf = createDefaultXf(); styleXfs.add(styleXf); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java index adc695b09..b100bc210 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java @@ -38,19 +38,34 @@ public class XSSFCellBorder { * Creates a Cell Border from the supplied XML definition */ public XSSFCellBorder(CTBorder border, ThemesTable theme) { - this.border = border; + this(border); this._theme = theme; } + /** + * Creates a Cell Border from the supplied XML definition + */ + public XSSFCellBorder(CTBorder border) { + this.border = border; + } + /** * Creates a new, empty Cell Border. * You need to attach this to the Styles Table */ - public XSSFCellBorder(ThemesTable theme) { + public XSSFCellBorder() { border = CTBorder.Factory.newInstance(); - this._theme = theme; } + /** + * Records the Themes Table that is associated with + * the current font, used when looking up theme + * based colours and properties. + */ + public void setThemesTable(ThemesTable themes) { + this._theme = themes; + } + /** * The enumeration value indicating the side being used for a cell border. */ 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 eaeb01faa..710ba2c01 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -742,12 +742,26 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { * should still be able to get colours */ public void test50846() throws Exception { - // TODO Get file and test - //Workbook wb = XSSFTestDataSamples.openSampleWorkbook("50846.xlsx"); + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50846-border_colours.xlsx"); - // Check the style that is theme based + XSSFSheet sheet = wb.getSheetAt(0); + XSSFRow row = sheet.getRow(0); - // Check the one that isn't + // Border from a theme, brown + XSSFCell cellT = row.getCell(0); + XSSFCellStyle styleT = cellT.getCellStyle(); + XSSFColor colorT = styleT.getBottomBorderXSSFColor(); + + assertEquals(5, colorT.getTheme()); + assertEquals("FFC0504D", colorT.getARGBHex()); + + // Border from a style direct, red + XSSFCell cellS = row.getCell(1); + XSSFCellStyle styleS = cellS.getCellStyle(); + XSSFColor colorS = styleS.getBottomBorderXSSFColor(); + + assertEquals(0, colorS.getTheme()); + assertEquals("FFFF0000", colorS.getARGBHex()); } /** diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java index 83edc8f2f..02b34ae85 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java @@ -59,11 +59,11 @@ public class TestXSSFCellStyle extends TestCase { ctStylesheet = stylesTable.getCTStylesheet(); ctBorderA = CTBorder.Factory.newInstance(); - XSSFCellBorder borderA = new XSSFCellBorder(ctBorderA, null); + XSSFCellBorder borderA = new XSSFCellBorder(ctBorderA); long borderId = stylesTable.putBorder(borderA); assertEquals(1, borderId); - XSSFCellBorder borderB = new XSSFCellBorder(null); + XSSFCellBorder borderB = new XSSFCellBorder(); assertEquals(1, stylesTable.putBorder(borderB)); ctFill = CTFill.Factory.newInstance(); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/extensions/TestXSSFBorder.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/extensions/TestXSSFBorder.java index 46af27d59..e7233c227 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/extensions/TestXSSFBorder.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/extensions/TestXSSFBorder.java @@ -40,7 +40,7 @@ public class TestXSSFBorder extends TestCase { right.setStyle(STBorderStyle.NONE); bottom.setStyle(STBorderStyle.THIN); - XSSFCellBorder cellBorderStyle = new XSSFCellBorder(border, null); + XSSFCellBorder cellBorderStyle = new XSSFCellBorder(border); assertEquals("DASH_DOT", cellBorderStyle.getBorderStyle(BorderSide.TOP).toString()); assertEquals("NONE", cellBorderStyle.getBorderStyle(BorderSide.RIGHT).toString()); diff --git a/test-data/spreadsheet/50846-border_colours.xlsx b/test-data/spreadsheet/50846-border_colours.xlsx new file mode 100644 index 000000000..49ec5320f Binary files /dev/null and b/test-data/spreadsheet/50846-border_colours.xlsx differ