]> source.dussan.org Git - poi.git/commitdiff
Merged revisions 695264,695303,695420 via svnmerge from
authorNick Burch <nick@apache.org>
Mon, 15 Sep 2008 17:01:46 +0000 (17:01 +0000)
committerNick Burch <nick@apache.org>
Mon, 15 Sep 2008 17:01:46 +0000 (17:01 +0000)
https://svn.apache.org:443/repos/asf/poi/trunk

........
  r695264 | josh | 2008-09-14 19:55:28 +0100 (Sun, 14 Sep 2008) | 1 line

  Fix for bug 45978 - removed eager initialisation of SheetReferences
........
  r695303 | nick | 2008-09-14 23:19:06 +0100 (Sun, 14 Sep 2008) | 1 line

  Make a start on exposing the StyleRecord details into HSSFCellStyle, but not fully there yet
........
  r695420 | nick | 2008-09-15 12:02:18 +0100 (Mon, 15 Sep 2008) | 1 line

  Finish exposing the name of Named Cell Styles via HSSFCellStyle (normally held on the parent style though)
........

git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@695549 13f79535-47bb-0310-9956-ffa450edef68

21 files changed:
src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/model/LinkTable.java
src/java/org/apache/poi/hssf/model/Workbook.java
src/java/org/apache/poi/hssf/record/StyleRecord.java
src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/java/org/apache/poi/hssf/util/SheetReferences.java [deleted file]
src/ooxml/interfaces-jdk14/org/apache/poi/ss/usermodel/Workbook.java
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
src/testcases/org/apache/poi/hssf/HSSFTests.java
src/testcases/org/apache/poi/hssf/data/WithExtendedStyles.xls [new file with mode: 0644]
src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls [new file with mode: 0644]
src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java
src/testcases/org/apache/poi/hssf/usermodel/TestCellStyle.java
src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java
src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java
src/testcases/org/apache/poi/hssf/util/TestSheetReferences.java [deleted file]

index f07ad2f350673a716b44e0e4e7649c93b90c3c82..9bb4ec1c78e7a6e9016c5c849944ba9c2e8757cb 100644 (file)
@@ -66,6 +66,8 @@
            <action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
         </release>
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="add">Expose the name of Named Cell Styles via HSSFCellStyle (normally held on the parent style though)</action>
+           <action dev="POI-DEVELOPERS" type="fix">45978 - Fixed IOOBE in Ref3DPtg.toFormulaString() due eager initialisation of SheetReferences</action>
            <action dev="POI-DEVELOPERS" type="add">Made HSSFFormulaEvaluator no longer require initialisation with sheet or row</action>
            <action dev="POI-DEVELOPERS" type="add">Extended support for cached results of formula cells</action>
            <action dev="POI-DEVELOPERS" type="fix">45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate</action>
index 0adf13d18cbe1c2cfb43c622805f150b55f4390f..9c6d8d2663d679c72ac43d274223207cb2f292d9 100644 (file)
@@ -63,6 +63,8 @@
            <action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
         </release>
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="add">Expose the name of Named Cell Styles via HSSFCellStyle (normally held on the parent style though)</action>
+           <action dev="POI-DEVELOPERS" type="fix">45978 - Fixed IOOBE in Ref3DPtg.toFormulaString() due eager initialisation of SheetReferences</action>
            <action dev="POI-DEVELOPERS" type="add">Made HSSFFormulaEvaluator no longer require initialisation with sheet or row</action>
            <action dev="POI-DEVELOPERS" type="add">Extended support for cached results of formula cells</action>
            <action dev="POI-DEVELOPERS" type="fix">45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate</action>
index a64f134fed9ffab831eeebd1b0b10a402c55c334..2caab0fb561543e1653df91f4a74aef7f3e2c7cd 100755 (executable)
@@ -348,10 +348,6 @@ final class LinkTable {
                return -1;
        }
 
