From 96cb8c18febb12cca760ca14b69fded28c12dbbe Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Fri, 4 Dec 2015 14:39:07 +0000 Subject: [PATCH] Bug 58084: Fix cloning Cell Styles with Borders git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1717973 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/usermodel/XSSFCellStyle.java | 13 ++++++ .../poi/xssf/usermodel/TestXSSFCellStyle.java | 44 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java index 93798d1b5..15b3e7697 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java @@ -164,6 +164,12 @@ public class XSSFCellStyle implements CellStyle { ); addFill(fill); + // bug 58084: set borders correctly + CTBorder border = CTBorder.Factory.parse( + src.getCTBorder().toString(), DEFAULT_XML_OPTIONS + ); + addBorder(border); + // Swap it over _stylesSource.replaceCellXfAt(_cellXfId, _cellXf); } catch(XmlException e) { @@ -203,6 +209,13 @@ public class XSSFCellStyle implements CellStyle { _cellXf.setFillId(idx); _cellXf.setApplyFill(true); } + + private void addBorder(CTBorder border) { + int idx = _stylesSource.putBorder(new XSSFCellBorder(border, _theme)); + + _cellXf.setBorderId(idx); + _cellXf.setApplyBorder(true); + } /** * Get the type of horizontal alignment for the cell 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 78b624fd6..eb439bc47 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java @@ -1017,4 +1017,48 @@ public class TestXSSFCellStyle { wb.close(); } + + public static void copyStyles(Workbook reference, Workbook target) { + final short numberOfStyles = reference.getNumCellStyles(); + for (short i = 0; i < numberOfStyles; i++) { + final CellStyle referenceStyle = reference.getCellStyleAt(i); + if (i == 0) { + continue; + } + final CellStyle targetStyle = target.createCellStyle(); + targetStyle.cloneStyleFrom(referenceStyle); + } + /*System.out.println("Reference : "+reference.getNumCellStyles()); + System.out.println("Target : "+target.getNumCellStyles());*/ + } + + @Test + public void test58084() throws IOException { + Workbook reference = XSSFTestDataSamples.openSampleWorkbook("template.xlsx"); + Workbook target = new XSSFWorkbook(); + copyStyles(reference, target); + + assertEquals(reference.getNumCellStyles(), target.getNumCellStyles()); + final Sheet sheet = target.createSheet(); + final Row row = sheet.createRow(0); + int col = 0; + for (short i = 1; i < target.getNumCellStyles(); i++) { + final Cell cell = row.createCell(col++); + cell.setCellValue("Coucou"+i); + cell.setCellStyle(target.getCellStyleAt(i)); + } + /*OutputStream out = new FileOutputStream("C:\\temp\\58084.xlsx"); + target.write(out); + out.close();*/ + + Workbook copy = XSSFTestDataSamples.writeOutAndReadBack(target); + + // previously this failed because the border-element was not copied over + copy.getCellStyleAt((short)1).getBorderBottom(); + + copy.close(); + + target.close(); + reference.close(); + } }