]> source.dussan.org Git - poi.git/commitdiff
Provide XSSF-style external sheet support for areas, similar to the recent cell refer...
authorNick Burch <nick@apache.org>
Sat, 19 Jul 2014 19:42:07 +0000 (19:42 +0000)
committerNick Burch <nick@apache.org>
Sat, 19 Jul 2014 19:42:07 +0000 (19:42 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1611950 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java
src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
src/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java

index aad61c590532471edaefa2e4cc34b3582a5fcf18..3b25240006c341f1f078c51adb8c02720478953e 100644 (file)
@@ -28,6 +28,7 @@ import org.apache.poi.ss.formula.eval.RefEval;
 import org.apache.poi.ss.formula.eval.ValueEval;
 import org.apache.poi.ss.formula.functions.FreeRefFunction;
 import org.apache.poi.ss.formula.ptg.Area3DPtg;
+import org.apache.poi.ss.formula.ptg.Area3DPxg;
 import org.apache.poi.ss.formula.ptg.NameXPtg;
 import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.formula.ptg.Ref3DPtg;
@@ -279,17 +280,25 @@ public final class OperationEvaluationContext {
         SheetRefEvaluator sre = createExternSheetRefEvaluator(rptg.getSheetName(), rptg.getExternalWorkbookNumber());
         return new LazyRefEval(rptg.getRow(), rptg.getColumn(), sre);
     }
+    
        public ValueEval getAreaEval(int firstRowIndex, int firstColumnIndex,
                        int lastRowIndex, int lastColumnIndex) {
                SheetRefEvaluator sre = getRefEvaluatorForCurrentSheet();
                return new LazyAreaEval(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex, sre);
        }
-       public ValueEval getArea3DEval(int firstRowIndex, int firstColumnIndex,
-                       int lastRowIndex, int lastColumnIndex, int extSheetIndex) {
-               SheetRefEvaluator sre = createExternSheetRefEvaluator(extSheetIndex);
-               return new LazyAreaEval(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex, sre);
-       }
+    public ValueEval getArea3DEval(Area3DPtg aptg) {
+        SheetRefEvaluator sre = createExternSheetRefEvaluator(aptg.getExternSheetIndex());
+        return new LazyAreaEval(aptg.getFirstRow(), aptg.getFirstColumn(),
+                aptg.getLastRow(), aptg.getLastColumn(), sre);
+    }
+    public ValueEval getArea3DEval(Area3DPxg aptg) {
+        SheetRefEvaluator sre = createExternSheetRefEvaluator(aptg.getSheetName(), aptg.getExternalWorkbookNumber());
+        return new LazyAreaEval(aptg.getFirstRow(), aptg.getFirstColumn(),
+                aptg.getLastRow(), aptg.getLastColumn(), sre);
+    }
+    
        public ValueEval getNameXEval(NameXPtg nameXPtg) {
+           // TODO Need HSSF and XSSF versions of these
       ExternalSheet externSheet = _workbook.getExternalSheet(nameXPtg.getSheetRefIndex());
       if(externSheet == null)
          return new NameXEval(nameXPtg);
index e124278f8e81817eea1475bd2ce28cd76a9fc87a..41a11c95d8591a61e47ae02c2f3b1486ff71b361 100644 (file)
@@ -44,6 +44,7 @@ import org.apache.poi.ss.formula.functions.FreeRefFunction;
 import org.apache.poi.ss.formula.functions.Function;
 import org.apache.poi.ss.formula.functions.IfFunc;
 import org.apache.poi.ss.formula.ptg.Area3DPtg;
+import org.apache.poi.ss.formula.ptg.Area3DPxg;
 import org.apache.poi.ss.formula.ptg.AreaErrPtg;
 import org.apache.poi.ss.formula.ptg.AreaPtg;
 import org.apache.poi.ss.formula.ptg.AttrPtg;
@@ -679,8 +680,10 @@ public final class WorkbookEvaluator {
            return ec.getRef3DEval((Ref3DPxg)ptg);
        }
        if (ptg instanceof Area3DPtg) {
-           Area3DPtg aptg = (Area3DPtg) ptg;
-           return ec.getArea3DEval(aptg.getFirstRow(), aptg.getFirstColumn(), aptg.getLastRow(), aptg.getLastColumn(), aptg.getExternSheetIndex());
+           return ec.getArea3DEval((Area3DPtg)ptg);
+       }
+       if (ptg instanceof Area3DPxg) {
+           return ec.getArea3DEval((Area3DPxg)ptg);
        }
        if (ptg instanceof RefPtg) {
            RefPtg rptg = (RefPtg) ptg;
index a5f1001a16665f51a313a6a110fe73a99a4691ca..7bf64c06755c64971ed9e8681e19eef08ad50403 100644 (file)
@@ -25,12 +25,13 @@ import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * Title:        Area 3D Ptg - 3D reference (Sheet + Area)<P>
- * Description:  Defined a area in Extern Sheet. <P>
- * REFERENCE:  <P>
- * @author Libin Roman (Vista Portal LDT. Developer)
- * @author avik
- * @author Jason Height (jheight at chariot dot net dot au)
+ * <p>Title:        Area 3D Ptg - 3D reference (Sheet + Area)</p>
+ * <p>Description:  Defined an area in Extern Sheet. </p>
+ * <p>REFERENCE:  </p>
+ * 
+ * <p>This is HSSF only, as it matches the HSSF file format way of
+ *  referring to the sheet by an extern index. The XSSF equivalent
+ *  is {@link Area3DPxg}
  */
 public final class Area3DPtg extends AreaPtgBase implements WorkbookDependentFormula, ExternSheetReferenceToken {
        public final static byte sid = 0x3b;
index 5f326b6ad7d8572417625b78187e3c63252e0c6b..9dd475b047c9e721ea9c2ac3747f93400345f1d3 100644 (file)
@@ -28,7 +28,7 @@ import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
 import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.formula.SheetIdentifier;
 import org.apache.poi.ss.formula.functions.FreeRefFunction;
-import org.apache.poi.ss.formula.ptg.Area3DPtg;
+import org.apache.poi.ss.formula.ptg.Area3DPxg;
 import org.apache.poi.ss.formula.ptg.NamePtg;
 import org.apache.poi.ss.formula.ptg.NameXPtg;
 import org.apache.poi.ss.formula.ptg.Ptg;
@@ -150,8 +150,14 @@ public final class XSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E
         }
     }
     public Ptg get3DReferencePtg(AreaReference area, SheetIdentifier sheet) {
-        // TODO Implement properly
-        return new Area3DPtg(area, getExternalSheetIndex(sheet._sheetIdentifier.getName()));
+        String sheetName = sheet._sheetIdentifier.getName();
+        
+        if (sheet._bookName != null) {
+            int bookIndex = resolveBookIndex(sheet._bookName);
+            return new Area3DPxg(bookIndex, sheetName, area);
+        } else {
+            return new Area3DPxg(sheetName, area);
+        }
     }
 
     public String resolveNameXText(NameXPtg n) {