]> source.dussan.org Git - poi.git/commitdiff
Bug 58084: Fix cloning Cell Styles with Borders
authorDominik Stadler <centic@apache.org>
Fri, 4 Dec 2015 14:39:07 +0000 (14:39 +0000)
committerDominik Stadler <centic@apache.org>
Fri, 4 Dec 2015 14:39:07 +0000 (14:39 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1717973 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java

index 93798d1b53d8e9bc55b354e10b2409a4668785b4..15b3e769738a4160a2eb6e26967d03ad4ddc021f 100644 (file)
@@ -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
index 78b624fd6886c5aae07d9e7b29b3443983440ba4..eb439bc4761d8295f3fafc542e1890e193480449 100644 (file)
@@ -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();
+    }
 }