]> source.dussan.org Git - poi.git/commitdiff
Add ability to set get and remove outer borders for tables
authorMark Murphy <jmarkmurphy@apache.org>
Sun, 11 Feb 2018 18:43:20 +0000 (18:43 +0000)
committerMark Murphy <jmarkmurphy@apache.org>
Sun, 11 Feb 2018 18:43:20 +0000 (18:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1823873 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java
src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java

index 8757e42542090e767d68257271d9083217d0eafe..69fb02a7dbc2bc08975cb1e49b8a7d3f7a425fec 100644 (file)
@@ -103,12 +103,12 @@ public class XWPFTable implements IBodyElement, ISDTContents {
         if (table.sizeOfTrArray() == 0)
             createEmptyTable(table);
 
-        for (CTRow row : table.getTrArray()) {
+        for (CTRow row : table.getTrList()) {
             StringBuilder rowText = new StringBuilder();
             XWPFTableRow tabRow = new XWPFTableRow(row, this);
             tableRows.add(tabRow);
-            for (CTTc cell : row.getTcArray()) {
-                for (CTP ctp : cell.getPArray()) {
+            for (CTTc cell : row.getTcList()) {
+                for (CTP ctp : cell.getPList()) {
                     XWPFParagraph p = new XWPFParagraph(ctp, part);
                     if (rowText.length() > 0) {
                         rowText.append('\t');
@@ -228,7 +228,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
      * @return width value
      */
     public int getWidth() {
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         return tblPr.isSetTblW() ? tblPr.getTblW().getW().intValue() : -1;
     }
 
@@ -236,7 +236,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
      * @param width
      */
     public void setWidth(int width) {
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
         tblWidth.setW(new BigInteger("" + width));
     }
@@ -248,11 +248,130 @@ public class XWPFTable implements IBodyElement, ISDTContents {
         return ctTbl.sizeOfTrArray();
     }
 
-    private CTTblPr getTrPr() {
-        return (ctTbl.getTblPr() != null) ? ctTbl.getTblPr() : ctTbl
-                .addNewTblPr();
+    /**
+     * Returns CTTblPr object for table. Creates it if it does not exist.
+     */
+    private CTTblPr getTblPr() {
+        return getTblPr(true);
+    }
+
+    /**
+     * Returns CTTblPr object for table. If force parameter is true, will 
+     * create the element if necessary. If force parameter is false, returns
+     * null when CTTblPr element is missing.
+     *
+     * @param force - force creation of CTTblPr element if necessary
+     */
+    private CTTblPr getTblPr(boolean force) {
+        return (ctTbl.getTblPr() != null) ? ctTbl.getTblPr() 
+                : (force ? ctTbl.addNewTblPr() : null);
+    }
+
+    /**
+     * Return CTTblBorders object for table. If force parameter is true, will
+     * create the element if necessary. If force parameter is false, returns
+     * null when CTTblBorders element is missing.
+     *
+     * @param force - force creation of CTTblBorders element if necessary
+     */
+    private CTTblBorders getTblBorders(boolean force) {
+        CTTblPr tblPr = getTblPr(force);
+        return tblPr == null ? null
+               : tblPr.isSetTblBorders() ? tblPr.getTblBorders() 
+               : force ? tblPr.addNewTblBorders()
+               : null;
+    }
+    
+    /**
+     * Return CTBorder object for Inside Vertical border. If force parameter is true,
+     * will create the element if necessary. If force parameter is false, returns 
+     * null when Inside Vertical border is missing.
+     *
+     * @param force - force creation of Inside Vertical border if necessary.
+     */
+    private CTBorder getTblInsideVBorder(boolean force) {
+        CTTblBorders ctb = getTblBorders(force);
+        return ctb == null ? null
+               : ctb.isSetInsideV() ? ctb.getInsideV() 
+               : force ? ctb.addNewInsideV() 
+               : null;
+    }
+
+    /**
+     * Return CTBorder object for Inside Horizontal border. If force parameter is true,
+     * will create the element if necessary. If force parameter is false, returns 
+     * null when Inside Horizontal border is missing.
+     *
+     * @param force - force creation of Inside Horizontal border if necessary.
+     */
+    private CTBorder getTblInsideHBorder(boolean force) {
+        CTTblBorders ctb = getTblBorders(force);
+        return ctb == null ? null
+               : ctb.isSetInsideH() ? ctb.getInsideH() 
+               : force ? ctb.addNewInsideH() 
+               : null;
+    }
+
+    /**
+     * Return CTBorder object for Top border. If force parameter is true,
+     * will create the element if necessary. If force parameter is false, returns 
+     * null when Top border is missing.
+     *
+     * @param force - force creation of Top border if necessary.
+     */
+    private CTBorder getTblTopBorder(boolean force) {
+        CTTblBorders ctb = getTblBorders(force);
+        return ctb == null ? null
+               : ctb.isSetTop() ? ctb.getTop() 
+               : force ? ctb.addNewTop() 
+               : null;
+    }
+
+    /**
+     * Return CTBorder object for Bottom border. If force parameter is true,
+     * will create the element if necessary. If force parameter is false, returns 
+     * null when Bottom border is missing.
+     *
+     * @param force - force creation of Bottom border if necessary.
+     */
+    private CTBorder getTblBottomBorder(boolean force) {
+        CTTblBorders ctb = getTblBorders(force);
+        return ctb == null ? null
+               : ctb.isSetBottom() ? ctb.getBottom() 
+               : force ? ctb.addNewBottom() 
+               : null;
+    }
+
+    /**
+     * Return CTBorder object for Left border. If force parameter is true,
+     * will create the element if necessary. If force parameter is false, returns 
+     * null when Left border is missing.
+     *
+     * @param force - force creation of Left border if necessary.
+     */
+    private CTBorder getTblLeftBorder(boolean force) {
+        CTTblBorders ctb = getTblBorders(force);
+        return ctb == null ? null
+               : ctb.isSetLeft() ? ctb.getLeft() 
+               : force ? ctb.addNewLeft() 
+               : null;
     }
 
+    /**
+     * Return CTBorder object for Right border. If force parameter is true,
+     * will create the element if necessary. If force parameter is false, returns 
+     * null when Right border is missing.
+     *
+     * @param force - force creation of Right border if necessary.
+     */
+    private CTBorder getTblRightBorder(boolean force) {
+        CTTblBorders ctb = getTblBorders(force);
+        return ctb == null ? null
+               : ctb.isSetRight() ? ctb.getRight() 
+               : force ? ctb.addNewRight() 
+               : null;
+    }
+    
     private void addColumn(XWPFTableRow tabRow, int sizeCol) {
         if (sizeCol > 0) {
             for (int i = 0; i < sizeCol; i++) {
@@ -285,7 +404,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
      * @param styleName - the style name to apply to this table
      */
     public void setStyleID(String styleName) {
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTString styleStr = tblPr.getTblStyle();
         if (styleStr == null) {
             styleStr = tblPr.addNewTblStyle();
@@ -293,121 +412,297 @@ public class XWPFTable implements IBodyElement, ISDTContents {
         styleStr.setVal(styleName);
     }
 
+    /**
+     * Get inside horizontal border type
+     *
+     * @return {@link XWPFBorderType} of the inside horizontal borders or null if missing
+     */
     public XWPFBorderType getInsideHBorderType() {
-        XWPFBorderType bt = null;
-
-        CTTblPr tblPr = getTrPr();
-        if (tblPr.isSetTblBorders()) {
-            CTTblBorders ctb = tblPr.getTblBorders();
-            if (ctb.isSetInsideH()) {
-                CTBorder border = ctb.getInsideH();
-                bt = stBorderTypeMap.get(border.getVal().intValue());
-            }
-        }
-        return bt;
+        CTBorder b = getTblInsideHBorder(false);
+        return (b != null) ? stBorderTypeMap.get(b.getVal().intValue()) : null;
     }
 
+    /**
+     * Get inside horizontal border size
+     * 
+     * @return The width of the Inside Horizontal borders in 1/8th points,
+     * -1 if missing.
+     */
     public int getInsideHBorderSize() {
-        int size = -1;
-
-        CTTblPr tblPr = getTrPr();
-        if (tblPr.isSetTblBorders()) {
-            CTTblBorders ctb = tblPr.getTblBorders();
-            if (ctb.isSetInsideH()) {
-                CTBorder border = ctb.getInsideH();
-                size = border.getSz().intValue();
-            }
-        }
-        return size;
+        CTBorder b = getTblInsideHBorder(false);
+        return (b != null) 
+                ? (b.isSetSz() ? b.getSz().intValue() : -1)
+                        : -1;        
     }
 
+    /**
+     * Get inside horizontal border spacing
+     * 
+     * @return The offset to the Inside Horizontal borders in points,
+     * -1 if missing.
+     */
     public int getInsideHBorderSpace() {
-        int space = -1;
-
-        CTTblPr tblPr = getTrPr();
-        if (tblPr.isSetTblBorders()) {
-            CTTblBorders ctb = tblPr.getTblBorders();
-            if (ctb.isSetInsideH()) {
-                CTBorder border = ctb.getInsideH();
-                space = border.getSpace().intValue();
-            }
-        }
-        return space;
+        CTBorder b = getTblInsideHBorder(false);
+        return (b != null) 
+                ? (b.isSetSpace() ? b.getSpace().intValue() : -1)
+                        : -1;        
     }
 
+    /**
+     * Get inside horizontal border color
+     * 
+     * @return The color of the Inside Horizontal borders, null if missing.
+     */
     public String getInsideHBorderColor() {
-        String color = null;
-
-        CTTblPr tblPr = getTrPr();
-        if (tblPr.isSetTblBorders()) {
-            CTTblBorders ctb = tblPr.getTblBorders();
-            if (ctb.isSetInsideH()) {
-                CTBorder border = ctb.getInsideH();
-                color = border.xgetColor().getStringValue();
-            }
-        }
-        return color;
+        CTBorder b = getTblInsideHBorder(false);
+        return (b != null) 
+                ? (b.isSetColor() ? b.xgetColor().getStringValue() : null)
+                        : null;        
     }
 
+    /**
+     * Get inside vertical border type
+     *
+     * @return {@link XWPFBorderType} of the inside vertical borders or null if missing
+     */
     public XWPFBorderType getInsideVBorderType() {
-        XWPFBorderType bt = null;
-
-        CTTblPr tblPr = getTrPr();
-        if (tblPr.isSetTblBorders()) {
-            CTTblBorders ctb = tblPr.getTblBorders();
-            if (ctb.isSetInsideV()) {
-                CTBorder border = ctb.getInsideV();
-                bt = stBorderTypeMap.get(border.getVal().intValue());
-            }
-        }
-        return bt;
+        CTBorder b = getTblInsideVBorder(false);
+        return (b != null) ? stBorderTypeMap.get(b.getVal().intValue()) : null;
     }
 
+    /**
+     * Get inside vertical border size
+     * 
+     * @return The width of the Inside vertical borders in 1/8th points,
+     * -1 if missing.
+     */
     public int getInsideVBorderSize() {
-        int size = -1;
-
-        CTTblPr tblPr = getTrPr();
-        if (tblPr.isSetTblBorders()) {
-            CTTblBorders ctb = tblPr.getTblBorders();
-            if (ctb.isSetInsideV()) {
-                CTBorder border = ctb.getInsideV();
-                size = border.getSz().intValue();
-            }
-        }
-        return size;
+        CTBorder b = getTblInsideVBorder(false);
+        return (b != null) 
+                ? (b.isSetSz() ? b.getSz().intValue() : -1)
+                        : -1;        
     }
 
+    /**
+     * Get inside vertical border spacing
+     * 
+     * @return The offset to the Inside vertical borders in points,
+     * -1 if missing.
+     */
     public int getInsideVBorderSpace() {
-        int space = -1;
-
-        CTTblPr tblPr = getTrPr();
-        if (tblPr.isSetTblBorders()) {
-            CTTblBorders ctb = tblPr.getTblBorders();
-            if (ctb.isSetInsideV()) {
-                CTBorder border = ctb.getInsideV();
-                space = border.getSpace().intValue();
-            }
-        }
-        return space;
+        CTBorder b = getTblInsideVBorder(false);
+        return (b != null) 
+                ? (b.isSetSpace() ? b.getSpace().intValue() : -1)
+                        : -1;        
     }
 
+    /**
+     * Get inside vertical border color
+     * 
+     * @return The color of the Inside vertical borders, null if missing.
+     */
     public String getInsideVBorderColor() {
-        String color = null;
-
-        CTTblPr tblPr = getTrPr();
-        if (tblPr.isSetTblBorders()) {
-            CTTblBorders ctb = tblPr.getTblBorders();
-            if (ctb.isSetInsideV()) {
-                CTBorder border = ctb.getInsideV();
-                color = border.xgetColor().getStringValue();
-            }
-        }
-        return color;
+        CTBorder b = getTblInsideVBorder(false);
+        return (b != null) 
+                ? (b.isSetColor() ? b.xgetColor().getStringValue() : null)
+                        : null;        
+    }
+
+    /**
+     * Get top border type
+     *
+     * @return {@link XWPFBorderType} of the top borders or null if missing
+     */
+    public XWPFBorderType getTopBorderType() {
+        CTBorder b = getTblTopBorder(false);
+        return (b != null) ? stBorderTypeMap.get(b.getVal().intValue()) : null;
+    }
+
+    /**
+     * Get top border size
+     * 
+     * @return The width of the top borders in 1/8th points,
+     * -1 if missing.
+     */
+    public int getTopBorderSize() {
+        CTBorder b = getTblTopBorder(false);
+        return (b != null) 
+                ? (b.isSetSz() ? b.getSz().intValue() : -1)
+                        : -1;        
+    }
+
+    /**
+     * Get top border spacing
+     * 
+     * @return The offset to the top borders in points,
+     * -1 if missing.
+     */
+    public int getTopBorderSpace() {
+        CTBorder b = getTblTopBorder(false);
+        return (b != null) 
+                ? (b.isSetSpace() ? b.getSpace().intValue() : -1)
+                        : -1;        
+    }
+
+    /**
+     * Get top border color
+     * 
+     * @return The color of the top borders, null if missing.
+     */
+    public String getTopBorderColor() {
+        CTBorder b = getTblTopBorder(false);
+        return (b != null) 
+                ? (b.isSetColor() ? b.xgetColor().getStringValue() : null)
+                        : null;        
+    }
+
+    /**
+     * Get bottom border type
+     *
+     * @return {@link XWPFBorderType} of the bottom borders or null if missing
+     */
+    public XWPFBorderType getBottomBorderType() {
+        CTBorder b = getTblBottomBorder(false);
+        return (b != null) ? stBorderTypeMap.get(b.getVal().intValue()) : null;
+    }
+
+    /**
+     * Get bottom border size
+     * 
+     * @return The width of the bottom borders in 1/8th points,
+     * -1 if missing.
+     */
+    public int getBottomBorderSize() {
+        CTBorder b = getTblBottomBorder(false);
+        return (b != null) 
+                ? (b.isSetSz() ? b.getSz().intValue() : -1)
+                        : -1;        
+    }
+
+    /**
+     * Get bottom border spacing
+     * 
+     * @return The offset to the bottom borders in points,
+     * -1 if missing.
+     */
+    public int getBottomBorderSpace() {
+        CTBorder b = getTblBottomBorder(false);
+        return (b != null) 
+                ? (b.isSetSpace() ? b.getSpace().intValue() : -1)
+                        : -1;        
+    }
+
+    /**
+     * Get bottom border color
+     * 
+     * @return The color of the bottom borders, null if missing.
+     */
+    public String getBottomBorderColor() {
+        CTBorder b = getTblBottomBorder(false);
+        return (b != null) 
+                ? (b.isSetColor() ? b.xgetColor().getStringValue() : null)
+                        : null;        
+    }
+
+    /**
+     * Get Left border type
+     *
+     * @return {@link XWPFBorderType} of the Left borders or null if missing
+     */
+    public XWPFBorderType getLeftBorderType() {
+        CTBorder b = getTblLeftBorder(false);
+        return (b != null) ? stBorderTypeMap.get(b.getVal().intValue()) : null;
+    }
+
+    /**
+     * Get Left border size
+     * 
+     * @return The width of the Left borders in 1/8th points,
+     * -1 if missing.
+     */
+    public int getLeftBorderSize() {
+        CTBorder b = getTblLeftBorder(false);
+        return (b != null) 
+                ? (b.isSetSz() ? b.getSz().intValue() : -1)
+                        : -1;        
+    }
+
+    /**
+     * Get Left border spacing
+     * 
+     * @return The offset to the Left borders in points,
+     * -1 if missing.
+     */
+    public int getLeftBorderSpace() {
+        CTBorder b = getTblLeftBorder(false);
+        return (b != null) 
+                ? (b.isSetSpace() ? b.getSpace().intValue() : -1)
+                        : -1;        
+    }
+
+    /**
+     * Get Left border color
+     * 
+     * @return The color of the Left borders, null if missing.
+     */
+    public String getLeftBorderColor() {
+        CTBorder b = getTblLeftBorder(false);
+        return (b != null) 
+                ? (b.isSetColor() ? b.xgetColor().getStringValue() : null)
+                        : null;        
+    }
+
+    /**
+     * Get Right border type
+     *
+     * @return {@link XWPFBorderType} of the Right borders or null if missing
+     */
+    public XWPFBorderType getRightBorderType() {
+        CTBorder b = getTblRightBorder(false);
+        return (b != null) ? stBorderTypeMap.get(b.getVal().intValue()) : null;
+    }
+
+    /**
+     * Get Right border size
+     * 
+     * @return The width of the Right borders in 1/8th points,
+     * -1 if missing.
+     */
+    public int getRightBorderSize() {
+        CTBorder b = getTblRightBorder(false);
+        return (b != null) 
+                ? (b.isSetSz() ? b.getSz().intValue() : -1)
+                        : -1;        
+    }
+
+    /**
+     * Get Right border spacing
+     * 
+     * @return The offset to the Right borders in points,
+     * -1 if missing.
+     */
+    public int getRightBorderSpace() {
+        CTBorder b = getTblRightBorder(false);
+        return (b != null) 
+                ? (b.isSetSpace() ? b.getSpace().intValue() : -1)
+                        : -1;        
+    }
+
+    /**
+     * Get Right border color
+     * 
+     * @return The color of the Right borders, null if missing.
+     */
+    public String getRightBorderColor() {
+        CTBorder b = getTblRightBorder(false);
+        return (b != null) 
+                ? (b.isSetColor() ? b.xgetColor().getStringValue() : null)
+                        : null;        
     }
 
     public int getRowBandSize() {
         int size = 0;
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         if (tblPr.isSetTblStyleRowBandSize()) {
             CTDecimalNumber rowSize = tblPr.getTblStyleRowBandSize();
             size = rowSize.getVal().intValue();
@@ -416,14 +711,14 @@ public class XWPFTable implements IBodyElement, ISDTContents {
     }
 
     public void setRowBandSize(int size) {
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTDecimalNumber rowSize = tblPr.isSetTblStyleRowBandSize() ? tblPr.getTblStyleRowBandSize() : tblPr.addNewTblStyleRowBandSize();
         rowSize.setVal(BigInteger.valueOf(size));
     }
 
     public int getColBandSize() {
         int size = 0;
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         if (tblPr.isSetTblStyleColBandSize()) {
             CTDecimalNumber colSize = tblPr.getTblStyleColBandSize();
             size = colSize.getVal().intValue();
@@ -432,34 +727,228 @@ public class XWPFTable implements IBodyElement, ISDTContents {
     }
 
     public void setColBandSize(int size) {
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTDecimalNumber colSize = tblPr.isSetTblStyleColBandSize() ? tblPr.getTblStyleColBandSize() : tblPr.addNewTblStyleColBandSize();
         colSize.setVal(BigInteger.valueOf(size));
     }
 
+    /**
+     * Set Inside horizontal borders for a table
+     *
+     * @param type - {@link XWPFBorderType} e.g. single, double, thick
+     * @param size - Specifies the width of the current border. The width of this border is
+     *      specified in measurements of eighths of a point, with a minimum value of two (onefourth
+     *      of a point) and a maximum value of 96 (twelve points). Any values outside this
+     *      range may be reassigned to a more appropriate value.
+     * @param space - Specifies the spacing offset that shall be used to place this border on the table
+     * @param rgbColor - This color may either be presented as a hex value (in RRGGBB format), 
+     *      or auto to allow a consumer to automatically determine the border color as appropriate.
+     */
     public void setInsideHBorder(XWPFBorderType type, int size, int space, String rgbColor) {
-        CTTblPr tblPr = getTrPr();
-        CTTblBorders ctb = tblPr.isSetTblBorders() ? tblPr.getTblBorders() : tblPr.addNewTblBorders();
-        CTBorder b = ctb.isSetInsideH() ? ctb.getInsideH() : ctb.addNewInsideH();
+        CTBorder b = getTblInsideHBorder(true);
         b.setVal(xwpfBorderTypeMap.get(type));
         b.setSz(BigInteger.valueOf(size));
         b.setSpace(BigInteger.valueOf(space));
         b.setColor(rgbColor);
     }
 
+    /**
+     * Set Inside Vertical borders for table
+     *
+     * @param type - {@link XWPFBorderType} e.g. single, double, thick
+     * @param size - Specifies the width of the current border. The width of this border is
+     *      specified in measurements of eighths of a point, with a minimum value of two (onefourth
+     *      of a point) and a maximum value of 96 (twelve points). Any values outside this
+     *      range may be reassigned to a more appropriate value.
+     * @param space - Specifies the spacing offset that shall be used to place this border on the table
+     * @param rgbColor - This color may either be presented as a hex value (in RRGGBB format), 
+     *      or auto to allow a consumer to automatically determine the border color as appropriate.
+     */
     public void setInsideVBorder(XWPFBorderType type, int size, int space, String rgbColor) {
-        CTTblPr tblPr = getTrPr();
-        CTTblBorders ctb = tblPr.isSetTblBorders() ? tblPr.getTblBorders() : tblPr.addNewTblBorders();
-        CTBorder b = ctb.isSetInsideV() ? ctb.getInsideV() : ctb.addNewInsideV();
+        CTBorder b = getTblInsideVBorder(true);
+        b.setVal(xwpfBorderTypeMap.get(type));
+        b.setSz(BigInteger.valueOf(size));
+        b.setSpace(BigInteger.valueOf(space));
+        b.setColor(rgbColor);
+    }
+
+    /**
+     * Set Top borders for table
+     *
+     * @param type - {@link XWPFBorderType} e.g. single, double, thick
+     * @param size - Specifies the width of the current border. The width of this border is
+     *      specified in measurements of eighths of a point, with a minimum value of two (onefourth
+     *      of a point) and a maximum value of 96 (twelve points). Any values outside this
+     *      range may be reassigned to a more appropriate value.
+     * @param space - Specifies the spacing offset that shall be used to place this border on the table
+     * @param rgbColor - This color may either be presented as a hex value (in RRGGBB format), 
+     *      or auto to allow a consumer to automatically determine the border color as appropriate.
+     */
+    public void setTopBorder(XWPFBorderType type, int size, int space, String rgbColor) {
+        CTBorder b = getTblTopBorder(true);
+        b.setVal(xwpfBorderTypeMap.get(type));
+        b.setSz(BigInteger.valueOf(size));
+        b.setSpace(BigInteger.valueOf(space));
+        b.setColor(rgbColor);
+    }
+
+    /**
+     * Set Bottom borders for table
+     *
+     * @param type - {@link XWPFBorderType} e.g. single, double, thick
+     * @param size - Specifies the width of the current border. The width of this border is
+     *      specified in measurements of eighths of a point, with a minimum value of two (onefourth
+     *      of a point) and a maximum value of 96 (twelve points). Any values outside this
+     *      range may be reassigned to a more appropriate value.
+     * @param space - Specifies the spacing offset that shall be used to place this border on the table
+     * @param rgbColor - This color may either be presented as a hex value (in RRGGBB format), 
+     *      or auto to allow a consumer to automatically determine the border color as appropriate.
+     */
+    public void setBottomBorder(XWPFBorderType type, int size, int space, String rgbColor) {
+        CTBorder b = getTblBottomBorder(true);
+        b.setVal(xwpfBorderTypeMap.get(type));
+        b.setSz(BigInteger.valueOf(size));
+        b.setSpace(BigInteger.valueOf(space));
+        b.setColor(rgbColor);
+    }
+
+    /**
+     * Set Left borders for table
+     *
+     * @param type - {@link XWPFBorderType} e.g. single, double, thick
+     * @param size - Specifies the width of the current border. The width of this border is
+     *      specified in measurements of eighths of a point, with a minimum value of two (onefourth
+     *      of a point) and a maximum value of 96 (twelve points). Any values outside this
+     *      range may be reassigned to a more appropriate value.
+     * @param space - Specifies the spacing offset that shall be used to place this border on the table
+     * @param rgbColor - This color may either be presented as a hex value (in RRGGBB format), 
+     *      or auto to allow a consumer to automatically determine the border color as appropriate.
+     */
+    public void setLeftBorder(XWPFBorderType type, int size, int space, String rgbColor) {
+        CTBorder b = getTblLeftBorder(true);
         b.setVal(xwpfBorderTypeMap.get(type));
         b.setSz(BigInteger.valueOf(size));
         b.setSpace(BigInteger.valueOf(space));
         b.setColor(rgbColor);
     }
 
+    /**
+     * Set Right borders for table
+     *
+     * @param type - {@link XWPFBorderType} e.g. single, double, thick
+     * @param size - Specifies the width of the current border. The width of this border is
+     *      specified in measurements of eighths of a point, with a minimum value of two (onefourth
+     *      of a point) and a maximum value of 96 (twelve points). Any values outside this
+     *      range may be reassigned to a more appropriate value.
+     * @param space - Specifies the spacing offset that shall be used to place this border on the table
+     * @param rgbColor - This color may either be presented as a hex value (in RRGGBB format), 
+     *      or auto to allow a consumer to automatically determine the border color as appropriate.
+     */
+    public void setRightBorder(XWPFBorderType type, int size, int space, String rgbColor) {
+        CTBorder b = getTblRightBorder(true);
+        b.setVal(xwpfBorderTypeMap.get(type));
+        b.setSz(BigInteger.valueOf(size));
+        b.setSpace(BigInteger.valueOf(space));
+        b.setColor(rgbColor);
+    }
+    
+    /**
+     * Remove inside horizontal borders for table
+     */
+    public void removeInsideHBorder() {
+        CTBorder b = getTblInsideHBorder(false);
+        if (b != null) {
+            getTblBorders(false).unsetInsideH();
+            cleanupTblBorders();
+        }
+    }
+    
+    /**
+     * Remove inside vertical borders for table
+     */
+    public void removeInsideVBorder() {
+        CTBorder b = getTblInsideVBorder(false);
+        if (b != null) {
+            getTblBorders(false).unsetInsideV();
+            cleanupTblBorders();
+        }
+    }
+    
+    /**
+     * Remove top borders for table
+     */
+    public void removeTopBorder() {
+        CTBorder b = getTblTopBorder(false);
+        if (b != null) {
+            getTblBorders(false).unsetTop();
+            cleanupTblBorders();
+        }
+    }
+    
+    /**
+     * Remove bottom borders for table
+     */
+    public void removeBottomBorder() {
+        CTBorder b = getTblBottomBorder(false);
+        if (b != null) {
+            getTblBorders(false).unsetBottom();
+            cleanupTblBorders();
+        }
+    }
+    
+    /**
+     * Remove left borders for table
+     */
+    public void removeLeftBorder() {
+        CTBorder b = getTblLeftBorder(false);
+        if (b != null) {
+            getTblBorders(false).unsetLeft();
+            cleanupTblBorders();
+        }
+    }
+    
+    /**
+     * Remove right borders for table
+     */
+    public void removeRightBorder() {
+        CTBorder b = getTblRightBorder(false);
+        if (b != null) {
+            getTblBorders(false).unsetRight();
+            cleanupTblBorders();
+        }
+    }
+    
+    /**
+     * Remove all borders from table
+     */
+    public void removeBorders() {
+        CTTblBorders b = getTblBorders(false);
+        if (b != null) {
+            getTblPr(false).unsetTblBorders();
+        }
+    }
+    
+    /**
+     * removes the Borders node from Table properties if there are 
+     * no border elements
+     */
+    private void cleanupTblBorders() {
+        CTTblBorders b = getTblBorders(false);
+        if (b != null) {
+            if (b.getInsideH() == null &&
+                    b.getInsideV() == null &&
+                    b.getTop() == null &&
+                    b.getBottom() == null &&
+                    b.getLeft() == null &&
+                    b.getRight() == null) {
+                getTblPr(false).unsetTblBorders();
+            }
+        }
+    }
+    
     public int getCellMarginTop() {
         int margin = 0;
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTTblCellMar tcm = tblPr.getTblCellMar();
         if (tcm != null) {
             CTTblWidth tw = tcm.getTop();
@@ -472,7 +961,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
 
     public int getCellMarginLeft() {
         int margin = 0;
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTTblCellMar tcm = tblPr.getTblCellMar();
         if (tcm != null) {
             CTTblWidth tw = tcm.getLeft();
@@ -485,7 +974,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
 
     public int getCellMarginBottom() {
         int margin = 0;
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTTblCellMar tcm = tblPr.getTblCellMar();
         if (tcm != null) {
             CTTblWidth tw = tcm.getBottom();
@@ -498,7 +987,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
 
     public int getCellMarginRight() {
         int margin = 0;
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTTblCellMar tcm = tblPr.getTblCellMar();
         if (tcm != null) {
             CTTblWidth tw = tcm.getRight();
@@ -510,7 +999,7 @@ public class XWPFTable implements IBodyElement, ISDTContents {
     }
 
     public void setCellMargins(int top, int left, int bottom, int right) {
-        CTTblPr tblPr = getTrPr();
+        CTTblPr tblPr = getTblPr();
         CTTblCellMar tcm = tblPr.isSetTblCellMar() ? tblPr.getTblCellMar() : tblPr.addNewTblCellMar();
 
         CTTblWidth tw = tcm.isSetLeft() ? tcm.getLeft() : tcm.addNewLeft();
index 449f6b6b84bf9bf727be6003790cac1795662c19..e264702c8081d4bac429a6cc6f23cb1aa12d70b5 100644 (file)
@@ -16,6 +16,7 @@
 ==================================================================== */
 package org.apache.poi.xwpf.usermodel;
 
+import java.io.IOException;
 import java.math.BigInteger;
 import java.util.List;
 
@@ -62,6 +63,11 @@ public class TestXWPFTable extends TestCase {
         assertEquals(3, ctTable.sizeOfTrArray());
         assertEquals(2, ctTable.getTrArray(0).sizeOfTcArray());
         assertNotNull(ctTable.getTrArray(0).getTcArray(0).getPArray(0));
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testTblGrid() {
@@ -74,6 +80,11 @@ public class TestXWPFTable extends TestCase {
         XWPFTable xtab = new XWPFTable(ctTable, doc);
         assertEquals(123, xtab.getCTTbl().getTblGrid().getGridColArray(0).getW().intValue());
         assertEquals(321, xtab.getCTTbl().getTblGrid().getGridColArray(1).getW().intValue());
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testGetText() {
@@ -88,6 +99,11 @@ public class TestXWPFTable extends TestCase {
 
         XWPFTable xtab = new XWPFTable(table, doc);
         assertEquals("finally I can write!\n", xtab.getText());
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
 
@@ -119,6 +135,11 @@ public class TestXWPFTable extends TestCase {
         //check creation of first row
         xtab = new XWPFTable(CTTbl.Factory.newInstance(), doc);
         assertEquals(1, xtab.getCTTbl().getTrArray(0).sizeOfTcArray());
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
 
@@ -134,6 +155,11 @@ public class TestXWPFTable extends TestCase {
 
         xtab.setWidth(100);
         assertEquals(100, table.getTblPr().getTblW().getW().intValue());
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testSetGetHeight() {
@@ -145,6 +171,11 @@ public class TestXWPFTable extends TestCase {
         XWPFTableRow row = xtab.createRow();
         row.setHeight(20);
         assertEquals(20, row.getHeight());
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testSetGetMargins() {
@@ -168,6 +199,11 @@ public class TestXWPFTable extends TestCase {
         assertEquals(250, b);
         int r = table.getCellMarginRight();
         assertEquals(450, r);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testSetGetHBorders() {
@@ -182,17 +218,64 @@ public class TestXWPFTable extends TestCase {
         XWPFDocument doc = new XWPFDocument();
         CTTbl ctTable = CTTbl.Factory.newInstance();
         XWPFTable table = new XWPFTable(ctTable, doc);
+        // check initial state
+        XWPFBorderType bt = table.getInsideHBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        int sz = table.getInsideHBorderSize();
+        assertEquals(-1, sz);
+        int sp = table.getInsideHBorderSpace();
+        assertEquals(-1, sp);
+        String clr = table.getInsideHBorderColor();
+        assertNull(clr);
         // set inside horizontal border
         table.setInsideHBorder(XWPFBorderType.SINGLE, 4, 0, "FF0000");
         // get inside horizontal border components
-        int s = table.getInsideHBorderSize();
-        assertEquals(4, s);
-        int sp = table.getInsideHBorderSpace();
+        bt = table.getInsideHBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        sz = table.getInsideHBorderSize();
+        assertEquals(4, sz);
+        sp = table.getInsideHBorderSpace();
         assertEquals(0, sp);
-        String clr = table.getInsideHBorderColor();
+        clr = table.getInsideHBorderColor();
         assertEquals("FF0000", clr);
-        XWPFBorderType bt = table.getInsideHBorderType();
+        // remove the border and verify state
+        table.removeInsideHBorder();
+        bt = table.getInsideHBorderType();
+        assertNull(bt);
+        sz = table.getInsideHBorderSize();
+        assertEquals(-1, sz);
+        sp = table.getInsideHBorderSpace();
+        assertEquals(-1, sp);
+        clr = table.getInsideHBorderColor();
+        assertNull(clr);
+        // check other borders
+        bt = table.getInsideVBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        bt = table.getTopBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        bt = table.getBottomBorderType();
         assertEquals(XWPFBorderType.SINGLE, bt);
+        bt = table.getLeftBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        bt = table.getRightBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        // remove the rest all at once and test
+        table.removeBorders();
+        bt = table.getInsideVBorderType();
+        assertNull(bt);
+        bt = table.getTopBorderType();
+        assertNull(bt);
+        bt = table.getBottomBorderType();
+        assertNull(bt);
+        bt = table.getLeftBorderType();
+        assertNull(bt);
+        bt = table.getRightBorderType();
+        assertNull(bt);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testSetGetVBorders() {
@@ -200,17 +283,236 @@ public class TestXWPFTable extends TestCase {
         XWPFDocument doc = new XWPFDocument();
         CTTbl ctTable = CTTbl.Factory.newInstance();
         XWPFTable table = new XWPFTable(ctTable, doc);
+        // check initial state
+        XWPFBorderType bt = table.getInsideVBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        int sz = table.getInsideVBorderSize();
+        assertEquals(-1, sz);
+        int sp = table.getInsideVBorderSpace();
+        assertEquals(-1, sp);
+        String clr = table.getInsideVBorderColor();
+        assertNull(clr);
         // set inside vertical border
         table.setInsideVBorder(XWPFBorderType.DOUBLE, 4, 0, "00FF00");
         // get inside vertical border components
-        XWPFBorderType bt = table.getInsideVBorderType();
+        bt = table.getInsideVBorderType();
         assertEquals(XWPFBorderType.DOUBLE, bt);
-        int sz = table.getInsideVBorderSize();
+        sz = table.getInsideVBorderSize();
         assertEquals(4, sz);
-        int sp = table.getInsideVBorderSpace();
+        sp = table.getInsideVBorderSpace();
         assertEquals(0, sp);
-        String clr = table.getInsideVBorderColor();
+        clr = table.getInsideVBorderColor();
+        assertEquals("00FF00", clr);
+        // remove the border and verify state
+        table.removeInsideVBorder();
+        bt = table.getInsideVBorderType();
+        assertNull(bt);
+        sz = table.getInsideVBorderSize();
+        assertEquals(-1, sz);
+        sp = table.getInsideVBorderSpace();
+        assertEquals(-1, sp);
+        clr = table.getInsideVBorderColor();
+        assertNull(clr);
+        // check the rest
+        bt = table.getInsideHBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        bt = table.getTopBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        bt = table.getBottomBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        bt = table.getLeftBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        bt = table.getRightBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        // remove the rest one at a time and test
+        table.removeInsideHBorder();
+        table.removeTopBorder();
+        table.removeBottomBorder();
+        table.removeLeftBorder();
+        table.removeRightBorder();
+        bt = table.getInsideHBorderType();
+        assertNull(bt);
+        bt = table.getTopBorderType();
+        assertNull(bt);
+        bt = table.getBottomBorderType();
+        assertNull(bt);
+        bt = table.getLeftBorderType();
+        assertNull(bt);
+        bt = table.getRightBorderType();
+        assertNull(bt);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
+    }
+
+    public void testSetGetTopBorders() {
+        // create a table
+        XWPFDocument doc = new XWPFDocument();
+        CTTbl ctTable = CTTbl.Factory.newInstance();
+        XWPFTable table = new XWPFTable(ctTable, doc);
+        // check initial state
+        XWPFBorderType bt = table.getTopBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        int sz = table.getTopBorderSize();
+        assertEquals(-1, sz);
+        int sp = table.getTopBorderSpace();
+        assertEquals(-1, sp);
+        String clr = table.getTopBorderColor();
+        assertNull(clr);
+        // set top border
+        table.setTopBorder(XWPFBorderType.THICK, 4, 0, "00FF00");
+        // get inside vertical border components
+        bt = table.getTopBorderType();
+        assertEquals(XWPFBorderType.THICK, bt);
+        sz = table.getTopBorderSize();
+        assertEquals(4, sz);
+        sp = table.getTopBorderSpace();
+        assertEquals(0, sp);
+        clr = table.getTopBorderColor();
         assertEquals("00FF00", clr);
+        // remove the border and verify state
+        table.removeTopBorder();
+        bt = table.getTopBorderType();
+        assertNull(bt);
+        sz = table.getTopBorderSize();
+        assertEquals(-1, sz);
+        sp = table.getTopBorderSpace();
+        assertEquals(-1, sp);
+        clr = table.getTopBorderColor();
+        assertNull(clr);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
+    }
+
+    public void testSetGetBottomBorders() {
+        // create a table
+        XWPFDocument doc = new XWPFDocument();
+        CTTbl ctTable = CTTbl.Factory.newInstance();
+        XWPFTable table = new XWPFTable(ctTable, doc);
+        // check initial state
+        XWPFBorderType bt = table.getBottomBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        int sz = table.getBottomBorderSize();
+        assertEquals(-1, sz);
+        int sp = table.getBottomBorderSpace();
+        assertEquals(-1, sp);
+        String clr = table.getBottomBorderColor();
+        assertNull(clr);
+        // set inside vertical border
+        table.setBottomBorder(XWPFBorderType.DOTTED, 4, 0, "00FF00");
+        // get inside vertical border components
+        bt = table.getBottomBorderType();
+        assertEquals(XWPFBorderType.DOTTED, bt);
+        sz = table.getBottomBorderSize();
+        assertEquals(4, sz);
+        sp = table.getBottomBorderSpace();
+        assertEquals(0, sp);
+        clr = table.getBottomBorderColor();
+        assertEquals("00FF00", clr);
+        // remove the border and verify state
+        table.removeBottomBorder();
+        bt = table.getBottomBorderType();
+        assertNull(bt);
+        sz = table.getBottomBorderSize();
+        assertEquals(-1, sz);
+        sp = table.getBottomBorderSpace();
+        assertEquals(-1, sp);
+        clr = table.getBottomBorderColor();
+        assertNull(clr);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
+    }
+
+    public void testSetGetLeftBorders() {
+        // create a table
+        XWPFDocument doc = new XWPFDocument();
+        CTTbl ctTable = CTTbl.Factory.newInstance();
+        XWPFTable table = new XWPFTable(ctTable, doc);
+        // check initial state
+        XWPFBorderType bt = table.getLeftBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        int sz = table.getLeftBorderSize();
+        assertEquals(-1, sz);
+        int sp = table.getLeftBorderSpace();
+        assertEquals(-1, sp);
+        String clr = table.getLeftBorderColor();
+        assertNull(clr);
+        // set inside vertical border
+        table.setLeftBorder(XWPFBorderType.DASHED, 4, 0, "00FF00");
+        // get inside vertical border components
+        bt = table.getLeftBorderType();
+        assertEquals(XWPFBorderType.DASHED, bt);
+        sz = table.getLeftBorderSize();
+        assertEquals(4, sz);
+        sp = table.getLeftBorderSpace();
+        assertEquals(0, sp);
+        clr = table.getLeftBorderColor();
+        assertEquals("00FF00", clr);
+        // remove the border and verify state
+        table.removeLeftBorder();
+        bt = table.getLeftBorderType();
+        assertNull(bt);
+        sz = table.getLeftBorderSize();
+        assertEquals(-1, sz);
+        sp = table.getLeftBorderSpace();
+        assertEquals(-1, sp);
+        clr = table.getLeftBorderColor();
+        assertNull(clr);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
+    }
+
+    public void testSetGetRightBorders() {
+        // create a table
+        XWPFDocument doc = new XWPFDocument();
+        CTTbl ctTable = CTTbl.Factory.newInstance();
+        XWPFTable table = new XWPFTable(ctTable, doc);
+        // check initial state
+        XWPFBorderType bt = table.getRightBorderType();
+        assertEquals(XWPFBorderType.SINGLE, bt);
+        int sz = table.getRightBorderSize();
+        assertEquals(-1, sz);
+        int sp = table.getRightBorderSpace();
+        assertEquals(-1, sp);
+        String clr = table.getRightBorderColor();
+        assertNull(clr);
+        // set inside vertical border
+        table.setRightBorder(XWPFBorderType.DOT_DASH, 4, 0, "00FF00");
+        // get inside vertical border components
+        bt = table.getRightBorderType();
+        assertEquals(XWPFBorderType.DOT_DASH, bt);
+        sz = table.getRightBorderSize();
+        assertEquals(4, sz);
+        sp = table.getRightBorderSpace();
+        assertEquals(0, sp);
+        clr = table.getRightBorderColor();
+        assertEquals("00FF00", clr);
+        // remove the border and verify state
+        table.removeRightBorder();
+        bt = table.getRightBorderType();
+        assertNull(bt);
+        sz = table.getRightBorderSize();
+        assertEquals(-1, sz);
+        sp = table.getRightBorderSpace();
+        assertEquals(-1, sp);
+        clr = table.getRightBorderColor();
+        assertNull(clr);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testSetGetRowBandSize() {
@@ -220,6 +522,11 @@ public class TestXWPFTable extends TestCase {
         table.setRowBandSize(12);
         int sz = table.getRowBandSize();
         assertEquals(12, sz);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testSetGetColBandSize() {
@@ -229,6 +536,11 @@ public class TestXWPFTable extends TestCase {
         table.setColBandSize(16);
         int sz = table.getColBandSize();
         assertEquals(16, sz);
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 
     public void testCreateTable() throws Exception {
@@ -254,5 +566,10 @@ public class TestXWPFTable extends TestCase {
             }
         }
         doc.getPackage().revert();
+        try {
+            doc.close();
+        } catch (IOException e) {
+            fail("Unable to close doc");
+        }
     }
 }
\ No newline at end of file