-       public int getNumberOfREFStructures() {
-               return _externSheetRecord.getNumOfRefs();
-       }
-
        public String resolveNameXText(int refIndex, int definedNameIndex) {
                int extBookIndex = _externSheetRecord.getExtbookIndexFromRefIndex(refIndex);
                return _externalBookBlocks[extBookIndex].getNameText(definedNameIndex);
index 7976588d3495081d28076b214a4a5e2b1fa6b757..1e37a80ca24331041ab2b1b57087cac1ba109313 100644 (file)
@@ -26,7 +26,6 @@ import org.apache.poi.ddf.*;
 import org.apache.poi.hssf.record.*;
 import org.apache.poi.hssf.record.formula.NameXPtg;
 import org.apache.poi.hssf.util.HSSFColor;
-import org.apache.poi.hssf.util.SheetReferences;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 
@@ -774,6 +773,61 @@ public final class Workbook implements Model {
         numxfs++;
         return xf;
     }
+    
+    /**
+     * Returns the StyleRecord for the given
+     *  xfIndex, or null if that ExtendedFormat doesn't
+     *  have a Style set.
+     */
+    public StyleRecord getStyleRecord(int xfIndex) {
+       // Style records always follow after 
+       //  the ExtendedFormat records
+       boolean done = false;
+       for(int i=records.getXfpos(); i<records.size() &&
+                       !done; i++) {
+               Record r = records.get(i);
+               if(r instanceof ExtendedFormatRecord) {
+               } else if(r instanceof StyleRecord) {
+                       StyleRecord sr = (StyleRecord)r;
+                       if(sr.getIndex() == xfIndex) {
+                               return sr;
+                       }
+               } else {
+                       done = true;
+               }
+       }
+       return null;
+    }
+    /**
+     * Creates a new StyleRecord, for the given Extended
+     *  Format index, and adds it onto the end of the
+     *  records collection
+     */
+    public StyleRecord createStyleRecord(int xfIndex) {
+       // Style records always follow after 
+       //  the ExtendedFormat records
+       StyleRecord newSR = new StyleRecord();
+       newSR.setIndex((short)xfIndex);
+       
+       // Find the spot
+       int addAt = -1;
+       for(int i=records.getXfpos(); i<records.size() &&
+                       addAt == -1; i++) {
+               Record r = records.get(i);
+               if(r instanceof ExtendedFormatRecord ||
+                               r instanceof StyleRecord) {
+                       // Keep going
+               } else {
+                       addAt = i;
+               }
+       }
+       if(addAt == -1) {
+               throw new IllegalStateException("No XF Records found!");
+       }
+       records.add(addAt, newSR);
+       
+       return newSR;
+    }
 
     /**
      * Adds a string to the SST table and returns its index (if its a duplicate
@@ -1902,34 +1956,23 @@ public final class Workbook implements Model {
         return linkTable;
     }
 
-    public SheetReferences getSheetReferences() {
-        SheetReferences refs = new SheetReferences();
-        
-        if (linkTable != null) {
-            int numRefStructures = linkTable.getNumberOfREFStructures();
-            for (short k = 0; k < numRefStructures; k++) {
-                
-                String sheetName = findSheetNameFromExternSheet(k);
-                refs.addSheetReference(sheetName, k);
-                
-            }
-        }
-        return refs;
-    }
-
     /** finds the sheet name by his extern sheet index
-     * @param num extern sheet index
-     * @return sheet name
+     * @param externSheetIndex extern sheet index
+     * @return sheet name.
      */
-    public String findSheetNameFromExternSheet(short num){
+    public String findSheetNameFromExternSheet(int externSheetIndex){
 
-        int indexToSheet = linkTable.getIndexToSheet(num);
+        int indexToSheet = linkTable.getIndexToSheet(externSheetIndex);
         
         if (indexToSheet < 0) {
             // TODO - what does '-1' mean here?
             //error check, bail out gracefully!
             return "";
         }
+        if (indexToSheet >= boundsheets.size()) {
+            // Not sure if this can ever happen (See bug 45798)
+            return ""; // Seems to be what excel would do in this case
+        }
         return getSheetName(indexToSheet);
     }
 
index 6990a5efdc3e975403423d798ada4c1679410141..c6591f550de4e83762391b8ead794a61a1a69408 100644 (file)
@@ -160,7 +160,10 @@ public final class StyleRecord extends Record {
     public void setName(String name)
     {
         field_4_name = name;
-        //TODO set name length and string options
+        
+        // Fix up the length
+        field_2_name_length = (short)name.length();
+        //TODO set name string options
     }
 
     // end user defined
index 8848cb603b7aa8664c699ad28a02c849a5c4534a..2183cc2dd02c6923e440c695b3c9fc78c3014668 100644 (file)
@@ -92,7 +92,7 @@ public final class Area3DPtg extends AreaPtgBase {
        public String toFormulaString(Workbook book) {
                // First do the sheet name
                StringBuffer retval = new StringBuffer();
-               String sheetName = Ref3DPtg.getSheetName(book, field_1_index_extern_sheet);
+               String sheetName = book.findSheetNameFromExternSheet(field_1_index_extern_sheet);
                if(sheetName != null) {
                        if(sheetName.length() == 0) {
                                // What excel does if sheet has been deleted
index dbb00c323a74b3b3b4842c2c758efe5dd8790d7d..e72cbbc30a1b5e1d707cf88ebfdddd094dd9f862 100644 (file)
@@ -160,20 +160,6 @@ public final class Ref3DPtg extends OperandPtg {
 
     }
 
-    // TODO - find a home for this method
-    // There is already a method on Workbook called getSheetName but it seems to do something different.
-       static String getSheetName(Workbook book, int externSheetIndex) {
-        // TODO - there are 3 ways this method can return null. Is each valid?
-        if (book == null) {
-            return null;
-        }
-
-        SheetReferences refs = book.getSheetReferences();
-        if (refs == null) {
-            return null;
-        }
-        return refs.getSheetName(externSheetIndex);
-    }
     /**
      * @return text representation of this cell reference that can be used in text 
      * formulas. The sheet name will get properly delimited if required.
@@ -181,7 +167,7 @@ public final class Ref3DPtg extends OperandPtg {
     public String toFormulaString(Workbook book)
     {
         StringBuffer retval = new StringBuffer();
-        String sheetName = getSheetName(book, field_1_index_extern_sheet);
+        String sheetName = book.findSheetNameFromExternSheet(field_1_index_extern_sheet);
         if(sheetName != null) {
             SheetNameFormatter.appendFormat(retval, sheetName);
             retval.append( '!' );
index 9a3735c4d6e328176fd885fbb004a7b316d612b6..76be1f9e592f80de7f9e45d617e08449be4fe427 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.poi.hssf.usermodel;
 import org.apache.poi.hssf.model.Workbook;
 import org.apache.poi.hssf.record.ExtendedFormatRecord;
 import org.apache.poi.hssf.record.FontRecord;
+import org.apache.poi.hssf.record.StyleRecord;
 import org.apache.poi.hssf.util.HSSFColor;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Font;
@@ -255,6 +256,22 @@ public class HSSFCellStyle implements CellStyle
     {
         return index;
     }
+    
+    /**
+     * Return the parent style for this cell style.
+     * In most cases this will be null, but in a few
+     *  cases there'll be a fully defined parent.
+     */
+    public HSSFCellStyle getParentStyle() {
+       if(format.getParentIndex() == 0) {
+               return null;
+       }
+       return new HSSFCellStyle(
+                       format.getParentIndex(),
+                       workbook.getExFormatAt(format.getParentIndex()),
+                       workbook
+       );
+    }
 
     /**
      * set the data format (must be a valid format)
@@ -943,6 +960,37 @@ public class HSSFCellStyle implements CellStyle
     {
         return format.getFillForeground();
     }
+    
+    /**
+     * Gets the name of the user defined style.
+     * Returns null for built in styles, and
+     *  styles where no name has been defined
+     */
+    public String getUserStyleName() {
+       StyleRecord sr = workbook.getStyleRecord(index);
+       if(sr == null) {
+               return null;
+       }
+       if(sr.getType() == StyleRecord.STYLE_BUILT_IN) {
+               return null;
+       }
+       return sr.getName();
+    }
+    
+    /**
+     * Sets the name of the user defined style.
+     * Will complain if you try this on a built in style.
+     */
+    public void setUserStyleName(String styleName) {
+       StyleRecord sr = workbook.getStyleRecord(index);
+       if(sr == null) {
+               sr = workbook.createStyleRecord(index);
+       }
+       if(sr.getType() == StyleRecord.STYLE_BUILT_IN) {
+               throw new IllegalArgumentException("Unable to set user specified style names for built in styles!");
+       }
+       sr.setName(styleName);
+    }
 
     /**
      * Verifies that this style belongs to the supplied Workbook.
index 1d24ad39215ccd73f9a29585141ad78899feacce..dd808a3413d10d73062202cd3aa99dd98489ddfb 100644 (file)
@@ -35,7 +35,6 @@ import org.apache.poi.ddf.EscherBlipRecord;
 import org.apache.poi.ddf.EscherRecord;
 import org.apache.poi.hssf.model.Sheet;
 import org.apache.poi.hssf.model.Workbook;
-import org.apache.poi.hssf.model.DrawingManager2;
 import org.apache.poi.hssf.record.AbstractEscherHolderRecord;
 import org.apache.poi.hssf.record.BackupRecord;
 import org.apache.poi.hssf.record.DrawingGroupRecord;
@@ -59,7 +58,6 @@ import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.Ref3DPtg;
 import org.apache.poi.hssf.record.formula.UnionPtg;
 import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.util.SheetReferences;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.ss.usermodel.CreationHelper;
@@ -864,8 +862,13 @@ public class HSSFWorkbook extends POIDocument implements org.apache.poi.ss.userm
         return retval;
     }
 
-    public SheetReferences getSheetReferences() {
-        return workbook.getSheetReferences();
+    /**
+     * @deprecated for POI internal use only (formula rendering).  This method is likely to
+     * be removed in future versions of POI.
+     */
+    public String findSheetNameFromExternSheet(int externSheetIndex){
+        // TODO - don't expose internal ugliness like externSheet indexes to the user model API
+        return workbook.findSheetNameFromExternSheet(externSheetIndex);
     }
 
     /**
@@ -1379,12 +1382,15 @@ public class HSSFWorkbook extends POIDocument implements org.apache.poi.ss.userm
     }
 
     /**
-     * TODO - make this less cryptic / move elsewhere
+     * @deprecated for POI internal use only (formula rendering).  This method is likely to
+     * be removed in future versions of POI.
+     * 
      * @param refIndex Index to REF entry in EXTERNSHEET record in the Link Table
      * @param definedNameIndex zero-based to DEFINEDNAME or EXTERNALNAME record
      * @return the string representation of the defined or external name
      */
     public String resolveNameXText(int refIndex, int definedNameIndex) {
+        // TODO - make this less cryptic / move elsewhere
         return workbook.resolveNameXText(refIndex, definedNameIndex);
     }
 
diff --git a/src/java/org/apache/poi/hssf/util/SheetReferences.java b/src/java/org/apache/poi/hssf/util/SheetReferences.java
deleted file mode 100644 (file)
index d23ed27..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hssf.util;
-
-/**
- * Holds a collection of Sheet names and their associated
- * reference numbers.
- *
- * @author Andrew C. Oliver (acoliver at apache dot org)
- *
- */
-public class SheetReferences extends org.apache.poi.ss.util.SheetReferences
-{
-}
index a31d03e4ca780518763b90b3cbc13014ee8024e0..eca702a379ed264cc16a754ac0ca6b7a0f88de1c 100644 (file)
@@ -19,7 +19,6 @@ package org.apache.poi.ss.usermodel;
 
 import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
 import org.apache.poi.hssf.usermodel.*;
-import org.apache.poi.hssf.util.SheetReferences;
 
 /**
  * This is a JDK 1.4 compatible interface for HSSFWorkbook.
@@ -39,7 +38,7 @@ public interface Workbook {
 
     String getSheetName(int sheet);
     HSSFSheet getSheetAt(int index);
-    SheetReferences getSheetReferences();
+    String findSheetNameFromExternSheet(int externSheetIndex);
     int getSheetIndex(String name);
     int getSheetIndex(Sheet sheet);
     int getSheetIndexFromExternSheetIndex(int externSheetNumber);
index dbc7fdc97af2e0e1cde8d40048b597f87e6b1787..caafc634d04ef82443f181df758e3a5940b21dce 100644 (file)
@@ -22,7 +22,6 @@ import java.io.OutputStream;
 import java.util.List;
 
 import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
-import org.apache.poi.ss.util.SheetReferences;
 
 public interface Workbook {
 
@@ -218,7 +217,7 @@ public interface Workbook {
 
     void removeSheetAt(int index);
 
-    SheetReferences getSheetReferences();
+    String findSheetNameFromExternSheet(int externSheetIndex);
     
     /**
      * determine whether the Excel GUI will backup the workbook when saving.
index b90058e543f1a94bb9e81aae40c1f83e49762b83..28cee4227899b84c5c40088eeddc02b03ed9ac0f 100644 (file)
@@ -39,7 +39,6 @@ import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.StylesSource;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
-import org.apache.poi.ss.util.SheetReferences;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 import org.apache.poi.xssf.model.CommentsTable;
@@ -463,6 +462,14 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
     public int getSheetIndexFromExternSheetIndex(int externSheetNumber) {
                return externSheetNumber;
        }
+    /**
+     * Doesn't do anything special - returns the same as getSheetName()
+     * TODO - figure out if this is a ole2 specific thing, or
+     *  if we need to do something proper here too!
+     */
+    public String findSheetNameFromExternSheet(int externSheetIndex) {
+               return getSheetName(externSheetIndex);
+       }
 
        public Sheet getSheet(String name) {
         CTSheet[] sheets = this.workbook.getSheets().getSheetArray();  
@@ -509,14 +516,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
         return this.workbook.getSheets().getSheetArray(sheet).getName();
     }
     
-    public SheetReferences getSheetReferences() {
-       SheetReferences sr = new SheetReferences();
-       for(int i=0; i<getNumberOfSheets(); i++) {
-               sr.addSheetReference(getSheetName(i), i);
-       }
-       return sr;
-       }
-    
     /**
      * Are we a normal workbook (.xlsx), or a 
      *  macro enabled workbook (.xlsm)?
index ff15491d90400611c2b39ba49f1e0e91aed9075a..1edaf7e151a9ad3634c076b9e9d4c52675c7b90d 100644 (file)
@@ -23,14 +23,11 @@ import junit.framework.TestSuite;
 import org.apache.poi.hssf.eventmodel.TestEventRecordFactory;
 import org.apache.poi.hssf.eventmodel.TestModelFactory;
 import org.apache.poi.hssf.eventusermodel.AllEventUserModelTests;
+import org.apache.poi.hssf.extractor.TestExcelExtractor;
 import org.apache.poi.hssf.model.AllModelTests;
 import org.apache.poi.hssf.record.AllRecordTests;
 import org.apache.poi.hssf.usermodel.AllUserModelTests;
-import org.apache.poi.hssf.util.TestAreaReference;
-import org.apache.poi.hssf.util.TestCellReference;
-import org.apache.poi.hssf.util.TestRKUtil;
-import org.apache.poi.hssf.util.TestRangeAddress;
-import org.apache.poi.hssf.util.TestSheetReferences;
+import org.apache.poi.hssf.util.AllHSSFUtilTests;
 
 /**
  * Test Suite for all sub-packages of org.apache.poi.hssf<br/>
@@ -41,27 +38,20 @@ import org.apache.poi.hssf.util.TestSheetReferences;
  */
 public final class HSSFTests {
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-
     public static Test suite() {
-        TestSuite suite = new TestSuite("Tests for org.apache.poi.hssf");
-        // $JUnit-BEGIN$
+        TestSuite suite = new TestSuite(HSSFTests.class.getName());
 
         suite.addTest(AllEventUserModelTests.suite());
         suite.addTest(AllModelTests.suite());
         suite.addTest(AllUserModelTests.suite());
         suite.addTest(AllRecordTests.suite());
+        suite.addTest(AllHSSFUtilTests.suite());
 
-        suite.addTest(new TestSuite(TestAreaReference.class));
-        suite.addTest(new TestSuite(TestCellReference.class));
-        suite.addTest(new TestSuite(TestRangeAddress.class));
-        suite.addTest(new TestSuite(TestRKUtil.class));
-        suite.addTest(new TestSuite(TestSheetReferences.class));
+        if (false) { // TODO - hook this test up
+            suite.addTest(new TestSuite(TestExcelExtractor.class));
+        }
         suite.addTest(new TestSuite(TestEventRecordFactory.class));
         suite.addTest(new TestSuite(TestModelFactory.class));
-        // $JUnit-END$
         return suite;
     }
 }
diff --git a/src/testcases/org/apache/poi/hssf/data/WithExtendedStyles.xls b/src/testcases/org/apache/poi/hssf/data/WithExtendedStyles.xls
new file mode 100644 (file)
index 0000000..4a80f56
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/WithExtendedStyles.xls differ
diff --git a/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls b/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls
new file mode 100644 (file)
index 0000000..5e49614
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls differ
index c8beb7b78b8bdd6e7f3f3c4469eb5884510ef566..e88d274eacdbd987ab15a634f4a271f149457279 100644 (file)
@@ -16,6 +16,7 @@
 ==================================================================== */
 
 package org.apache.poi.hssf.eventusermodel;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -32,7 +33,6 @@ import org.apache.poi.hssf.record.Record;
 import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.Ref3DPtg;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.util.SheetReferences;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 /**
  * Tests for {@link EventWorkbookBuilder}
@@ -66,9 +66,6 @@ public final class TestEventWorkbookBuilder extends TestCase {
        public void testGetStubWorkbooks() {
                assertNotNull(listener.getStubWorkbook());
                assertNotNull(listener.getStubHSSFWorkbook());
-               
-               assertNotNull(listener.getStubWorkbook().getSheetReferences());
-               assertNotNull(listener.getStubHSSFWorkbook().getSheetReferences());
        }
        
        public void testContents() {
@@ -78,10 +75,10 @@ public final class TestEventWorkbookBuilder extends TestCase {
                
                assertEquals(3, listener.getStubWorkbook().getNumSheets());
                
-               SheetReferences ref = listener.getStubWorkbook().getSheetReferences();
-               assertEquals("Sh3", ref.getSheetName(0));
-               assertEquals("Sheet1", ref.getSheetName(1));
-               assertEquals("S2", ref.getSheetName(2));
+               Workbook ref = listener.getStubWorkbook();
+               assertEquals("Sh3", ref.findSheetNameFromExternSheet(0));
+               assertEquals("Sheet1", ref.findSheetNameFromExternSheet(1));
+               assertEquals("S2", ref.findSheetNameFromExternSheet(2));
        }
        
        public void testFormulas() {
index 1dc826cc6fd74789bbd4f9723bd6fe05e1d089d0..a4cf005a0c2dbbe055392724e5fddb17693f8f83 100644 (file)
@@ -29,6 +29,8 @@ import java.io.*;
 import java.util.*;
 
 import junit.framework.*;
+
+import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.util.TempFile;
 
 /**
@@ -41,6 +43,10 @@ public class TestCellStyle
     extends TestCase
 {
 
+    private static HSSFWorkbook openSample(String sampleFileName) {
+        return HSSFTestDataSamples.openSampleWorkbook(sampleFileName);
+    }
+
     /** Creates a new instance of TestCellStyle */
 
     public TestCellStyle(String name)
@@ -303,6 +309,54 @@ public class TestCellStyle
        assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##"));
        assertEquals(5, wbClone.getNumberOfFonts());
     }
+    
+    public void testStyleNames() throws Exception {
+        HSSFWorkbook wb = openSample("WithExtendedStyles.xls");
+       HSSFSheet s = wb.getSheetAt(0);
+       HSSFCell c1 = s.getRow(0).getCell(0);
+       HSSFCell c2 = s.getRow(1).getCell(0);
+       HSSFCell c3 = s.getRow(2).getCell(0);
+       
+       HSSFCellStyle cs1 = c1.getCellStyle();
+       HSSFCellStyle cs2 = c2.getCellStyle();
+       HSSFCellStyle cs3 = c3.getCellStyle();
+       
+       assertNotNull(cs1);
+       assertNotNull(cs2);
+       assertNotNull(cs3);
+       
+       // Check we got the styles we'd expect
+       assertEquals(10, cs1.getFont(wb).getFontHeightInPoints());
+       assertEquals(9,  cs2.getFont(wb).getFontHeightInPoints());
+       assertEquals(12, cs3.getFont(wb).getFontHeightInPoints());
+       
+       assertEquals(15, cs1.getIndex());
+       assertEquals(23, cs2.getIndex());
+       assertEquals(24, cs3.getIndex());
+       
+       assertNull(cs1.getParentStyle());
+       assertNotNull(cs2.getParentStyle());
+       assertNotNull(cs3.getParentStyle());
+       
+       assertEquals(21, cs2.getParentStyle().getIndex());
+       assertEquals(22, cs3.getParentStyle().getIndex());
+       
+       // Now check we can get style records for 
+       //  the parent ones
+       assertNull(wb.getWorkbook().getStyleRecord(15));
+       assertNull(wb.getWorkbook().getStyleRecord(23));
+       assertNull(wb.getWorkbook().getStyleRecord(24));
+       
+       assertNotNull(wb.getWorkbook().getStyleRecord(21));
+       assertNotNull(wb.getWorkbook().getStyleRecord(22));
+       
+       // Now check the style names
+       assertEquals(null, cs1.getUserStyleName());
+       assertEquals(null, cs2.getUserStyleName());
+       assertEquals(null, cs3.getUserStyleName());
+       assertEquals("style1", cs2.getParentStyle().getUserStyleName());
+       assertEquals("style2", cs3.getParentStyle().getUserStyleName());
+    }
 
     public static void main(String [] ignored_args)
     {
index d8b4e95212c46de5d95328ed0a4415cee8c712ad..e8542edd8f5735f8bc6eb78a09a749beb2c7355b 100644 (file)
@@ -6,7 +6,7 @@ import junit.framework.TestCase;
 import org.apache.poi.hssf.HSSFTestDataSamples;
 /**
  * Tests for LinkTable
- * 
+ *
  * @author Josh Micich
  */
 public final class TestLinkTable extends TestCase {
@@ -14,9 +14,9 @@ public final class TestLinkTable extends TestCase {
        /**
         * The example file attached to bugzilla 45046 is a clear example of Name records being present
         * without an External Book (SupBook) record.  Excel has no trouble reading this file.<br/>
-        * TODO get OOO documentation updated to reflect this (that EXTERNALBOOK is optional). 
-        * 
-        * It's not clear what exact steps need to be taken in Excel to create such a workbook 
+        * TODO get OOO documentation updated to reflect this (that EXTERNALBOOK is optional).
+        *
+        * It's not clear what exact steps need to be taken in Excel to create such a workbook
         */
        public void testLinkTableWithoutExternalBookRecord_bug45046() {
                HSSFWorkbook wb;
@@ -32,16 +32,16 @@ public final class TestLinkTable extends TestCase {
                // some other sanity checks
                assertEquals(3, wb.getNumberOfSheets());
                String formula = wb.getSheetAt(0).getRow(4).getCell(13).getCellFormula();
-               
+
                if ("ipcSummenproduktIntern($P5,N$6,$A$9,N$5)".equals(formula)) {
-                       // The reported symptom of this bugzilla is an earlier bug (already fixed) 
-                       throw new AssertionFailedError("Identified bug 41726"); 
+                       // The reported symptom of this bugzilla is an earlier bug (already fixed)
+                       throw new AssertionFailedError("Identified bug 41726");
                        // This is observable in version 3.0
                }
-               
+
                assertEquals("ipcSummenproduktIntern($C5,N$2,$A$9,N$1)", formula);
        }
-       
+
        public void testMultipleExternSheetRecords_bug45698() {
                HSSFWorkbook wb;
 
@@ -56,4 +56,45 @@ public final class TestLinkTable extends TestCase {
                // some other sanity checks
                assertEquals(7, wb.getNumberOfSheets());
        }
+
+       public void testExtraSheetRefs_bug45978() {
+               HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45978-extraLinkTableSheets.xls");
+               /*
+               ex45978-extraLinkTableSheets.xls is a cut-down version of attachment 22561.
+               The original file produces the same error.
+
+               This bug was caused by a combination of invalid sheet indexes in the EXTERNSHEET
+               record, and eager initialisation of the extern sheet references. Note - the worbook
+               has 2 sheets, but the EXTERNSHEET record refers to sheet indexes 0, 1 and 2.
+
+               Offset 0x3954 (14676)
+               recordid = 0x17, size = 32
+               [EXTERNSHEET]
+                  numOfRefs     = 5
+               refrec           #0: extBook=0 firstSheet=0 lastSheet=0
+               refrec           #1: extBook=1 firstSheet=2 lastSheet=2
+               refrec           #2: extBook=2 firstSheet=1 lastSheet=1
+               refrec           #3: extBook=0 firstSheet=-1 lastSheet=-1
+               refrec           #4: extBook=0 firstSheet=1 lastSheet=1
+               [/EXTERNSHEET]
+
+               As it turns out, the formula in question doesn't even use externSheetIndex #1 - it
+               uses #4, which resolves to sheetIndex 1 -> 'Data'.
+
+               It is not clear exactly what externSheetIndex #4 would refer to.  Excel seems to
+               display such a formula as "''!$A2", but then complains of broken link errors.
+               */
+
+               HSSFCell cell = wb.getSheetAt(0).getRow(1).getCell(1);
+               String cellFormula;
+               try {
+                       cellFormula = cell.getCellFormula();
+               } catch (IndexOutOfBoundsException e) {
+                       if (e.getMessage().equals("Index: 2, Size: 2")) {
+                               throw new AssertionFailedError("Identified bug 45798");
+                       }
+                       throw e;
+               }
+               assertEquals("Data!$A2", cellFormula);
+       }
 }
index ec88e5c439e446670ede789f67c04cc9f1841d53..45c96e6c42d13474833d5982672ee835c3ea7846 100755 (executable)
@@ -34,7 +34,6 @@ public class AllHSSFUtilTests {
                result.addTestSuite(TestHSSFColor.class);
                result.addTestSuite(TestRangeAddress.class);
                result.addTestSuite(TestRKUtil.class);
-               result.addTestSuite(TestSheetReferences.class);
                return result;
        }
 }
diff --git a/src/testcases/org/apache/poi/hssf/util/TestSheetReferences.java b/src/testcases/org/apache/poi/hssf/util/TestSheetReferences.java
deleted file mode 100644 (file)
index 4464d76..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-        
-
-package org.apache.poi.hssf.util;
-
-import junit.framework.TestCase;
-
-/**
- * Tests the SheetReferences class.
- * @author Andrew C. Oliver (acoliver at apache dot org)
- */
-public class TestSheetReferences
-        extends TestCase
-{
-    public TestSheetReferences(String s)
-    {
-        super(s);
-    }
-
-    /**
-     * Test that the SheetReferences class can add references and give them
-     * out
-     */
-    public void testSheetRefs()
-            throws Exception
-    {
-        SheetReferences refs = new SheetReferences();
-        refs.addSheetReference("A", 0);
-        refs.addSheetReference("B", 1);
-        refs.addSheetReference("C", 3);
-        assertTrue("ref 0 == A", refs.getSheetName(0).equals("A"));
-        assertTrue("ref 1 == B", refs.getSheetName(1).equals("B"));
-        assertTrue("ref 3 == C", refs.getSheetName(3).equals("C"));
-    }
-}