]> source.dussan.org Git - poi.git/commitdiff
Rename some of the internal HSSF sheet lookup methods which deal with external sheet...
authorNick Burch <nick@apache.org>
Thu, 24 Jul 2014 21:25:45 +0000 (21:25 +0000)
committerNick Burch <nick@apache.org>
Thu, 24 Jul 2014 21:25:45 +0000 (21:25 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1613305 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/model/InternalWorkbook.java
src/java/org/apache/poi/hssf/model/LinkTable.java
src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
src/java/org/apache/poi/hssf/usermodel/HSSFName.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java
src/java/org/apache/poi/ss/formula/FormulaRenderingWorkbook.java
src/java/org/apache/poi/ss/formula/ptg/ExternSheetNameResolver.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java
src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java

index 0479a0b8e438351e7a9146549a702d0eeda5de69..115bdd4a6350a458a15dd8bca9a10d471eaa1d3c 100644 (file)
@@ -85,6 +85,7 @@ import org.apache.poi.hssf.record.common.UnicodeString;
 import org.apache.poi.hssf.util.HSSFColor;
 import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalName;
 import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
+import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheetRange;
 import org.apache.poi.ss.formula.FormulaShifter;
 import org.apache.poi.ss.formula.ptg.Area3DPtg;
 import org.apache.poi.ss.formula.ptg.NameXPtg;
@@ -1803,30 +1804,42 @@ public final class InternalWorkbook {
         return linkTable;
     }
 
-    /** finds the sheet name by his extern sheet index
+    /** 
+     * Finds the first sheet name by his extern sheet index
      * @param externSheetIndex extern sheet index
-     * @return sheet name.
+     * @return first sheet name.
      */
-    public String findSheetNameFromExternSheet(int externSheetIndex){
-
-        int indexToSheet = linkTable.getIndexToInternalSheet(externSheetIndex);
-        if (indexToSheet < 0) {
+    public String findSheetFirstNameFromExternSheet(int externSheetIndex){
+        int indexToSheet = linkTable.getFirstInternalSheetIndexForExtIndex(externSheetIndex);
+        return findSheetNameFromIndex(indexToSheet);
+    }
+    public String findSheetLastNameFromExternSheet(int externSheetIndex){
+        int indexToSheet = linkTable.getLastInternalSheetIndexForExtIndex(externSheetIndex);
+        return findSheetNameFromIndex(indexToSheet);
+    }
+    private String findSheetNameFromIndex(int internalSheetIndex) {
+        if (internalSheetIndex < 0) {
             // TODO - what does '-1' mean here?
             //error check, bail out gracefully!
             return "";
         }
-        if (indexToSheet >= boundsheets.size()) {
+        if (internalSheetIndex >= 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);
+        return getSheetName(internalSheetIndex);
     }
+    
     public ExternalSheet getExternalSheet(int externSheetIndex) {
         String[] extNames = linkTable.getExternalBookAndSheetName(externSheetIndex);
         if (extNames == null) {
             return null;
         }
-        return new ExternalSheet(extNames[0], extNames[1]);
+        if (extNames.length == 2) {
+            return new ExternalSheet(extNames[0], extNames[1]);
+        } else {
+            return new ExternalSheetRange(extNames[0], extNames[1], extNames[2]);
+        }
     }
     public ExternalName getExternalName(int externSheetIndex, int externNameIndex) {
        String nameName = linkTable.resolveNameXText(externSheetIndex, externNameIndex, this);
index 3b04d0d843bb41c6a8d356a129b8785797762ded..a117aef4a3adcb460e09902d4f73281f21943c1b 100644 (file)
@@ -359,15 +359,28 @@ final class LinkTable {
                        return null;
                }
                // Sheet name only applies if not a global reference
-               int shIx = _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
-               String usSheetName = null;
-               if(shIx >= 0) {
-                  usSheetName = ebr.getSheetNames()[shIx];
-               }
-               return new String[] {
-                               ebr.getURL(),
-                               usSheetName,
-               };
+               int shIx1 = _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
+        int shIx2 = _externSheetRecord.getLastSheetIndexFromRefIndex(extRefIndex);
+               String firstSheetName = null;
+        String lastSheetName = null;
+               if(shIx1 >= 0) {
+                   firstSheetName = ebr.getSheetNames()[shIx1];
+               }
+               if (shIx2 >= 0) {
+                   lastSheetName = ebr.getSheetNames()[shIx2];
+               }
+               if (shIx1 == shIx2) {
+               return new String[] {
+                               ebr.getURL(),
+                               firstSheetName
+               };
+               } else {
+            return new String[] {
+                    ebr.getURL(),
+                    firstSheetName,
+                    lastSheetName
+            };
+               }
        }
 
        public int getExternalSheetIndex(String workbookName, String sheetName) {
@@ -411,9 +424,16 @@ final class LinkTable {
         * @param extRefIndex as from a {@link Ref3DPtg} or {@link Area3DPtg}
         * @return -1 if the reference is to an external book
         */
-       public int getIndexToInternalSheet(int extRefIndex) {
+       public int getFirstInternalSheetIndexForExtIndex(int extRefIndex) {
                return _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
        }
+    /**
+     * @param extRefIndex as from a {@link Ref3DPtg} or {@link Area3DPtg}
+     * @return -1 if the reference is to an external book
+     */
+    public int getLastInternalSheetIndexForExtIndex(int extRefIndex) {
+        return _externSheetRecord.getLastSheetIndexFromRefIndex(extRefIndex);
+    }
 
        /**
         * @deprecated Was prevously used for removing sheets, which we now do differently 
index 748b42a43d1d0ac5f011eeb3cae818643634c971..6b9ddaa7e7f633c10bada7b0efebea0b5c0ff750 100644 (file)
@@ -132,6 +132,10 @@ public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E
                 // Not actually sheet based at all - is workbook scoped
                 return null;
             }
+            
+            // Is it a single local sheet, or a range?
+            // TODO
+            
             // Look up the local sheet
             String sheetName = getSheetName(localSheetIndex);
             sheet = new ExternalSheet(null, sheetName);
@@ -154,8 +158,11 @@ public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E
         return _iBook.resolveNameXText(n.getSheetRefIndex(), n.getNameIndex());
     }
 
-    public String getSheetNameByExternSheet(int externSheetIndex) {
-        return _iBook.findSheetNameFromExternSheet(externSheetIndex);
+    public String getSheetFirstNameByExternSheet(int externSheetIndex) {
+        return _iBook.findSheetFirstNameFromExternSheet(externSheetIndex);
+    }
+    public String getSheetLastNameByExternSheet(int externSheetIndex) {
+        return _iBook.findSheetLastNameFromExternSheet(externSheetIndex);
     }
     public String getNameText(NamePtg namePtg) {
         return _iBook.getNameRecord(namePtg.getIndex()).getNameText();
index b5a83eee9dd6e3340b930485ea6c886622790bb4..f8c8af479e5a9e067bf2cd8f6585c441ca9d8815 100644 (file)
@@ -21,8 +21,8 @@ import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.model.InternalWorkbook;
 import org.apache.poi.hssf.record.NameCommentRecord;
 import org.apache.poi.hssf.record.NameRecord;
-import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.formula.FormulaType;
+import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.usermodel.Name;
 
 /**
@@ -66,7 +66,7 @@ public final class HSSFName implements Name {
     public String getSheetName() {
         int indexToExternSheet = _definedNameRec.getExternSheetNumber();
 
-        return _book.getWorkbook().findSheetNameFromExternSheet(indexToExternSheet);
+        return _book.getWorkbook().findSheetFirstNameFromExternSheet(indexToExternSheet);
     }
 
     /**
index 5c85368ca43544a81bee582e6c3290b6dd92a491..32a8391cd50ef9d879ea87390fa2d96761042244 100644 (file)
@@ -675,7 +675,7 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
     @Deprecated
        public String findSheetNameFromExternSheet(int externSheetIndex){
         // TODO - don't expose internal ugliness like externSheet indexes to the user model API
-        return workbook.findSheetNameFromExternSheet(externSheetIndex);
+        return workbook.findSheetFirstNameFromExternSheet(externSheetIndex);
     }
     /**
      * @deprecated for POI internal use only (formula rendering).  This method is likely to
index 855ae5929c60483ea6d2d869e3bfdfee3ff1ceea..23474e87fc61743f7d7a00c8069a58d15357c8d5 100644 (file)
@@ -89,6 +89,20 @@ public interface EvaluationWorkbook {
             return _sheetName;
         }
     }
+    class ExternalSheetRange extends ExternalSheet {
+        private final String _lastSheetName;
+        public ExternalSheetRange(String workbookName, String firstSheetName, String lastSheetName) {
+            super(workbookName, firstSheetName);
+            this._lastSheetName = lastSheetName;
+        }
+        
+        public String getFirstSheetName() {
+            return getSheetName();
+        }
+        public String getLastSheetName() {
+            return _lastSheetName;
+        }
+    }
     class ExternalName {
         private final String _nameName;
         private final int _nameNumber;
index 0234ae65b4ae27b8180828d621d2206295ec5d76..f918be4eb0061688bd94e513d1107afd6248e0c1 100644 (file)
@@ -17,9 +17,9 @@
 
 package org.apache.poi.ss.formula;
 
+import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
 import org.apache.poi.ss.formula.ptg.NamePtg;
 import org.apache.poi.ss.formula.ptg.NameXPtg;
-import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
 
 /**
  * Abstracts a workbook for the purpose of converting formula to text.<br/>
@@ -29,12 +29,20 @@ import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
  * @author Josh Micich
  */
 public interface FormulaRenderingWorkbook {
-
        /**
         * @return <code>null</code> if externSheetIndex refers to a sheet inside the current workbook
         */
        ExternalSheet getExternalSheet(int externSheetIndex);
-       String getSheetNameByExternSheet(int externSheetIndex);
+       
+       /**
+        * @return the name of the (first) sheet referred to by the given external sheet index
+        */
+       String getSheetFirstNameByExternSheet(int externSheetIndex);
+    /**
+     * @return the name of the (last) sheet referred to by the given external sheet index
+     */
+    String getSheetLastNameByExternSheet(int externSheetIndex);
+       
        String resolveNameXText(NameXPtg nameXPtg);
        String getNameText(NamePtg namePtg);
 }
index a6cb76022adcc26d878fa06c0aea67b2c8984dd5..a61d1d5752a82a78b051934baa8200e4f724aa67 100644 (file)
@@ -18,6 +18,7 @@
 package org.apache.poi.ss.formula.ptg;
 
 import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
+import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheetRange;
 import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
 import org.apache.poi.ss.formula.SheetNameFormatter;
 
@@ -42,14 +43,26 @@ final class ExternSheetNameResolver {
                 sb = new StringBuffer(sheetName.length() + cellRefText.length() + 4);
                 SheetNameFormatter.appendFormat(sb, sheetName);
             }
+            if (externalSheet instanceof ExternalSheetRange) {
+                ExternalSheetRange r = (ExternalSheetRange)externalSheet;
+                if (! r.getFirstSheetName().equals(r.getLastSheetName())) {
+                    sb.append(':');
+                    SheetNameFormatter.appendFormat(sb, r.getLastSheetName());
+                }
+            }
         } else {
-            String sheetName = book.getSheetNameByExternSheet(field_1_index_extern_sheet);
-            sb = new StringBuffer(sheetName.length() + cellRefText.length() + 4);
-            if (sheetName.length() < 1) {
+            String firstSheetName = book.getSheetFirstNameByExternSheet(field_1_index_extern_sheet);
+            String lastSheetName = book.getSheetLastNameByExternSheet(field_1_index_extern_sheet);
+            sb = new StringBuffer(firstSheetName.length() + cellRefText.length() + 4);
+            if (firstSheetName.length() < 1) {
                 // What excel does if sheet has been deleted
                 sb.append("#REF"); // note - '!' added just once below
             } else {
-                SheetNameFormatter.appendFormat(sb, sheetName);
+                SheetNameFormatter.appendFormat(sb, firstSheetName);
+                if (! firstSheetName.equals(lastSheetName)) {
+                    sb.append(':');
+                    sb.append(lastSheetName);
+                }
             }
         }
         sb.append('!');
index d9486e3bc2759d21c19494a665c3586ea6bd85bd..84f6366fe0ae5fa229772d9e7a0cc63bc574ac82 100644 (file)
@@ -256,10 +256,14 @@ public final class XSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E
                return _uBook.getSheetIndex(sheetName);
        }
 
-       public String getSheetNameByExternSheet(int externSheetIndex) {
+       public String getSheetFirstNameByExternSheet(int externSheetIndex) {
                int sheetIndex = convertFromExternalSheetIndex(externSheetIndex);
                return _uBook.getSheetName(sheetIndex);
        }
+    public String getSheetLastNameByExternSheet(int externSheetIndex) {
+        // XSSF does multi-sheet references differently, so this is the same as the first
+        return getSheetFirstNameByExternSheet(externSheetIndex);
+    }
 
        public String getNameText(NamePtg namePtg) {
                return _uBook.getNameAt(namePtg.getIndex()).getNameName();
index 1b02cf241632029c7d37553e8c0bf1a6ef81809b..37b77423ba29fb4fbd9f26b45bb34976f29f40c0 100644 (file)
@@ -78,9 +78,9 @@ public final class TestEventWorkbookBuilder extends TestCase {
         assertEquals(3, listener.getStubWorkbook().getNumSheets());
 
         InternalWorkbook ref = listener.getStubWorkbook();
-        assertEquals("Sh3", ref.findSheetNameFromExternSheet(0));
-        assertEquals("Sheet1", ref.findSheetNameFromExternSheet(1));
-        assertEquals("S2", ref.findSheetNameFromExternSheet(2));
+        assertEquals("Sh3", ref.findSheetFirstNameFromExternSheet(0));
+        assertEquals("Sheet1", ref.findSheetFirstNameFromExternSheet(1));
+        assertEquals("S2", ref.findSheetFirstNameFromExternSheet(2));
     }
 
     public void testFormulas() {