Fix for bug #48245 - tweak HWPF table cell detection to work across more files

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@953694 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2010-06-11 13:29:44 +00:00
parent e92c009814
commit 05ddf6a51e
4 changed files with 361 additions and 166 deletions

View File

@ -34,6 +34,7 @@
<changes> <changes>
<release version="3.7-SNAPSHOT" date="2010-??-??"> <release version="3.7-SNAPSHOT" date="2010-??-??">
<action dev="POI-DEVELOPERS" type="add">48245 - tweak HWPF table cell detection to work across more files</action>
<action dev="POI-DEVELOPERS" type="add">48996 - initial support for External Name References in HSSF formula evaluation</action> <action dev="POI-DEVELOPERS" type="add">48996 - initial support for External Name References in HSSF formula evaluation</action>
<action dev="POI-DEVELOPERS" type="fix">46664 - fix up Tab IDs when adding new sheets, so that print areas don't end up invalid</action> <action dev="POI-DEVELOPERS" type="fix">46664 - fix up Tab IDs when adding new sheets, so that print areas don't end up invalid</action>
<action dev="POI-DEVELOPERS" type="fix">45269 - improve replaceText on HWPF ranges</action> <action dev="POI-DEVELOPERS" type="fix">45269 - improve replaceText on HWPF ranges</action>

View File

@ -17,6 +17,7 @@
package org.apache.poi.hwpf.usermodel; package org.apache.poi.hwpf.usermodel;
import org.apache.poi.hwpf.model.PropertyNode;
import org.apache.poi.hwpf.sprm.TableSprmUncompressor; import org.apache.poi.hwpf.sprm.TableSprmUncompressor;
public final class TableRow public final class TableRow
@ -57,10 +58,19 @@ public final class TableRow
p = getParagraph(end); p = getParagraph(end);
s = p.text(); s = p.text();
} }
_cells[cellIndex] = new TableCell(start, end+1, this, levelNum,
// Create it for the correct paragraph range
_cells[cellIndex] = new TableCell(start, end, this, levelNum,
_tprops.getRgtc()[cellIndex], _tprops.getRgtc()[cellIndex],
_tprops.getRgdxaCenter()[cellIndex], _tprops.getRgdxaCenter()[cellIndex],
_tprops.getRgdxaCenter()[cellIndex+1]-_tprops.getRgdxaCenter()[cellIndex]); _tprops.getRgdxaCenter()[cellIndex+1]-_tprops.getRgdxaCenter()[cellIndex]);
// Now we've decided where everything is, tweak the
// record of the paragraph end so that the
// paragraph level counts work
// This is a bit hacky, we really need a better fix...
_cells[cellIndex]._parEnd++;
// Next!
end++; end++;
start = end; start = end;
} }

View File

