#60993 - HSLF: Grid and rowspan calculation in table cells is wrong

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1791500 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2017-04-15 12:14:26 +00:00
parent 0acf44d3dc
commit 160fb550c1
4 changed files with 63 additions and 12 deletions

View File

@ -20,6 +20,10 @@
package org.apache.poi.sl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import java.awt.geom.Rectangle2D;
@ -30,6 +34,7 @@ import java.io.InputStream;
import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.sl.usermodel.Slide;
import org.apache.poi.sl.usermodel.SlideShow;
import org.apache.poi.sl.usermodel.SlideShowFactory;
import org.apache.poi.sl.usermodel.TableCell;
@ -66,7 +71,7 @@ public class TestTable {
}
@Test
public void testColWidthRowHeight() throws IOException {
public void colWidthRowHeight() throws IOException {
assumeFalse(xslfOnly);
// Test of table dimensions of same slideshow saved as ppt/x
@ -110,7 +115,7 @@ public class TestTable {
}
@Test
public void testTextDirectionHSLF() throws IOException {
public void textDirectionHSLF() throws IOException {
assumeFalse(xslfOnly);
SlideShow<?,?> ppt1 = new HSLFSlideShow();
testTextDirection(ppt1);
@ -118,7 +123,7 @@ public class TestTable {
}
@Test
public void testTextDirectionXSLF() throws IOException {
public void textDirectionXSLF() throws IOException {
SlideShow<?,?> ppt1 = new XMLSlideShow();
testTextDirection(ppt1);
ppt1.close();
@ -160,4 +165,53 @@ public class TestTable {
}
ppt2.close();
}
}
@Test
public void tableSpan() throws IOException {
String files[] = (xslfOnly) ? new String[]{ "bug60993.pptx" } : new String[]{ "bug60993.pptx", "bug60993.ppt" };
for (String f : files) {
SlideShow<?,?> ppt = openSampleSlideshow(f);
Slide<?,?> slide = ppt.getSlides().get(0);
TableShape<?,?> ts = (TableShape<?,?>)slide.getShapes().get(0);
int cols = ts.getNumberOfColumns();
int rows = ts.getNumberOfRows();
for (int r=0; r<rows; r++) {
for (int c=0; c<cols; c++) {
TableCell<?,?> tc = ts.getCell(r, c);
int rc = r*10+c;
String msg = f+" (r"+r+",c"+c+")";
switch (rc) {
case 22:
case 51:
if (f.endsWith("ppt")) {
assertNull(msg, tc);
} else {
assertNotNull(msg, tc);
assertTrue(msg, tc.isMerged());
}
break;
case 21:
assertNotNull(msg, tc);
assertEquals(msg, 1, tc.getRowSpan());
assertEquals(msg, 2, tc.getGridSpan());
assertFalse(msg, tc.isMerged());
break;
case 41:
assertNotNull(msg, tc);
assertEquals(msg, 2, tc.getRowSpan());
assertEquals(msg, 1, tc.getGridSpan());
assertFalse(msg, tc.isMerged());
break;
default:
assertNotNull(msg, tc);
assertEquals(msg, 1, tc.getRowSpan());
assertEquals(msg, 1, tc.getGridSpan());
assertFalse(msg, tc.isMerged());
break;
}
}
}
ppt.close();
}
}
}

View File

@ -21,6 +21,7 @@ import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
@ -218,15 +219,11 @@ implements HSLFShapeContainer, TableShape<HSLFShape,HSLFTextParagraph> {
}
private int calcSpan(List<Double> spaces, double totalSpace, int idx) {
if (idx == spaces.size()-1) {
return 1;
}
int span = 0;
double remainingSpace = totalSpace;
while (idx+1 < spaces.size() && remainingSpace > 0) {
remainingSpace -= spaces.get(idx+1)-spaces.get(idx);
int span = 1;
ListIterator<Double> li = spaces.listIterator(idx);
double start = li.next();
while (li.hasNext() && li.next()-start < totalSpace) {
span++;
idx++;
}
return span;
}

Binary file not shown.

Binary file not shown.