]> source.dussan.org Git - poi.git/commitdiff
Fix bug #45761 - Support for Very Hidden excel sheets in HSSF
authorNick Burch <nick@apache.org>
Mon, 8 Sep 2008 17:43:31 +0000 (17:43 +0000)
committerNick Burch <nick@apache.org>
Mon, 8 Sep 2008 17:43:31 +0000 (17:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@693175 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/model/Workbook.java
src/java/org/apache/poi/hssf/record/BoundSheetRecord.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/testcases/org/apache/poi/hssf/data/45761.xls [new file with mode: 0644]
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java

index 57934cb8936da6ca3566795a00301d01c0131e6b..4fb704e5d290488d732192f759bb1e31efd608ec 100644 (file)
@@ -37,6 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="add">45761 - Support for Very Hidden excel sheets in HSSF</action>
            <action dev="POI-DEVELOPERS" type="add">45738 - Initial HWPF support for Office Art Shapes</action>
            <action dev="POI-DEVELOPERS" type="fix">45720 - Fixed HSSFWorkbook.cloneSheet to correctly clone sheets with drawings</action>
            <action dev="POI-DEVELOPERS" type="fix">45728 - Fix for SlideShow.reorderSlide in HSLF</action>
index 9cbedfcaf0001a492793b1b3c9778a886c65e655..118f81ba7f74cb2691e3a090c2f0ba444fc3b286 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="add">45761 - Support for Very Hidden excel sheets in HSSF</action>
            <action dev="POI-DEVELOPERS" type="add">45738 - Initial HWPF support for Office Art Shapes</action>
            <action dev="POI-DEVELOPERS" type="fix">45720 - Fixed HSSFWorkbook.cloneSheet to correctly clone sheets with drawings</action>
            <action dev="POI-DEVELOPERS" type="fix">45728 - Fix for SlideShow.reorderSlide in HSLF</action>
index f093feef663e5bb7427194a4eb35f29cbfcf7b40..7db37b253af6cb0069e18fd4eac6e36e8bb38926 100644 (file)
@@ -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;
 
index 2ef4c67d2c251920303aafafe09c9d294ad704ab..1f7106ad7299d441e5d367c3132e2ac00fd0cb85 100644 (file)
@@ -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);
+    }
 }
index 80f799e29384425298314ff29c8f8ac437fe3c35..a227c43d11b8e1b832a1457e6ad1cebcc20c2f1b 100644 (file)
@@ -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 (file)
index 0000000..ee44612
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/45761.xls differ
index 91d109685ab6f335e29447805fc5ae4afe1d35fe..6e738adfb3f210c3fe30878ba9f4fc13a80bfaad 100644 (file)
@@ -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));
+    }
 }