Fix bug #61490, for some tables in documents, we should not remove the last cell

Check the expected number of cells to see if the last cell should be removed.

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1866055 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2019-08-29 05:16:05 +00:00
parent 734d6911d8
commit be52865b38
3 changed files with 35 additions and 13 deletions

View File

@ -174,7 +174,8 @@ public final class TableRow extends Range
cells.add( tableCell ); cells.add( tableCell );
} }
if ( !cells.isEmpty() ) // sometimes there are "fake" cells which we need to exclude
if ( !cells.isEmpty() && cells.size() != expectedCellsCount )
{ {
TableCell lastCell = cells.get( cells.size() - 1 ); TableCell lastCell = cells.get( cells.size() - 1 );
if ( lastCell.numParagraphs() == 1 if ( lastCell.numParagraphs() == 1
@ -196,7 +197,7 @@ public final class TableRow extends Range
_tprops.setItcMac( (short) cells.size() ); _tprops.setItcMac( (short) cells.size() );
} }
_cells = cells.toArray( new TableCell[cells.size()] ); _cells = cells.toArray(new TableCell[0]);
_cellsFound = true; _cellsFound = true;
} }

View File

@ -20,6 +20,7 @@ import static org.apache.poi.POITestCase.assertContains;
import static org.apache.poi.POITestCase.assertNotContained; import static org.apache.poi.POITestCase.assertNotContained;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
@ -39,15 +40,17 @@ import org.apache.poi.hwpf.converter.AbstractWordUtils;
import org.apache.poi.hwpf.converter.WordToTextConverter; import org.apache.poi.hwpf.converter.WordToTextConverter;
import org.apache.poi.hwpf.extractor.Word6Extractor; import org.apache.poi.hwpf.extractor.Word6Extractor;
import org.apache.poi.hwpf.extractor.WordExtractor; import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.model.*; import org.apache.poi.hwpf.model.FieldsDocumentPart;
import org.apache.poi.hwpf.model.FileInformationBlock;
import org.apache.poi.hwpf.model.PicturesTable;
import org.apache.poi.hwpf.model.PlexOfField;
import org.apache.poi.hwpf.model.SubdocumentType;
import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogger;
import org.junit.Test; import org.junit.Test;
import junit.framework.TestCase;
/** /**
* Test different problems reported in the Apache Bugzilla * Test different problems reported in the Apache Bugzilla
* against HWPF * against HWPF
@ -61,7 +64,7 @@ public class TestBugs{
.replaceAll("\r", "\n").trim(); .replaceAll("\r", "\n").trim();
String newActual = actual.replaceAll("\r\n", "\n" ) String newActual = actual.replaceAll("\r\n", "\n" )
.replaceAll("\r", "\n").trim(); .replaceAll("\r", "\n").trim();
TestCase.assertEquals(newExpected, newActual); assertEquals(newExpected, newActual);
} }
private static void assertTableStructures(Range expected, Range actual ) { private static void assertTableStructures(Range expected, Range actual ) {
@ -72,7 +75,7 @@ public class TestBugs{
Paragraph actParagraph = actual.getParagraph(p); Paragraph actParagraph = actual.getParagraph(p);
assertEqualsIgnoreNewline(expParagraph.text(), actParagraph.text()); assertEqualsIgnoreNewline(expParagraph.text(), actParagraph.text());
assertEquals("Diffent isInTable flags for paragraphs #" + p assertEquals("Different isInTable flags for paragraphs #" + p
+ " -- " + expParagraph + " -- " + actParagraph + ".", + " -- " + expParagraph + " -- " + actParagraph + ".",
expParagraph.isInTable(), actParagraph.isInTable()); expParagraph.isInTable(), actParagraph.isInTable());
assertEquals(expParagraph.isTableRowEnd(), assertEquals(expParagraph.isTableRowEnd(),
@ -98,8 +101,8 @@ public class TestBugs{
} }
} }
private String getText(String samplefile) throws IOException { private String getText(String sampleFile) throws IOException {
HWPFDocument doc = HWPFTestDataSamples.openSampleFile(samplefile); HWPFDocument doc = HWPFTestDataSamples.openSampleFile(sampleFile);
WordExtractor extractor = new WordExtractor(doc); WordExtractor extractor = new WordExtractor(doc);
try { try {
return extractor.getText(); return extractor.getText();
@ -667,7 +670,7 @@ public class TestBugs{
} }
/** /**
* Bug 52032 - [BUG] & [partial-PATCH] HWPF - ArrayIndexOutofBoundsException * Bug 52032 - [BUG] & [partial-PATCH] HWPF - ArrayIndexOutOfBoundsException
* with no stack trace (broken after revision 1178063) * with no stack trace (broken after revision 1178063)
*/ */
@Test @Test
@ -676,7 +679,7 @@ public class TestBugs{
} }
/** /**
* Bug 52032 - [BUG] & [partial-PATCH] HWPF - ArrayIndexOutofBoundsException * Bug 52032 - [BUG] & [partial-PATCH] HWPF - ArrayIndexOutOfBoundsException
* with no stack trace (broken after revision 1178063) * with no stack trace (broken after revision 1178063)
*/ */
@Test @Test
@ -685,7 +688,7 @@ public class TestBugs{
} }
/** /**
* Bug 52032 - [BUG] & [partial-PATCH] HWPF - ArrayIndexOutofBoundsException * Bug 52032 - [BUG] & [partial-PATCH] HWPF - ArrayIndexOutOfBoundsException
* with no stack trace (broken after revision 1178063) * with no stack trace (broken after revision 1178063)
*/ */
@Test @Test
@ -782,7 +785,7 @@ public class TestBugs{
} }
} }
// Save away and re-read the document to prove the chages are permanent // Save away and re-read the document to prove the changes are permanent
document = HWPFTestDataSamples.writeOutAndReadBack(document); document = HWPFTestDataSamples.writeOutAndReadBack(document);
overallRange = document.getOverallRange(); overallRange = document.getOverallRange();
numParas = overallRange.numParagraphs(); numParas = overallRange.numParagraphs();
@ -871,4 +874,22 @@ public class TestBugs{
document.close(); document.close();
} }
@Test
public void test61490CellCountInTable() throws Exception {
try(HWPFDocument doc = HWPFTestDataSamples.openSampleFile("61490.doc")){
Range range = doc.getRange();
System.out.println("print table");
TableIterator tableIter = new TableIterator(range);
assertTrue(tableIter.hasNext());
Table table = tableIter.next();
TableRow row = table.getRow(2);
assertEquals(3, row.numCells());
for(int cellIdx = 0;cellIdx < row.numCells(); cellIdx++) {
TableCell cell = row.getCell(cellIdx);
assertEquals("3" + (cellIdx+1), cell.text().trim());
}
}
}
} }

Binary file not shown.