From 02d2336ed299963ebda5843f96638794eb81f299 Mon Sep 17 00:00:00 2001 From: Javen O'Neal Date: Sun, 11 Sep 2016 03:21:33 +0000 Subject: [PATCH] bug 58191: Support merge cells within a table row; patch from Mark Olesen git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1760217 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xslf/usermodel/XSLFTableRow.java | 29 +++++++++++++++++-- .../poi/xslf/usermodel/TestXSLFTableRow.java | 19 ++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java index 5326d9e784..c4529c4aa7 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java @@ -32,9 +32,9 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow; * Represents a table in a .pptx presentation */ public class XSLFTableRow implements Iterable { - private CTTableRow _row; - private List _cells; - private XSLFTable _table; + private final CTTableRow _row; + private final List _cells; + private final XSLFTable _table; /*package*/ XSLFTableRow(CTTableRow row, XSLFTable table){ _row = row; @@ -78,6 +78,29 @@ public class XSLFTableRow implements Iterable { _table.updateRowColIndexes(); return cell; } + + /** + * Merge cells of a table row, inclusive. + * Indices are 0-based. + * + * @param firstCol 0-based index of first column to merge, inclusive + * @param lastCol 0-based index of last column to merge, inclusive + */ + public void mergeCells(int firstCol, int lastCol) + { + if (firstCol >= lastCol) { + throw new IllegalArgumentException( + "Cannot merge, first column >= last column : " + + firstCol + " >= " + lastCol + ); + } + + final int colSpan = (lastCol - firstCol) + 1; + _cells.get(firstCol).setGridSpan(colSpan); + for (final XSLFTableCell cell : _cells.subList(firstCol+1, lastCol+1)) { + cell.setHMerge(true); + } + } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableRow.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableRow.java index 6ef84ac26f..8a08928193 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableRow.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableRow.java @@ -17,9 +17,11 @@ 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 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(); -- 2.39.5