]> source.dussan.org Git - poi.git/commitdiff
bug 58191: Support merge cells within a table row; patch from Mark Olesen
authorJaven O'Neal <onealj@apache.org>
Sun, 11 Sep 2016 03:21:33 +0000 (03:21 +0000)
committerJaven O'Neal <onealj@apache.org>
Sun, 11 Sep 2016 03:21:33 +0000 (03:21 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1760217 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java
src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableRow.java

index 5326d9e784a29cff89defeaff197e7a6d5145dea..c4529c4aa743529ebe20ed2c38dd794027b53511 100644 (file)
@@ -32,9 +32,9 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow;
  * Represents a table in a .pptx presentation\r
  */\r
 public class XSLFTableRow implements Iterable<XSLFTableCell> {\r
-    private CTTableRow _row;\r
-    private List<XSLFTableCell> _cells;\r
-    private XSLFTable _table;\r
+    private final CTTableRow _row;\r
+    private final List<XSLFTableCell> _cells;\r
+    private final XSLFTable _table;\r
 \r
     /*package*/ XSLFTableRow(CTTableRow row, XSLFTable table){\r
         _row = row;\r
@@ -78,6 +78,29 @@ public class XSLFTableRow implements Iterable<XSLFTableCell> {
         _table.updateRowColIndexes();\r
         return cell;\r
     }\r
+    \r
+    /**\r
+     * Merge cells of a table row, inclusive.\r
+     * Indices are 0-based.\r
+     *\r
+     * @param firstCol 0-based index of first column to merge, inclusive\r
+     * @param lastCol 0-based index of last column to merge, inclusive\r
+     */\r
+    public void mergeCells(int firstCol, int lastCol)\r
+    {\r
+        if (firstCol >= lastCol) {\r
+            throw new IllegalArgumentException(\r
+                "Cannot merge, first column >= last column : "\r
+                + firstCol + " >= " + lastCol\r
+            );\r
+        }\r
+\r
+        final int colSpan = (lastCol - firstCol) + 1;\r
 \r
+        _cells.get(firstCol).setGridSpan(colSpan);\r
+        for (final XSLFTableCell cell : _cells.subList(firstCol+1, lastCol+1)) {\r
+            cell.setHMerge(true);\r
+        }\r
+    }\r
 \r
 }\r
index 6ef84ac26f4b5cec9164eea369c99c1d8720feed..8a08928193ecff1484ef129ea8ef78ca557f4e58 100644 (file)
 package org.apache.poi.xslf.usermodel;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.util.List;
@@ -103,6 +105,23 @@ public class TestXSLFTableRow {
         assertTrue(tc.getTcPr().getLnR().isSetNoFill());
     }
     
+    @Test
+    public void mergeCells() {
+        try {
+            row.mergeCells(0, 0);
+            fail("expected IllegalArgumentException when merging fewer than 2 columns");
+        } catch (final IllegalArgumentException e) {
+            // expected
+        }
+        
+        row.mergeCells(0, 1);
+        List<XSLFTableCell> cells = row.getCells();
+        //the top-left cell of a merged region is not regarded as merged
+        assertFalse("top-left cell of merged region", cells.get(0).isMerged());
+        assertTrue("inside merged region", cells.get(1).isMerged());
+        assertFalse("outside merged region", cells.get(2).isMerged());
+    }
+    
     @Test
     public void getXmlObject() {
         CTTableRow ctrow = row.getXmlObject();