From 3a47b6e89cf0f3f0824809a7995d307f01b793db Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 8 Sep 2008 17:43:31 +0000 Subject: [PATCH] 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 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../org/apache/poi/hssf/model/Workbook.java | 48 ++++++++++++++++-- .../poi/hssf/record/BoundSheetRecord.java | 21 ++++++++ .../poi/hssf/usermodel/HSSFWorkbook.java | 30 ++++++++++- .../org/apache/poi/hssf/data/45761.xls | Bin 0 -> 15872 bytes .../apache/poi/hssf/usermodel/TestBugs.java | 27 ++++++++++ 7 files changed, 123 insertions(+), 5 deletions(-) create mode 100644 src/testcases/org/apache/poi/hssf/data/45761.xls 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 0000000000000000000000000000000000000000..ee44612c40326655b9f8769e3838ea40e33f0728 GIT binary patch literal 15872 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 OXX*Dvi|&)lfj