From 8f8f41a7c24b53667e71b20a131864958df1c664 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 19 Aug 2017 16:31:45 +0000 Subject: [PATCH] Fix 60384 and 60709: When shifting with merged regions we should correctly check if the region is moved along or needs to be removed because it is not fully kept via the shifting. This was broken by the fix for bug 59740, now additional unit tests ensure that it works better. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1805518 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/usermodel/helpers/RowShifter.java | 25 +++++- .../usermodel/TestXSSFSheetShiftRows.java | 82 ++++++++++++++---- .../ss/usermodel/BaseTestSheetShiftRows.java | 56 ++++++++++-- test-data/spreadsheet/60384.xlsx | Bin 0 -> 6611 bytes test-data/spreadsheet/60709.xlsx | Bin 0 -> 28096 bytes 5 files changed, 136 insertions(+), 27 deletions(-) create mode 100644 test-data/spreadsheet/60384.xlsx create mode 100644 test-data/spreadsheet/60709.xlsx diff --git a/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java b/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java index 680abff626..13777dc909 100644 --- a/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java +++ b/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java @@ -27,8 +27,6 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.util.Internal; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; /** * Helper for shifting rows up or down @@ -59,8 +57,9 @@ public abstract class RowShifter { for (int i = 0; i < size; i++) { CellRangeAddress merged = sheet.getMergedRegion(i); - // remove merged region that overlaps shifting - if (startRow + n <= merged.getFirstRow() && endRow + n >= merged.getLastRow()) { + // remove merged region that are replaced by the shifting, + // i.e. where the area includes something in the overwritten area + if(removalNeeded(merged, startRow, endRow, n)) { removedIndices.add(i); continue; } @@ -94,6 +93,24 @@ public abstract class RowShifter { return shiftedRegions; } + private boolean removalNeeded(CellRangeAddress merged, int startRow, int endRow, int n) { + final int movedRows = endRow - startRow + 1; + + // build a range of the rows that are overwritten, i.e. the target-area, but without + // rows that are moved along + final CellRangeAddress overwrite; + if(n > 0) { + // area is moved down => overwritten area is [endRow + n - movedRows, endRow + n] + overwrite = new CellRangeAddress(Math.max(endRow + 1, endRow + n - movedRows), endRow + n, 0, 0); + } else { + // area is moved up => overwritten area is [startRow + n, startRow + n + movedRows] + overwrite = new CellRangeAddress(startRow + n, Math.min(startRow - 1, startRow + n + movedRows), 0, 0); + } + + // if the merged-region and the overwritten area intersect, we need to remove it + return merged.intersects(overwrite); + } + /** * Updated named ranges */ diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java index 78e9d1bb25..07ba9f901a 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java @@ -17,22 +17,7 @@ package org.apache.poi.xssf.usermodel; -import static org.apache.poi.POITestCase.skipTest; -import static org.apache.poi.POITestCase.testPassesNow; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.fail; - -import java.io.IOException; - -import org.apache.poi.ss.usermodel.BaseTestSheetShiftRows; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.Comment; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellUtil; import org.apache.poi.util.IOUtils; @@ -41,6 +26,12 @@ import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.xmlbeans.impl.values.XmlValueDisconnectedException; import org.junit.Test; +import java.io.IOException; + +import static org.apache.poi.POITestCase.skipTest; +import static org.apache.poi.POITestCase.testPassesNow; +import static org.junit.Assert.*; + public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows { public TestXSSFSheetShiftRows(){ @@ -413,7 +404,6 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows { skipTest(e); } - workbook.close(); } @@ -486,4 +476,62 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows { sheet.shiftRows(1, 2, 3); IOUtils.closeQuietly(wb); } + + @Test + public void test60384() throws IOException { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("60384.xlsx"); + XSSFSheet sheet = wb.getSheetAt(0); + + assertEquals(2, sheet.getMergedRegions().size()); + assertEquals(7, sheet.getMergedRegion(0).getFirstRow()); + assertEquals(7, sheet.getMergedRegion(0).getLastRow()); + assertEquals(8, sheet.getMergedRegion(1).getFirstRow()); + assertEquals(8, sheet.getMergedRegion(1).getLastRow()); + + sheet.shiftRows(3, 8, 1); + + // after shifting, the two named regions should still be there as they + // are fully inside the shifted area + assertEquals(2, sheet.getMergedRegions().size()); + assertEquals(8, sheet.getMergedRegion(0).getFirstRow()); + assertEquals(8, sheet.getMergedRegion(0).getLastRow()); + assertEquals(9, sheet.getMergedRegion(1).getFirstRow()); + assertEquals(9, sheet.getMergedRegion(1).getLastRow()); + + /*OutputStream out = new FileOutputStream("/tmp/60384.xlsx"); + try { + wb.write(out); + } finally { + out.close(); + }*/ + + wb.close(); + } + + @Test + public void test60709() throws IOException { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("60709.xlsx"); + XSSFSheet sheet = wb.getSheetAt(0); + + assertEquals(1, sheet.getMergedRegions().size()); + assertEquals(2, sheet.getMergedRegion(0).getFirstRow()); + assertEquals(2, sheet.getMergedRegion(0).getLastRow()); + + sheet.shiftRows(1, sheet.getLastRowNum()+1, -1, true, false); + + // after shifting, the two named regions should still be there as they + // are fully inside the shifted area + assertEquals(1, sheet.getMergedRegions().size()); + assertEquals(1, sheet.getMergedRegion(0).getFirstRow()); + assertEquals(1, sheet.getMergedRegion(0).getLastRow()); + + /*OutputStream out = new FileOutputStream("/tmp/60709.xlsx"); + try { + wb.write(out); + } finally { + out.close(); + }*/ + + wb.close(); + } } diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftRows.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftRows.java index cf910d4620..30764c4cb9 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftRows.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftRows.java @@ -502,8 +502,6 @@ public abstract class BaseTestSheetShiftRows { * Unified test for: * bug 46742: XSSFSheet.shiftRows should shift hyperlinks * bug 52903: HSSFSheet.shiftRows should shift hyperlinks - * - * @throws IOException */ @Test public void testBug46742_52903_shiftHyperlinks() throws IOException { @@ -642,7 +640,7 @@ public abstract class BaseTestSheetShiftRows { public void shiftMergedRowsToMergedRowsUp() throws IOException { Workbook wb = _testDataProvider.createWorkbook(); Sheet sheet = wb.createSheet("test"); - populateSheetCells(sheet); + populateSheetCells(sheet, 2); CellRangeAddress A1_E1 = new CellRangeAddress(0, 0, 0, 4); @@ -661,9 +659,55 @@ public abstract class BaseTestSheetShiftRows { wb.close(); } - private void populateSheetCells(Sheet sheet) { + @Test + public void shiftMergedRowsToMergedRowsOverlappingMergedRegion() throws IOException { + Workbook wb = _testDataProvider.createWorkbook(); + Sheet sheet = wb.createSheet("test"); + populateSheetCells(sheet, 10); + + 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); + + // A1:E1 should move to A5:E5 + // A2:C2 should be removed + sheet.shiftRows(0, 0, 4); + + assertEquals(1, sheet.getNumMergedRegions()); + assertEquals(CellRangeAddress.valueOf("A5:E5"), sheet.getMergedRegion(0)); + + wb.close(); + } + + @Test + public void bug60384ShiftMergedRegion() throws IOException { + Workbook wb = _testDataProvider.createWorkbook(); + Sheet sheet = wb.createSheet("test"); + populateSheetCells(sheet, 9); + + + 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); + + // A1:E1 should be removed + // A2:C2 will be A1:C1 + sheet.shiftRows(3, sheet.getLastRowNum(), 1); + + assertEquals(2, sheet.getNumMergedRegions()); + assertEquals(CellRangeAddress.valueOf("A9:E9"), sheet.getMergedRegion(0)); + assertEquals(CellRangeAddress.valueOf("A10:C10"), sheet.getMergedRegion(1)); + + wb.close(); + } + + private void populateSheetCells(Sheet sheet, int rowCount) { // populate sheet cells - for (int i = 0; i < 2; i++) { + for (int i = 0; i < rowCount; i++) { Row row = sheet.createRow(i); for (int j = 0; j < 5; j++) { Cell cell = row.createCell(j); @@ -678,7 +722,7 @@ public abstract class BaseTestSheetShiftRows { Sheet sheet = wb.createSheet("test"); // populate sheet cells - populateSheetCells(sheet); + populateSheetCells(sheet, 2); CellRangeAddress A1_E1 = new CellRangeAddress(0, 0, 0, 4); CellRangeAddress A2_C2 = new CellRangeAddress(1, 1, 0, 2); diff --git a/test-data/spreadsheet/60384.xlsx b/test-data/spreadsheet/60384.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3695a439ba3d36eb5509a007cf08326e2f05b03c GIT binary patch literal 6611 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