From: Nick Burch Date: Mon, 8 Sep 2008 17:43:31 +0000 (+0000) Subject: Fix bug #45761 - Support for Very Hidden excel sheets in HSSF X-Git-Tag: REL_3_2_FINAL~84 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3a47b6e89cf0f3f0824809a7995d307f01b793db;p=poi.git Fix bug #45761 - Support for Very Hidden excel sheets in HSSF git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@693175 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 57934cb893..4fb704e5d2 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,7 @@ + 45761 - Support for Very Hidden excel sheets in HSSF 45738 - Initial HWPF support for Office Art Shapes 45720 - Fixed HSSFWorkbook.cloneSheet to correctly clone sheets with drawings 45728 - Fix for SlideShow.reorderSlide in HSLF diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 9cbedfcaf0..118f81ba7f 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 45761 - Support for Very Hidden excel sheets in HSSF 45738 - Initial HWPF support for Office Art Shapes 45720 - Fixed HSSFWorkbook.cloneSheet to correctly clone sheets with drawings 45728 - Fix for SlideShow.reorderSlide in HSLF diff --git a/src/java/org/apache/poi/hssf/model/Workbook.java b/src/java/org/apache/poi/hssf/model/Workbook.java index f093feef66..7db37b253a 100644 --- a/src/java/org/apache/poi/hssf/model/Workbook.java +++ b/src/java/org/apache/poi/hssf/model/Workbook.java @@ -560,32 +560,72 @@ public final class Workbook implements Model { } /** - * gets the hidden flag for a given sheet. + * Gets the hidden flag for a given sheet. + * Note that a sheet could instead be + * set to be very hidden, which is different + * ({@link #isSheetVeryHidden(int)}) * * @param sheetnum the sheet number (0 based) * @return True if sheet is hidden */ - public boolean isSheetHidden(int sheetnum) { return getBoundSheetRec(sheetnum).isHidden(); } + /** + * Gets the very hidden flag for a given sheet. + * This is different from the normal + * hidden flag + * ({@link #isSheetHidden(int)}) + * + * @param sheetnum the sheet number (0 based) + * @return True if sheet is very hidden + */ + public boolean isSheetVeryHidden(int sheetnum) { + return getBoundSheetRec(sheetnum).isVeryHidden(); + } + /** * Hide or unhide a sheet * * @param sheetnum The sheet number * @param hidden True to mark the sheet as hidden, false otherwise */ - public void setSheetHidden(int sheetnum, boolean hidden) { getBoundSheetRec(sheetnum).setHidden(hidden); } + + /** + * Hide or unhide a sheet. + * 0 = not hidden + * 1 = hidden + * 2 = very hidden. + * + * @param sheetnum The sheet number + * @param hidden 0 for not hidden, 1 for hidden, 2 for very hidden + */ + public void setSheetHidden(int sheetnum, int hidden) { + BoundSheetRecord bsr = getBoundSheetRec(sheetnum); + boolean h = false; + boolean vh = false; + if(hidden == 0) { + } else if(hidden == 1) { + h = true; + } else if(hidden == 2) { + vh = true; + } else { + throw new IllegalArgumentException("Invalid hidden flag " + hidden + " given, must be 0, 1 or 2"); + } + bsr.setHidden(h); + bsr.setVeryHidden(vh); + } + + /** * get the sheet's index * @param name sheet name * @return sheet index or -1 if it was not found. */ - public int getSheetIndex(String name) { int retval = -1; diff --git a/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java b/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java index 2ef4c67d2c..1f7106ad72 100644 --- a/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java +++ b/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java @@ -36,6 +36,7 @@ public final class BoundSheetRecord extends Record { public final static short sid = 0x0085; private static final BitField hiddenFlag = BitFieldFactory.getInstance(0x01); + private static final BitField veryHiddenFlag = BitFieldFactory.getInstance(0x02); private int field_1_position_of_BOF; private short field_2_option_flags; private byte field_3_sheetname_length; @@ -301,11 +302,31 @@ public final class BoundSheetRecord extends Record { return sid; } + /** + * Is the sheet hidden? Different from very hidden + */ public boolean isHidden() { return hiddenFlag.isSet(field_2_option_flags); } + /** + * Is the sheet hidden? Different from very hidden + */ public void setHidden(boolean hidden) { field_2_option_flags = hiddenFlag.setShortBoolean(field_2_option_flags, hidden); } + + /** + * Is the sheet very hidden? Different from (normal) hidden + */ + public boolean isVeryHidden() { + return veryHiddenFlag.isSet(field_2_option_flags); + } + + /** + * Is the sheet very hidden? Different from (normal) hidden + */ + public void setVeryHidden(boolean veryHidden) { + field_2_option_flags = veryHiddenFlag.setShortBoolean(field_2_option_flags, veryHidden); + } } diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 80f799e293..a227c43d11 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -581,7 +581,10 @@ public class HSSFWorkbook extends POIDocument } /** - * check whether a sheet is hidden + * Check whether a sheet is hidden. + * Note that a sheet could instead be + * set to be very hidden, which is different + * ({@link #isSheetVeryHidden(int)}) * @param sheetIx Number * @return True if sheet is hidden */ @@ -589,6 +592,18 @@ public class HSSFWorkbook extends POIDocument validateSheetIndex(sheetIx); return workbook.isSheetHidden(sheetIx); } + /** + * Check whether a sheet is very hidden. + * This is different from the normal + * hidden status + * ({@link #isSheetHidden(int)}) + * @param sheetIx Number + * @return True if sheet is very hidden + */ + public boolean isSheetVeryHidden(int sheetIx) { + validateSheetIndex(sheetIx); + return workbook.isSheetVeryHidden(sheetIx); + } /** * Hide or unhide a sheet @@ -600,6 +615,19 @@ public class HSSFWorkbook extends POIDocument validateSheetIndex(sheetIx); workbook.setSheetHidden(sheetIx, hidden); } + /** + * Hide or unhide a sheet. + * 0 = not hidden + * 1 = hidden + * 2 = very hidden. + * + * @param sheetIx The sheet number + * @param hidden 0 for not hidden, 1 for hidden, 2 for very hidden + */ + public void setSheetHidden(int sheetIx, int hidden) { + validateSheetIndex(sheetIx); + workbook.setSheetHidden(sheetIx, hidden); + } /* * get the sheet's index diff --git a/src/testcases/org/apache/poi/hssf/data/45761.xls b/src/testcases/org/apache/poi/hssf/data/45761.xls new file mode 100644 index 0000000000..ee44612c40 Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/45761.xls differ diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 91d109685a..6e738adfb3 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -1381,4 +1381,31 @@ public final class TestBugs extends TestCase { assertFalse(nwb.getSheetAt(1).getForceFormulaRecalculation()); assertTrue(nwb.getSheetAt(2).getForceFormulaRecalculation()); } + + /** + * Very hidden sheets not displaying as such + */ + public void test45761() { + HSSFWorkbook wb = openSample("45761.xls"); + assertEquals(3, wb.getNumberOfSheets()); + + assertFalse(wb.isSheetHidden(0)); + assertFalse(wb.isSheetVeryHidden(0)); + assertTrue(wb.isSheetHidden(1)); + assertFalse(wb.isSheetVeryHidden(1)); + assertFalse(wb.isSheetHidden(2)); + assertTrue(wb.isSheetVeryHidden(2)); + + // Change 0 to be very hidden, and re-load + wb.setSheetHidden(0, 2); + + HSSFWorkbook nwb = writeOutAndReadBack(wb); + + assertFalse(nwb.isSheetHidden(0)); + assertTrue(nwb.isSheetVeryHidden(0)); + assertTrue(nwb.isSheetHidden(1)); + assertFalse(nwb.isSheetVeryHidden(1)); + assertFalse(nwb.isSheetHidden(2)); + assertTrue(nwb.isSheetVeryHidden(2)); + } }