From 0fdfac62c9f0ecb75e606053d93041019ddb0392 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 22 Dec 2014 09:00:18 +0000 Subject: [PATCH] Bug 57171 and 57163: Adjust the active sheet in setSheetOrder() and removeSheet() for both HSSF and XSSF git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1647264 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hssf/usermodel/HSSFWorkbook.java | 29 ++- .../poi/xssf/usermodel/XSSFWorkbook.java | 42 ++++- .../usermodel/TestXSSFSheetShiftRows.java | 167 +++++++++++++++++- .../poi/ss/usermodel/BaseTestWorkbook.java | 36 +++- test-data/spreadsheet/57171_57163_57165.xlsx | Bin 0 -> 32353 bytes 5 files changed, 261 insertions(+), 13 deletions(-) create mode 100644 test-data/spreadsheet/57171_57163_57165.xlsx diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index da741d4944..4b37d9e299 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -480,6 +480,21 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss workbook.updateNamesAfterCellShift(shifter); + // adjust active sheet if necessary + int active = getActiveSheetIndex(); + if(active == oldSheetIndex) { + // moved sheet was the active one + setActiveSheet(pos); + } else if ((active < oldSheetIndex && active < pos) || + (active > oldSheetIndex && active > pos)) { + // not affected + } else if (pos > oldSheetIndex) { + // moved sheet was below before and is above now => active is one less + setActiveSheet(active-1); + } else { + // remaining case: moved sheet was higher than active before and is lower now => active is one more + setActiveSheet(active+1); + } } private void validateSheetIndex(int index) { @@ -937,7 +952,6 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss */ public void removeSheetAt(int index) { validateSheetIndex(index); - boolean wasActive = getSheetAt(index).isActive(); boolean wasSelected = getSheetAt(index).isSelected(); _sheets.remove(index); @@ -954,9 +968,6 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss if (newSheetIndex >= nSheets) { newSheetIndex = nSheets-1; } - if (wasActive) { - setActiveSheet(newSheetIndex); - } if (wasSelected) { boolean someOtherSheetIsStillSelected = false; @@ -970,6 +981,16 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss setSelectedTab(newSheetIndex); } } + + // adjust active sheet + int active = getActiveSheetIndex(); + if(active == index) { + // removed sheet was the active one, reset active sheet if there is still one left now + setActiveSheet(newSheetIndex); + } else if (active > index) { + // removed sheet was below the active one => active is one less now + setActiveSheet(active-1); + } } /** diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index 119f77507e..88581d9ddb 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -727,7 +727,9 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable= sheets.size()) { + newSheetIndex = sheets.size()-1; + } + + // adjust active sheet + int active = getActiveSheetIndex(); + if(active == index) { + // removed sheet was the active one, reset active sheet if there is still one left now + setActiveSheet(newSheetIndex); + } else if (active > index) { + // removed sheet was below the active one => active is one less now + setActiveSheet(active-1); + } } /** @@ -1374,6 +1397,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable idx && active > pos)) { + // not affected + } else if (pos > idx) { + // moved sheet was below before and is above now => active is one less + setActiveSheet(active-1); + } else { + // remaining case: moved sheet was higher than active before and is lower now => active is one more + setActiveSheet(active+1); + } } /** 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 d3729e0c92..e949dd13dd 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java @@ -29,7 +29,6 @@ import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellUtil; import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFTestDataSamples; -import org.junit.Test; /** * @author Yegor Kozlov @@ -190,13 +189,167 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows { assertEquals("Amdocs:\ntest\n", comment.getString().getString()); } - @Test - public void testBug55280() { + public void testBug55280() throws IOException { Workbook w = new XSSFWorkbook(); - Sheet s = w.createSheet(); - for (int row = 0; row < 5000; ++row) - s.addMergedRegion(new CellRangeAddress(row, row, 0, 3)); + try { + Sheet s = w.createSheet(); + for (int row = 0; row < 5000; ++row) + s.addMergedRegion(new CellRangeAddress(row, row, 0, 3)); - s.shiftRows(0, 4999, 1); // takes a long time... + s.shiftRows(0, 4999, 1); // takes a long time... + } finally { + w.close(); + } } + + public void test57171() throws Exception { + Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx"); + assertEquals(5, wb.getActiveSheetIndex()); + removeAllSheetsBut(5, wb); // 5 is the active / selected sheet + assertEquals(0, wb.getActiveSheetIndex()); + + Workbook wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb); + assertEquals(0, wbRead.getActiveSheetIndex()); + + wbRead.removeSheetAt(0); + assertEquals(0, wbRead.getActiveSheetIndex()); + + //wb.write(new FileOutputStream("/tmp/57171.xls")); + } + + public void test57163() throws IOException { + Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx"); + assertEquals(5, wb.getActiveSheetIndex()); + wb.removeSheetAt(0); + assertEquals(4, wb.getActiveSheetIndex()); + + //wb.write(new FileOutputStream("/tmp/57163.xls")); + } + + public void testSetSheetOrderAndAdjustActiveSheet() throws Exception { + Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx"); + + assertEquals(5, wb.getActiveSheetIndex()); + + // move the sheets around in all possible combinations to check that the active sheet + // is set correctly in all cases + wb.setSheetOrder(wb.getSheetName(5), 4); + assertEquals(4, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(5), 5); + assertEquals(4, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(3), 5); + assertEquals(3, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(4), 5); + assertEquals(3, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(2), 2); + assertEquals(3, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(2), 1); + assertEquals(3, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(3), 5); + assertEquals(5, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(0), 5); + assertEquals(4, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(0), 5); + assertEquals(3, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(0), 5); + assertEquals(2, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(0), 5); + assertEquals(1, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(0), 5); + assertEquals(0, wb.getActiveSheetIndex()); + + wb.setSheetOrder(wb.getSheetName(0), 5); + assertEquals(5, wb.getActiveSheetIndex()); + } + + public void testRemoveSheetAndAdjustActiveSheet() throws Exception { + Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx"); + + assertEquals(5, wb.getActiveSheetIndex()); + + wb.removeSheetAt(0); + assertEquals(4, wb.getActiveSheetIndex()); + + wb.setActiveSheet(3); + assertEquals(3, wb.getActiveSheetIndex()); + + wb.removeSheetAt(4); + assertEquals(3, wb.getActiveSheetIndex()); + + wb.removeSheetAt(3); + assertEquals(2, wb.getActiveSheetIndex()); + + wb.removeSheetAt(0); + assertEquals(1, wb.getActiveSheetIndex()); + + wb.removeSheetAt(1); + assertEquals(0, wb.getActiveSheetIndex()); + + wb.removeSheetAt(0); + assertEquals(0, wb.getActiveSheetIndex()); + + try { + wb.removeSheetAt(0); + fail("Should catch exception as no more sheets are there"); + } catch (IllegalArgumentException e) { + // expected + } + assertEquals(0, wb.getActiveSheetIndex()); + + wb.createSheet(); + assertEquals(0, wb.getActiveSheetIndex()); + + wb.removeSheetAt(0); + assertEquals(0, wb.getActiveSheetIndex()); + } + + // TODO: enable when bug 57165 is fixed + public void disabled_test57165() throws IOException { + Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx"); + assertEquals(5, wb.getActiveSheetIndex()); + removeAllSheetsBut(3, wb); + assertEquals(0, wb.getActiveSheetIndex()); + wb.createSheet("New Sheet1"); + assertEquals(0, wb.getActiveSheetIndex()); + wb.cloneSheet(0); // Throws exception here + wb.setSheetName(1, "New Sheet"); + assertEquals(0, wb.getActiveSheetIndex()); + + //wb.write(new FileOutputStream("/tmp/57165.xls")); + } + +// public void test57165b() throws IOException { +// Workbook wb = new XSSFWorkbook(); +// try { +// wb.createSheet("New Sheet 1"); +// wb.createSheet("New Sheet 2"); +// } finally { +// wb.close(); +// } +// } + + private static void removeAllSheetsBut(int sheetIndex, Workbook wb) + { + int sheetNb = wb.getNumberOfSheets(); + // Move this sheet at the first position + wb.setSheetOrder(wb.getSheetName(sheetIndex), 0); + // Must make this sheet active (otherwise, for XLSX, Excel might protest that active sheet no longer exists) + // I think POI should automatically handle this case when deleting sheets... +// wb.setActiveSheet(0); + for (int sn = sheetNb - 1; sn > 0; sn--) + { + wb.removeSheetAt(sn); + } + } } diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestWorkbook.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestWorkbook.java index ce3b78712a..1d1184a88f 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestWorkbook.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestWorkbook.java @@ -192,20 +192,45 @@ public abstract class BaseTestWorkbook { workbook.createSheet("sheet2"); workbook.createSheet("sheet3"); assertEquals(3, workbook.getNumberOfSheets()); + + assertEquals(0, workbook.getActiveSheetIndex()); + workbook.removeSheetAt(1); assertEquals(2, workbook.getNumberOfSheets()); assertEquals("sheet3", workbook.getSheetName(1)); + assertEquals(0, workbook.getActiveSheetIndex()); + workbook.removeSheetAt(0); assertEquals(1, workbook.getNumberOfSheets()); assertEquals("sheet3", workbook.getSheetName(0)); + assertEquals(0, workbook.getActiveSheetIndex()); + workbook.removeSheetAt(0); assertEquals(0, workbook.getNumberOfSheets()); + assertEquals(0, workbook.getActiveSheetIndex()); //re-create the sheets workbook.createSheet("sheet1"); workbook.createSheet("sheet2"); workbook.createSheet("sheet3"); - assertEquals(3, workbook.getNumberOfSheets()); + workbook.createSheet("sheet4"); + assertEquals(4, workbook.getNumberOfSheets()); + + assertEquals(0, workbook.getActiveSheetIndex()); + workbook.setActiveSheet(2); + assertEquals(2, workbook.getActiveSheetIndex()); + + workbook.removeSheetAt(2); + assertEquals(2, workbook.getActiveSheetIndex()); + + workbook.removeSheetAt(1); + assertEquals(1, workbook.getActiveSheetIndex()); + + workbook.removeSheetAt(0); + assertEquals(0, workbook.getActiveSheetIndex()); + + workbook.removeSheetAt(0); + assertEquals(0, workbook.getActiveSheetIndex()); } @Test @@ -287,10 +312,17 @@ public abstract class BaseTestWorkbook { assertEquals(8, wb.getSheetIndex("Sheet 8")); assertEquals(9, wb.getSheetIndex("Sheet 9")); + // check active sheet + assertEquals(0, wb.getActiveSheetIndex()); + // Change wb.setSheetOrder("Sheet 6", 0); + assertEquals(1, wb.getActiveSheetIndex()); wb.setSheetOrder("Sheet 3", 7); wb.setSheetOrder("Sheet 1", 9); + + // now the first sheet is at index 1 + assertEquals(1, wb.getActiveSheetIndex()); // Check they're currently right assertEquals(0, wb.getSheetIndex("Sheet 6")); @@ -317,6 +349,8 @@ public abstract class BaseTestWorkbook { assertEquals(8, wbr.getSheetIndex("Sheet 9")); assertEquals(9, wbr.getSheetIndex("Sheet 1")); + assertEquals(1, wb.getActiveSheetIndex()); + // Now get the index by the sheet, not the name for(int i=0; i<10; i++) { Sheet s = wbr.getSheetAt(i); diff --git a/test-data/spreadsheet/57171_57163_57165.xlsx b/test-data/spreadsheet/57171_57163_57165.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5d94a476c61bb4885cc02c9513c98542be3752f1 GIT binary patch literal 32353 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

=g&rNuY+Ivg#8X?05-LM5B~FX z_m>UAYsza^rr#78#J{Ed@{@Q?VR+@7^P5tJ{I`@}#vHFHuZ>N9Qxt(h-hVC8-`bqK z2EO(Q`3+PC?vePXz~8PRuYs>!H+}=vF#ZeRZx4>wz}FrYzk!;V{{`^3qs43BYvYIC zKxeG~0{Gho;x+KKjlyrB8&FgoScm^uX8X5~yuQNUHa7o8 z`R79MzbUkMzbLO|<6mFK>kTu%0RZ)1fd908<~8BYuCgHRbhM&2LJT;V;VTm7CXq*EzD^09W&0fWOU{y{5cQLHwrZS^X{L zS3=@7<@L?xH)Yr67v