Bug 63073: Adjust returned index of merged regions and verify all calls in tests

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1858021 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2019-04-23 20:27:39 +00:00
parent d7aedc7978
commit cd52566c98
16 changed files with 138 additions and 127 deletions

View File

@ -392,7 +392,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
*
* @param region to merge
* @param validate whether to validate merged region
* @return index of this region
* @return 0-based index of this region
* @throws IllegalArgumentException if region contains fewer than 2 cells (this check is inexpensive and is performed regardless of <tt>validate</tt>)
* @throws IllegalStateException if region intersects with a multi-cell array formula
* @throws IllegalStateException if region intersects with an existing region on this sheet
@ -416,7 +416,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
CTMergeCells ctMergeCells = worksheet.isSetMergeCells() ? worksheet.getMergeCells() : worksheet.addNewMergeCells();
CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();
ctMergeCell.setRef(region.formatAsString());
return ctMergeCells.sizeOfMergeCellArray();
return ctMergeCells.sizeOfMergeCellArray()-1;
}
/**

View File

@ -46,7 +46,7 @@ import org.junit.Test;
* Tests the auto-sizing behaviour of {@link SXSSFSheet} when not all
* rows fit into the memory window size etc.
*
* @see Bug #57450 which reported the original mis-behaviour
* see Bug #57450 which reported the original misbehaviour
*/
public class TestAutoSizeColumnTracker {
@ -169,12 +169,12 @@ public class TestAutoSizeColumnTracker {
}
tracker.updateColumnWidths(row1);
tracker.updateColumnWidths(row2);
sheet.addMergedRegion(CellRangeAddress.valueOf("D1:E1"));
assertEquals(0, sheet.addMergedRegion(CellRangeAddress.valueOf("D1:E1")));
assumeRequiredFontsAreInstalled(workbook, row1.getCell(columns.iterator().next()));
// Excel 2013 and LibreOffice 4.2.8.2 both treat columns with merged regions as blank
/** A B C D E
/* A B C D E
* 1 LONG LONG LONGMERGE
* 2 SHORT SHORT SHORT
*/

View File

@ -50,7 +50,7 @@ import org.junit.runners.Parameterized.Parameters;
* Tests the auto-sizing behaviour of {@link SXSSFSheet} when not all
* rows fit into the memory window size etc.
*
* @see Bug #57450 which reported the original mis-behaviour
* see Bug #57450 which reported the original misbehaviour
*/
@RunWith(Parameterized.class)
public class TestSXSSFSheetAutoSizeColumn {
@ -79,7 +79,7 @@ public class TestSXSSFSheetAutoSizeColumn {
private SXSSFSheet sheet;
private SXSSFWorkbook workbook;
@Parameter(0)
@Parameter
public boolean useMergedCells;
@Parameters(name="{index}: useMergedCells={0}")
@ -189,11 +189,11 @@ public class TestSXSSFSheetAutoSizeColumn {
Cell a1 = createRowWithCellValues(sheet, 0, LONG_CELL_VALUE);
assumeRequiredFontsAreInstalled(workbook, a1);
sheet.addMergedRegion(CellRangeAddress.valueOf("A1:B1"));
assertEquals(0, sheet.addMergedRegion(CellRangeAddress.valueOf("A1:B1")));
createRowWithCellValues(sheet, 1, SHORT_CELL_VALUE, SHORT_CELL_VALUE);
/**
/*
* A B
* 1 LONGMERGED
* 2 SHORT SHORT

View File

@ -164,6 +164,8 @@ public final class TestUnfixedBugs {
wbBack.close();
}
// This test will run green, but the resulting file is formatted incorrectly,
// see the bug at https://bz.apache.org/bugzilla/show_bug.cgi?id=55752
@Test
public void testBug55752() throws IOException {
try (Workbook wb = new XSSFWorkbook()) {
@ -189,16 +191,16 @@ public final class TestUnfixedBugs {
// merge cells
CellRangeAddress range1 = new CellRangeAddress(0, 0, 0, 1);
sheet.addMergedRegion(range1);
assertEquals(0, sheet.addMergedRegion(range1));
CellRangeAddress range2 = new CellRangeAddress(1, 1, 0, 1);
sheet.addMergedRegion(range2);
assertEquals(1, sheet.addMergedRegion(range2));
CellRangeAddress range3 = new CellRangeAddress(2, 2, 0, 1);
sheet.addMergedRegion(range3);
assertEquals(2, sheet.addMergedRegion(range3));
assertEquals(0, range3.getFirstColumn());
assertEquals(1, range3.getLastColumn());
assertEquals(2, range3.getLastRow());
CellRangeAddress range4 = new CellRangeAddress(3, 3, 0, 1);
sheet.addMergedRegion(range4);
assertEquals(3, sheet.addMergedRegion(range4));
// set border
RegionUtil.setBorderBottom(BorderStyle.THIN, range1, sheet);

View File

@ -275,9 +275,9 @@ public final class TestXSSFSheet extends BaseTestXSheet {
CellRangeAddress region_2 = CellRangeAddress.valueOf("C3:D4");
CellRangeAddress region_3 = CellRangeAddress.valueOf("E5:F6");
CellRangeAddress region_4 = CellRangeAddress.valueOf("G7:H8");
sheet.addMergedRegion(region_1);
sheet.addMergedRegion(region_2);
sheet.addMergedRegion(region_3);
assertEquals(0, sheet.addMergedRegion(region_1));
assertEquals(1, sheet.addMergedRegion(region_2));
assertEquals(2, sheet.addMergedRegion(region_3));
assertEquals("C3:D4", ctWorksheet.getMergeCells().getMergeCellArray(1).getRef());
assertEquals(3, sheet.getNumMergedRegions());
sheet.removeMergedRegion(1);
@ -288,10 +288,10 @@ public final class TestXSSFSheet extends BaseTestXSheet {
assertEquals(0, sheet.getNumMergedRegions());
assertNull(" CTMergeCells should be deleted after removing the last merged " +
"region on the sheet.", sheet.getCTWorksheet().getMergeCells());
sheet.addMergedRegion(region_1);
sheet.addMergedRegion(region_2);
sheet.addMergedRegion(region_3);
sheet.addMergedRegion(region_4);
assertEquals(0, sheet.addMergedRegion(region_1));
assertEquals(1, sheet.addMergedRegion(region_2));
assertEquals(2, sheet.addMergedRegion(region_3));
assertEquals(3, sheet.addMergedRegion(region_4));
// test invalid indexes OOBE
Set<Integer> rmIdx = new HashSet<>(Arrays.asList(5, 6));
sheet.removeMergedRegions(rmIdx);

View File

@ -524,7 +524,7 @@ public final class TestHSSFSheet extends BaseTestSheet {
int sclLoc = sheet.getSheet().findFirstRecordLocBySid(SCLRecord.sid);
int window2Loc = sheet.getSheet().findFirstRecordLocBySid(WindowTwoRecord.sid);
assertTrue(sclLoc == window2Loc + 1);
assertEquals(sclLoc, window2Loc + 1);
// verify limits
try {
@ -667,7 +667,7 @@ public final class TestHSSFSheet extends BaseTestSheet {
assertTrue("Column autosized with only one row: wrong width", sheet.getColumnWidth(0) <= maxWithRow1And2);
//create a region over the 2nd row and auto size the first column
sheet.addMergedRegion(new CellRangeAddress(1,1,0,1));
assertEquals(1, sheet.addMergedRegion(new CellRangeAddress(1,1,0,1)));
assertNotNull(sheet.getMergedRegion(0));
sheet.autoSizeColumn((short)0);
HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);

View File

@ -386,8 +386,8 @@ public final class TestWorkbook {
populateSheet(s);
s.addMergedRegion(new CellRangeAddress(0, 10, 0, 10));
s.addMergedRegion(new CellRangeAddress(30, 40, 5, 15));
assertEquals(0, s.addMergedRegion(new CellRangeAddress(0, 10, 0, 10)));
assertEquals(1, s.addMergedRegion(new CellRangeAddress(30, 40, 5, 15)));
sanityChecker.checkHSSFWorkbook(wb1);
HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);

View File

@ -154,30 +154,30 @@ public abstract class BaseTestBugzillaIssues {
*/
@Test
public void bug22720() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
wb.createSheet("TEST");
Sheet template = wb.getSheetAt(0);
Workbook wb = _testDataProvider.createWorkbook();
wb.createSheet("TEST");
Sheet template = wb.getSheetAt(0);
template.addMergedRegion(new CellRangeAddress(0, 1, 0, 2));
template.addMergedRegion(new CellRangeAddress(2, 3, 0, 2));
assertEquals(0, template.addMergedRegion(new CellRangeAddress(0, 1, 0, 2)));
assertEquals(1, template.addMergedRegion(new CellRangeAddress(2, 3, 0, 2)));
Sheet clone = wb.cloneSheet(0);
int originalMerged = template.getNumMergedRegions();
assertEquals("2 merged regions", 2, originalMerged);
Sheet clone = wb.cloneSheet(0);
int originalMerged = template.getNumMergedRegions();
assertEquals("2 merged regions", 2, originalMerged);
//remove merged regions from clone
for (int i=template.getNumMergedRegions()-1; i>=0; i--) {
clone.removeMergedRegion(i);
}
//remove merged regions from clone
for (int i=template.getNumMergedRegions()-1; i>=0; i--) {
clone.removeMergedRegion(i);
}
assertEquals("Original Sheet's Merged Regions were removed", originalMerged, template.getNumMergedRegions());
//check if template's merged regions are OK
if (template.getNumMergedRegions()>0) {
assertEquals("Original Sheet's Merged Regions were removed", originalMerged, template.getNumMergedRegions());
//check if template's merged regions are OK
if (template.getNumMergedRegions()>0) {
// fetch the first merged region...EXCEPTION OCCURS HERE
template.getMergedRegion(0);
}
}
wb.close();
wb.close();
}
@Test

View File

@ -41,7 +41,7 @@ public abstract class BaseTestCloneSheet {
public void testCloneSheetBasic() throws IOException{
Workbook b = _testDataProvider.createWorkbook();
Sheet s = b.createSheet("Test");
s.addMergedRegion(new CellRangeAddress(0, 1, 0, 1));
assertEquals(0, s.addMergedRegion(new CellRangeAddress(0, 1, 0, 1)));
Sheet clonedSheet = b.cloneSheet(0);
assertEquals("One merged area", 1, clonedSheet.getNumMergedRegions());
@ -51,7 +51,6 @@ public abstract class BaseTestCloneSheet {
/**
* Ensures that pagebreak cloning works properly
* @throws IOException
*/
@Test
public void testPageBreakClones() throws IOException {

View File

@ -277,7 +277,7 @@ public abstract class BaseTestSheet {
final Sheet sheet = wb.createSheet();
final CellRangeAddress baseRegion = new CellRangeAddress(0, 1, 0, 1); //A1:B2
sheet.addMergedRegion(baseRegion);
assertEquals(0, sheet.addMergedRegion(baseRegion));
try {
final CellRangeAddress duplicateRegion = new CellRangeAddress(0, 1, 0, 1); //A1:B2
@ -316,7 +316,7 @@ public abstract class BaseTestSheet {
}
final CellRangeAddress disjointRegion = new CellRangeAddress(10, 11, 10, 11);
sheet.addMergedRegion(disjointRegion);
assertEquals(1, sheet.addMergedRegion(disjointRegion));
wb.close();
}
@ -352,7 +352,7 @@ public abstract class BaseTestSheet {
SpreadsheetVersion ssVersion = _testDataProvider.getSpreadsheetVersion();
CellRangeAddress region = new CellRangeAddress(0, 1, 0, 1);
sheet.addMergedRegion(region);
assertEquals(0, sheet.addMergedRegion(region));
assertEquals(1, sheet.getNumMergedRegions());
try {
@ -390,9 +390,9 @@ public abstract class BaseTestSheet {
Workbook wb = _testDataProvider.createWorkbook();
Sheet sheet = wb.createSheet();
CellRangeAddress region = new CellRangeAddress(0, 1, 0, 1);
sheet.addMergedRegion(region);
assertEquals(0, sheet.addMergedRegion(region));
region = new CellRangeAddress(2, 3, 0, 1);
sheet.addMergedRegion(region);
assertEquals(1, sheet.addMergedRegion(region));
sheet.removeMergedRegion(0);
@ -404,14 +404,14 @@ public abstract class BaseTestSheet {
assertEquals("there should be no merged regions left!", 0, sheet.getNumMergedRegions());
//an, add, remove, get(0) would null pointer
sheet.addMergedRegion(region);
assertEquals(0, sheet.addMergedRegion(region));
assertEquals("there should now be one merged region!", 1, sheet.getNumMergedRegions());
sheet.removeMergedRegion(0);
assertEquals("there should now be zero merged regions!", 0, sheet.getNumMergedRegions());
//add it again!
region.setLastRow(4);
sheet.addMergedRegion(region);
assertEquals(0, sheet.addMergedRegion(region));
assertEquals("there should now be one merged region!", 1, sheet.getNumMergedRegions());
//should exist now!
@ -434,7 +434,7 @@ public abstract class BaseTestSheet {
for (int r=0; r<10; r++) {
CellRangeAddress region = new CellRangeAddress(r, r, 0, 1);
mergedRegions.put(r, region);
sheet.addMergedRegion(region);
assertEquals(r, sheet.addMergedRegion(region));
}
assertCollectionEquals(mergedRegions.values(), sheet.getMergedRegions());
@ -466,7 +466,7 @@ public abstract class BaseTestSheet {
cell.setCellValue(factory.createRichTextString("second row, second cell"));
CellRangeAddress region = CellRangeAddress.valueOf("A2:B2");
sheet.addMergedRegion(region);
assertEquals(0, sheet.addMergedRegion(region));
sheet.shiftRows(1, 1, 1);
@ -495,13 +495,13 @@ public abstract class BaseTestSheet {
assumeTrue(region1.intersects(region2));
assumeTrue(region2.intersects(region3));
sh.addMergedRegionUnsafe(region1);
assertEquals(0, sh.addMergedRegionUnsafe(region1));
assertTrue(sh.getMergedRegions().contains(region1));
// adding a duplicate or overlapping merged region should not
// raise an exception with the unsafe version of addMergedRegion.
sh.addMergedRegionUnsafe(region2);
assertEquals(1, sh.addMergedRegionUnsafe(region2));
// the safe version of addMergedRegion should throw when trying to add a merged region that overlaps an existing region
assertTrue(sh.getMergedRegions().contains(region2));
@ -513,7 +513,7 @@ public abstract class BaseTestSheet {
assertFalse(sh.getMergedRegions().contains(region3));
}
// addMergedRegion should not re-validate previously-added merged regions
sh.addMergedRegion(region4);
assertEquals(2, sh.addMergedRegion(region4));
// validation methods should detect a problem with previously added merged regions (runs in O(n^2) time)
try {
@ -534,10 +534,10 @@ public abstract class BaseTestSheet {
Workbook wb1 = _testDataProvider.createWorkbook();
Sheet sheet = wb1.createSheet();
assertEquals(sheet.isDisplayGridlines(), true);
assertEquals(sheet.isDisplayRowColHeadings(), true);
assertEquals(sheet.isDisplayFormulas(), false);
assertEquals(sheet.isDisplayZeros(), true);
assertTrue(sheet.isDisplayGridlines());
assertTrue(sheet.isDisplayRowColHeadings());
assertFalse(sheet.isDisplayFormulas());
assertTrue(sheet.isDisplayZeros());
sheet.setDisplayGridlines(false);
sheet.setDisplayRowColHeadings(false);
@ -548,10 +548,10 @@ public abstract class BaseTestSheet {
wb1.close();
sheet = wb2.getSheetAt(0);
assertEquals(sheet.isDisplayGridlines(), false);
assertEquals(sheet.isDisplayRowColHeadings(), false);
assertEquals(sheet.isDisplayFormulas(), true);
assertEquals(sheet.isDisplayZeros(), false);
assertFalse(sheet.isDisplayGridlines());
assertFalse(sheet.isDisplayRowColHeadings());
assertTrue(sheet.isDisplayFormulas());
assertFalse(sheet.isDisplayZeros());
wb2.close();
}
@ -1152,14 +1152,13 @@ public abstract class BaseTestSheet {
workbook.close();
}
@Test
public void getCellComments() throws IOException {
Workbook workbook = _testDataProvider.createWorkbook();
Sheet sheet = workbook.createSheet("TEST");
// a sheet with no cell comments should return an empty map (not null or raise NPE).
assertEquals(Collections.emptyMap(), sheet.getCellComments());
assertTrue(sheet.getCellComments().isEmpty());
Drawing<?> dg = sheet.createDrawingPatriarch();
ClientAnchor anchor = workbook.getCreationHelper().createClientAnchor();
@ -1223,13 +1222,13 @@ public abstract class BaseTestSheet {
CellAddress B6 = new CellAddress(5, 1);
assertEquals("row, col", hyperlink, sheet.getHyperlink(5, 1));
assertEquals("addr", hyperlink, sheet.getHyperlink(B6));
assertEquals("no hyperlink at A1", null, sheet.getHyperlink(CellAddress.A1));
assertNull("no hyperlink at A1", sheet.getHyperlink(CellAddress.A1));
workbook.close();
}
@Test
public void removeAllHyperlinks() throws IOException {
public void removeAllHyperlinks() {
Workbook workbook = _testDataProvider.createWorkbook();
Hyperlink hyperlink = workbook.getCreationHelper().createHyperlink(HyperlinkType.URL);
hyperlink.setAddress("https://poi.apache.org/");
@ -1257,7 +1256,7 @@ public abstract class BaseTestSheet {
Workbook workbook = _testDataProvider.createWorkbook();
Sheet sheet = workbook.createSheet();
CellRangeAddress region = CellRangeAddress.valueOf("B2:D4");
sheet.addMergedRegion(region);
assertEquals(0, sheet.addMergedRegion(region));
assertEquals("B2:D4", sheet.getMergedRegion(0).formatAsString());
assertEquals(1, sheet.getNumMergedRegions());

View File

@ -212,7 +212,7 @@ public abstract class BaseTestSheetAutosizeColumn {
trackColumnsForAutoSizingIfSXSSF(sheet);
Row row = sheet.createRow(0);
Font defaultFont = workbook.getFontAt((short)0);
Font defaultFont = workbook.getFontAt(0);
CellStyle style1 = workbook.createCellStyle();
Font font1 = workbook.createFont();
@ -276,7 +276,7 @@ public abstract class BaseTestSheetAutosizeColumn {
trackColumnsForAutoSizingIfSXSSF(sheet);
Row row = sheet.createRow(0);
sheet.addMergedRegion(CellRangeAddress.valueOf("A1:B1"));
assertEquals(0, sheet.addMergedRegion(CellRangeAddress.valueOf("A1:B1")));
Cell cell0 = row.createCell(0);
cell0.setCellValue("Apache Software Foundation");
@ -292,7 +292,6 @@ public abstract class BaseTestSheetAutosizeColumn {
workbook.close();
}
/**
* Auto-Sizing a column needs to work when we have rows
* passed the 32767 boundary. See bug #48079
@ -354,8 +353,8 @@ public abstract class BaseTestSheetAutosizeColumn {
protected static void fixFonts(Workbook workbook) {
if (!JvmBugs.hasLineBreakMeasurerBug()) return;
for (int i=workbook.getNumberOfFonts()-1; i>=0; i--) {
Font f = workbook.getFontAt((short)0);
for (int i=workbook.getNumberOfFontsAsInt()-1; i>=0; i--) {
Font f = workbook.getFontAt(0);
if ("Calibri".equals(f.getFontName())) {
f.setFontName("Lucida Sans");
} else if ("Cambria".equals(f.getFontName())) {

View File

@ -19,6 +19,7 @@
package org.apache.poi.ss.usermodel;
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;
@ -109,9 +110,9 @@ public abstract class BaseTestSheetShiftColumns {
assertEquals("$D1+D$2", formulaD5);
Cell newb5Null = sheet1.getRow(4).getCell(1);
assertEquals(newb5Null, null);
assertNull(newb5Null);
boolean logicalValue = sheet1.getRow(6).getCell(2).getBooleanCellValue();
assertEquals(logicalValue, false);
assertFalse(logicalValue);
Cell textCell = sheet1.getRow(6).getCell(3);
assertEquals(textCell.getStringCellValue(), "TEXT");
assertEquals(textCell.getCellStyle().getAlignment(), HorizontalAlignment.CENTER);
@ -134,11 +135,11 @@ public abstract class BaseTestSheetShiftColumns {
assertEquals("SUM(A3:E3)", formulaD5);
Cell b5Null = sheet1.getRow(4).getCell(1);
assertEquals(b5Null, null);
assertNull(b5Null);
Object c6Null = sheet1.getRow(5).getCell(2); // null cell A5 is shifted
// for 2 columns, so now
// c5 should be null
assertEquals(c6Null, null);
assertNull(c6Null);
}
@Test
@ -152,7 +153,7 @@ public abstract class BaseTestSheetShiftColumns {
String formulaB5 = sheet1.getRow(4).getCell(1).getCellFormula();
assertEquals("$B1+B$2", formulaB5);
Cell newb6Null = sheet1.getRow(5).getCell(1);
assertEquals(newb6Null, null);
assertNull(newb6Null);
}
@Test(expected = IllegalStateException.class)
@ -264,8 +265,8 @@ public abstract class BaseTestSheetShiftColumns {
CellRangeAddress A1_A5 = new CellRangeAddress(0, 4, 0, 0); // NOSONAR, it's more readable this way
CellRangeAddress B1_B3 = new CellRangeAddress(0, 2, 1, 1); // NOSONAR, it's more readable this way
sheet.addMergedRegion(B1_B3);
sheet.addMergedRegion(A1_A5);
assertEquals(0, sheet.addMergedRegion(B1_B3));
assertEquals(1, sheet.addMergedRegion(A1_A5));
// A1:A5 should be moved to B1:B5
// B1:B3 will be removed
@ -285,8 +286,8 @@ public abstract class BaseTestSheetShiftColumns {
CellRangeAddress A1_A5 = new CellRangeAddress(0, 4, 0, 0); // NOSONAR, it's more readable this way
CellRangeAddress B1_B3 = new CellRangeAddress(0, 2, 1, 1); // NOSONAR, it's more readable this way
sheet.addMergedRegion(A1_A5);
sheet.addMergedRegion(B1_B3);
assertEquals(0, sheet.addMergedRegion(A1_A5));
assertEquals(1, sheet.addMergedRegion(B1_B3));
// A1:E1 should be removed
// B1:B3 will be A1:A3
@ -320,7 +321,7 @@ public abstract class BaseTestSheetShiftColumns {
CellRangeAddress region = new CellRangeAddress(0, 2, 0, 0);
assertEquals("A1:A3", region.formatAsString());
sheet.addMergedRegion(region);
assertEquals(0, sheet.addMergedRegion(region));
sheet.shiftColumns(0, 1, 2);
region = sheet.getMergedRegion(0);

View File

@ -288,7 +288,7 @@ public abstract class BaseTestSheetShiftRows {
CellRangeAddress region = new CellRangeAddress(0, 0, 0, 2);
assertEquals("A1:C1", region.formatAsString());
sheet.addMergedRegion(region);
assertEquals(0, sheet.addMergedRegion(region));
sheet.shiftRows(0, 1, 2);
region = sheet.getMergedRegion(0);
@ -314,8 +314,8 @@ public abstract class BaseTestSheetShiftRows {
CellRangeAddress A4_B7 = CellRangeAddress.valueOf("A4:B7");
CellRangeAddress C4_D7 = CellRangeAddress.valueOf("C4:D7");
sheet.addMergedRegion(A4_B7);
sheet.addMergedRegion(C4_D7);
assertEquals(0, sheet.addMergedRegion(A4_B7));
assertEquals(1, sheet.addMergedRegion(C4_D7));
assumeTrue(sheet.getLastRowNum() > 8);
@ -480,8 +480,9 @@ public abstract class BaseTestSheetShiftRows {
public void testBug55280() throws IOException {
Workbook w = _testDataProvider.createWorkbook();
Sheet s = w.createSheet();
for (int row = 0; row < 5000; ++row)
s.addMergedRegion(new CellRangeAddress(row, row, 0, 3));
for (int row = 0; row < 5000; ++row) {
assertEquals(row, s.addMergedRegion(new CellRangeAddress(row, row, 0, 3)));
}
s.shiftRows(0, 4999, 1); // takes a long time...
w.close();
@ -614,8 +615,8 @@ public abstract class BaseTestSheetShiftRows {
CellRangeAddress A4_B7 = new CellRangeAddress(3, 6, 0, 1);
CellRangeAddress C5_D7 = new CellRangeAddress(4, 6, 2, 3);
sheet.addMergedRegion(A4_B7);
sheet.addMergedRegion(C5_D7);
assertEquals(0, sheet.addMergedRegion(A4_B7));
assertEquals(1, sheet.addMergedRegion(C5_D7));
// A4:B7 will elongate vertically
// C5:D7 will be shifted down with same size
@ -646,8 +647,8 @@ public abstract class BaseTestSheetShiftRows {
CellRangeAddress A1_E1 = new CellRangeAddress(0, 0, 0, 4);
CellRangeAddress A2_C2 = new CellRangeAddress(1, 1, 0, 2);
sheet.addMergedRegion(A1_E1);
sheet.addMergedRegion(A2_C2);
assertEquals(0, sheet.addMergedRegion(A1_E1));
assertEquals(1, sheet.addMergedRegion(A2_C2));
// A1:E1 should be removed
// A2:C2 will be A1:C1
@ -668,8 +669,8 @@ public abstract class BaseTestSheetShiftRows {
CellRangeAddress A1_E1 = new CellRangeAddress(0, 0, 0, 4);
CellRangeAddress A2_C2 = new CellRangeAddress(1, 7, 0, 2);
sheet.addMergedRegion(A1_E1);
sheet.addMergedRegion(A2_C2);
assertEquals(0, sheet.addMergedRegion(A1_E1));
assertEquals(1, sheet.addMergedRegion(A2_C2));
// A1:E1 should move to A5:E5
// A2:C2 should be removed
@ -691,8 +692,8 @@ public abstract class BaseTestSheetShiftRows {
CellRangeAddress A8_E8 = new CellRangeAddress(7, 7, 0, 4);
CellRangeAddress A9_C9 = new CellRangeAddress(8, 8, 0, 2);
sheet.addMergedRegion(A8_E8);
sheet.addMergedRegion(A9_C9);
assertEquals(0, sheet.addMergedRegion(A8_E8));
assertEquals(1, sheet.addMergedRegion(A9_C9));
// A1:E1 should be removed
// A2:C2 will be A1:C1
@ -727,8 +728,8 @@ public abstract class BaseTestSheetShiftRows {
CellRangeAddress A1_E1 = new CellRangeAddress(0, 0, 0, 4);
CellRangeAddress A2_C2 = new CellRangeAddress(1, 1, 0, 2);
sheet.addMergedRegion(A1_E1);
sheet.addMergedRegion(A2_C2);
assertEquals(0, sheet.addMergedRegion(A1_E1));
assertEquals(1, sheet.addMergedRegion(A2_C2));
// A1:E1 should be moved to A2:E2
// A2:C2 will be removed

View File

@ -480,7 +480,7 @@ public abstract class BaseTestSheetUpdateArrayFormulas {
CellRange<? extends Cell> srange =
sheet.setArrayFormula("SUM(A4:A6,B4:B6)", CellRangeAddress.valueOf("B5"));
Cell scell = srange.getTopLeftCell();
sheet.addMergedRegion(CellRangeAddress.valueOf("B5:C6"));
assertEquals(0, sheet.addMergedRegion(CellRangeAddress.valueOf("B5:C6")));
//we are still an array formula
assertEquals(CellType.FORMULA, scell.getCellType());
assertTrue(scell.isPartOfArrayFormulaGroup());
@ -595,7 +595,7 @@ public abstract class BaseTestSheetUpdateArrayFormulas {
Sheet sheet = workbook.createSheet();
CellRangeAddress mergedRegion = CellRangeAddress.valueOf("B2:C2");
sheet.addMergedRegion(mergedRegion);
assertEquals(0, sheet.addMergedRegion(mergedRegion));
CellRangeAddress arrayFormula = CellRangeAddress.valueOf("C1:C3");
assumeTrue(mergedRegion.intersects(arrayFormula));
assumeTrue(arrayFormula.intersects(mergedRegion));

View File

@ -482,8 +482,8 @@ public abstract class BaseTestWorkbook {
Sheet sheet = book.createSheet("TEST");
sheet.createRow(0).createCell(0).setCellValue("Test");
sheet.createRow(1).createCell(0).setCellValue(36.6);
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 2));
sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 2));
assertEquals(0, sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 2)));
assertEquals(1, sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 2)));
assertTrue(sheet.isSelected());
Sheet clonedSheet = book.cloneSheet(0);
@ -494,12 +494,12 @@ public abstract class BaseTestWorkbook {
//cloned sheet is a deep copy, adding rows or merged regions in the original does not affect the clone
sheet.createRow(2).createCell(0).setCellValue(1);
sheet.addMergedRegion(new CellRangeAddress(4, 5, 0, 2));
assertEquals(2, sheet.addMergedRegion(new CellRangeAddress(4, 5, 0, 2)));
assertEquals(2, clonedSheet.getPhysicalNumberOfRows());
assertEquals(2, clonedSheet.getNumMergedRegions());
clonedSheet.createRow(2).createCell(0).setCellValue(1);
clonedSheet.addMergedRegion(new CellRangeAddress(6, 7, 0, 2));
assertEquals(2, clonedSheet.addMergedRegion(new CellRangeAddress(6, 7, 0, 2)));
assertEquals(3, clonedSheet.getPhysicalNumberOfRows());
assertEquals(3, clonedSheet.getNumMergedRegions());
book.close();

View File

@ -17,22 +17,26 @@
package org.apache.poi.ss.util;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;
import junit.framework.TestCase;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* Tests SheetUtil.
*
* @see org.apache.poi.ss.util.SheetUtil
*/
public final class TestSheetUtil extends TestCase {
public final class TestSheetUtil {
@Test
public void testCellWithMerges() throws Exception {
Workbook wb = new HSSFWorkbook();
Sheet s = wb.createSheet();
@ -45,38 +49,40 @@ public final class TestSheetUtil extends TestCase {
r3.createCell(0).setCellValue(20);
r3.createCell(1).setCellValue(21);
s.addMergedRegion(new CellRangeAddress(2, 3, 0, 0));
s.addMergedRegion(new CellRangeAddress(2, 2, 1, 4));
assertEquals(0, s.addMergedRegion(new CellRangeAddress(2, 3, 0, 0)));
assertEquals(1, s.addMergedRegion(new CellRangeAddress(2, 2, 1, 4)));
// With a cell that isn't defined, we'll get null
assertEquals(null, SheetUtil.getCellWithMerges(s, 0, 0));
assertNull(SheetUtil.getCellWithMerges(s, 0, 0));
// With a cell that's not in a merged region, we'll get that
assertEquals(10.0, SheetUtil.getCellWithMerges(s, 1, 0).getNumericCellValue());
assertEquals(11.0, SheetUtil.getCellWithMerges(s, 1, 1).getNumericCellValue());
assertEquals(10.0, SheetUtil.getCellWithMerges(s, 1, 0).getNumericCellValue(), 0.01);
assertEquals(11.0, SheetUtil.getCellWithMerges(s, 1, 1).getNumericCellValue(), 0.01);
// With a cell that's the primary one of a merged region, we get that cell
assertEquals(20.0, SheetUtil.getCellWithMerges(s, 2, 0).getNumericCellValue());
assertEquals(21., SheetUtil.getCellWithMerges(s, 2, 1).getNumericCellValue());
assertEquals(20.0, SheetUtil.getCellWithMerges(s, 2, 0).getNumericCellValue(), 0.01);
assertEquals(21., SheetUtil.getCellWithMerges(s, 2, 1).getNumericCellValue(), 0.01);
// With a cell elsewhere in the merged region, get top-left
assertEquals(20.0, SheetUtil.getCellWithMerges(s, 3, 0).getNumericCellValue());
assertEquals(21.0, SheetUtil.getCellWithMerges(s, 2, 2).getNumericCellValue());
assertEquals(21.0, SheetUtil.getCellWithMerges(s, 2, 3).getNumericCellValue());
assertEquals(21.0, SheetUtil.getCellWithMerges(s, 2, 4).getNumericCellValue());
assertEquals(20.0, SheetUtil.getCellWithMerges(s, 3, 0).getNumericCellValue(), 0.01);
assertEquals(21.0, SheetUtil.getCellWithMerges(s, 2, 2).getNumericCellValue(), 0.01);
assertEquals(21.0, SheetUtil.getCellWithMerges(s, 2, 3).getNumericCellValue(), 0.01);
assertEquals(21.0, SheetUtil.getCellWithMerges(s, 2, 4).getNumericCellValue(), 0.01);
wb.close();
}
@Test
public void testCanComputeWidthHSSF() throws IOException {
Workbook wb = new HSSFWorkbook();
// cannot check on result because on some machines we get back false here!
SheetUtil.canComputeColumnWidth(wb.getFontAt((short)0));
SheetUtil.canComputeColumnWidth(wb.getFontAt(0));
wb.close();
}
@Test
public void testGetCellWidthEmpty() throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("sheet");
@ -85,11 +91,12 @@ public final class TestSheetUtil extends TestCase {
// no contents: cell.setCellValue("sometext");
assertEquals(-1.0, SheetUtil.getCellWidth(cell, 1, null, true));
assertEquals(-1.0, SheetUtil.getCellWidth(cell, 1, null, true), 0.01);
wb.close();
}
@Test
public void testGetCellWidthString() throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("sheet");
@ -103,6 +110,7 @@ public final class TestSheetUtil extends TestCase {
wb.close();
}
@Test
public void testGetCellWidthNumber() throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("sheet");
@ -116,6 +124,7 @@ public final class TestSheetUtil extends TestCase {
wb.close();
}
@Test
public void testGetCellWidthBoolean() throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("sheet");
@ -129,6 +138,7 @@ public final class TestSheetUtil extends TestCase {
wb.close();
}
@Test
public void testGetColumnWidthString() throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("sheet");
@ -142,7 +152,7 @@ public final class TestSheetUtil extends TestCase {
assertTrue("Having some width for rows with actual cells",
SheetUtil.getColumnWidth(sheet, 0, true) > 0);
assertEquals("Not having any widht for rows with all empty cells",
-1.0, SheetUtil.getColumnWidth(sheet, 0, true, 1, 2));
-1.0, SheetUtil.getColumnWidth(sheet, 0, true, 1, 2), 0.01);
wb.close();
}