@ -80,6 +80,18 @@ public final class TestProblems extends HWPFTestCase {
assertEquals(0, p.getStartOffset()); assertEquals(0, p.getStartOffset());
assertEquals(20, p.getEndOffset()); assertEquals(20, p.getEndOffset());
// Check a few bits of the table directly
assertEquals("One paragraph is ok\7", r.getParagraph(0).text());
assertEquals("First para is ok\r", r.getParagraph(1).text());
assertEquals("Second paragraph is skipped\7", r.getParagraph(2).text());
assertEquals("One paragraph is ok\7", r.getParagraph(3).text());
assertEquals("\7", r.getParagraph(4).text());
assertEquals("\r", r.getParagraph(5).text());
for(int i=0; i<=5; i++) {
assertFalse(r.getParagraph(i).usesUnicode());
}
// Get the table // Get the table
Table t = r.getTable(p); Table t = r.getTable(p);
@ -87,11 +99,24 @@ public final class TestProblems extends HWPFTestCase {
assertEquals(1, t.numRows()); assertEquals(1, t.numRows());
TableRow row = t.getRow(0); TableRow row = t.getRow(0);
// sanity check our row
assertEquals(5, row.numParagraphs());
assertEquals(0, row._parStart);
assertEquals(5, row._parEnd);
assertEquals(0, row.getStartOffset());
assertEquals(87, row.getEndOffset());
// get the first cell // get the first cell
TableCell cell = row.getCell(0); TableCell cell = row.getCell(0);
// First cell should have one paragraph // First cell should have one paragraph
assertEquals(1, cell.numParagraphs()); assertEquals(1, cell.numParagraphs());
assertEquals("One paragraph is ok\7", cell.getParagraph(0).text()); assertEquals("One paragraph is ok\7", cell.getParagraph(0).text());
assertEquals(0, cell._parStart);
assertEquals(1, cell._parEnd);
assertEquals(0, cell.getStartOffset());
assertEquals(20, cell.getEndOffset());
// get the second // get the second
cell = row.getCell(1); cell = row.getCell(1);
@ -99,12 +124,21 @@ public final class TestProblems extends HWPFTestCase {
assertEquals(2, cell.numParagraphs()); assertEquals(2, cell.numParagraphs());
assertEquals("First para is ok\r", cell.getParagraph(0).text()); assertEquals("First para is ok\r", cell.getParagraph(0).text());
assertEquals("Second paragraph is skipped\7", cell.getParagraph(1).text()); assertEquals("Second paragraph is skipped\7", cell.getParagraph(1).text());
assertEquals(1, cell._parStart);
assertEquals(3, cell._parEnd);
assertEquals(20, cell.getStartOffset());
assertEquals(65, cell.getEndOffset());
// get the last cell // get the last cell
cell = row.getCell(2); cell = row.getCell(2);
// Last cell should have one paragraph // Last cell should have one paragraph
assertEquals(1, cell.numParagraphs()); assertEquals(1, cell.numParagraphs());
assertEquals("One paragraph is ok\7", cell.getParagraph(0).text()); assertEquals("One paragraph is ok\7", cell.getParagraph(0).text());
assertEquals(3, cell._parStart);
assertEquals(4, cell._parEnd);
assertEquals(65, cell.getStartOffset());
assertEquals(85, cell.getEndOffset());
} }
public void testRangeDelete() { public void testRangeDelete() {
@ -198,4 +232,154 @@ public final class TestProblems extends HWPFTestCase {
} }
} }
} }
/**
* Bug #48245 - don't include the text from the
* next cell in the current one
*/
public void testTableIterator() throws Exception {
HWPFDocument doc = HWPFTestDataSamples.openSampleFile("simple-table2.doc");
Range r = doc.getRange();
// Check the text is as we'd expect
assertEquals(13, r.numParagraphs());
assertEquals("Row 1/Cell 1\u0007", r.getParagraph(0).text());
assertEquals("Row 1/Cell 2\u0007", r.getParagraph(1).text());
assertEquals("Row 1/Cell 3\u0007", r.getParagraph(2).text());
assertEquals("\u0007", r.getParagraph(3).text());
assertEquals("Row 2/Cell 1\u0007", r.getParagraph(4).text());
assertEquals("Row 2/Cell 2\u0007", r.getParagraph(5).text());
assertEquals("Row 2/Cell 3\u0007", r.getParagraph(6).text());
assertEquals("\u0007", r.getParagraph(7).text());
assertEquals("Row 3/Cell 1\u0007", r.getParagraph(8).text());
assertEquals("Row 3/Cell 2\u0007", r.getParagraph(9).text());
assertEquals("Row 3/Cell 3\u0007", r.getParagraph(10).text());
assertEquals("\u0007", r.getParagraph(11).text());
assertEquals("\r", r.getParagraph(12).text());
for(int i=0; i<=12; i++) {
assertFalse(r.getParagraph(i).usesUnicode());
}
Paragraph p;
// Take a look in detail at the first couple of
// paragraphs
p = r.getParagraph(0);
assertEquals(1, p.numParagraphs());
assertEquals(0, p.getStartOffset());
assertEquals(13, p.getEndOffset());
assertEquals(0, p._parStart);
assertEquals(1, p._parEnd);
p = r.getParagraph(1);
assertEquals(1, p.numParagraphs());
assertEquals(13, p.getStartOffset());
assertEquals(26, p.getEndOffset());
assertEquals(1, p._parStart);
assertEquals(2, p._parEnd);
p = r.getParagraph(2);
assertEquals(1, p.numParagraphs());
assertEquals(26, p.getStartOffset());
assertEquals(39, p.getEndOffset());
assertEquals(2, p._parStart);
assertEquals(3, p._parEnd);
// Now look at the table
Table table = r.getTable(r.getParagraph(0));
assertEquals(3, table.numRows());
TableRow row;
TableCell cell;
row = table.getRow(0);
assertEquals(0, row._parStart);
assertEquals(4, row._parEnd);
cell = row.getCell(0);
assertEquals(1, cell.numParagraphs());
assertEquals(0, cell._parStart);
assertEquals(1, cell._parEnd);
assertEquals(0, cell.getStartOffset());
assertEquals(13, cell.getEndOffset());
assertEquals("Row 1/Cell 1\u0007", cell.text());
cell = row.getCell(1);
assertEquals(1, cell.numParagraphs());
assertEquals(1, cell._parStart);
assertEquals(2, cell._parEnd);
assertEquals(13, cell.getStartOffset());
assertEquals(26, cell.getEndOffset());
assertEquals("Row 1/Cell 2\u0007", cell.text());
cell = row.getCell(2);
assertEquals(1, cell.numParagraphs());
assertEquals(2, cell._parStart);
assertEquals(3, cell._parEnd);
assertEquals(26, cell.getStartOffset());
assertEquals(39, cell.getEndOffset());
assertEquals("Row 1/Cell 3\u0007", cell.text());
// Onto row #2
row = table.getRow(1);
assertEquals(4, row._parStart);
assertEquals(8, row._parEnd);
cell = row.getCell(0);
assertEquals(1, cell.numParagraphs());
assertEquals(4, cell._parStart);
assertEquals(5, cell._parEnd);
assertEquals(40, cell.getStartOffset());
assertEquals(53, cell.getEndOffset());
assertEquals("Row 2/Cell 1\u0007", cell.text());
cell = row.getCell(1);
assertEquals(1, cell.numParagraphs());
assertEquals(5, cell._parStart);
assertEquals(6, cell._parEnd);
assertEquals(53, cell.getStartOffset());
assertEquals(66, cell.getEndOffset());
assertEquals("Row 2/Cell 2\u0007", cell.text());
cell = row.getCell(2);
assertEquals(1, cell.numParagraphs());
assertEquals(6, cell._parStart);
assertEquals(7, cell._parEnd);
assertEquals(66, cell.getStartOffset());
assertEquals(79, cell.getEndOffset());
assertEquals("Row 2/Cell 3\u0007", cell.text());
// Finally row 3
row = table.getRow(2);
assertEquals(8, row._parStart);
assertEquals(12, row._parEnd);
cell = row.getCell(0);
assertEquals(1, cell.numParagraphs());
assertEquals(8, cell._parStart);
assertEquals(9, cell._parEnd);
assertEquals(80, cell.getStartOffset());
assertEquals(93, cell.getEndOffset());
assertEquals("Row 3/Cell 1\u0007", cell.text());
cell = row.getCell(1);
assertEquals(1, cell.numParagraphs());
assertEquals(9, cell._parStart);
assertEquals(10, cell._parEnd);
assertEquals(93, cell.getStartOffset());
assertEquals(106, cell.getEndOffset());
assertEquals("Row 3/Cell 2\u0007", cell.text());
cell = row.getCell(2);
assertEquals(1, cell.numParagraphs());
assertEquals(10, cell._parStart);
assertEquals(11, cell._parEnd);
assertEquals(106, cell.getStartOffset());
assertEquals(119, cell.getEndOffset());
assertEquals("Row 3/Cell 3\u0007", cell.text());
}
} }

Binary file not shown.