import org.apache.poi.ss.util.CellReference;
/**
- * Provides Lazy Evaluation to a 3D Ranges
- *
- * TODO Provide access to multiple sheets where present
+ * Provides Lazy Evaluation to 3D Ranges
*/
final class LazyAreaEval extends AreaEvalBase {
private final SheetRangeEvaluator _evaluator;
LazyAreaEval(AreaI ptg, SheetRangeEvaluator evaluator) {
- super(ptg);
+ super(ptg, evaluator);
_evaluator = evaluator;
}
public LazyAreaEval(int firstRowIndex, int firstColumnIndex, int lastRowIndex,
int lastColumnIndex, SheetRangeEvaluator evaluator) {
- super(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex);
+ super(evaluator, firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex);
_evaluator = evaluator;
}
- public ValueEval getRelativeValue(int relativeRowIndex, int relativeColumnIndex) {
-
+ public ValueEval getRelativeValue(int relativeRowIndex, int relativeColumnIndex) {
+ return getRelativeValue(getFirstSheetIndex(), relativeRowIndex, relativeColumnIndex);
+ }
+ public ValueEval getRelativeValue(int sheetIndex, int relativeRowIndex, int relativeColumnIndex) {
int rowIx = (relativeRowIndex + getFirstRow() ) ;
int colIx = (relativeColumnIndex + getFirstColumn() ) ;
- return _evaluator.getEvalForCell(_evaluator.getFirstSheetIndex(), rowIx, colIx);
+ return _evaluator.getEvalForCell(sheetIndex, rowIx, colIx);
}
public AreaEval offset(int relFirstRowIx, int relLastRowIx, int relFirstColIx, int relLastColIx) {
--- /dev/null
+/* ====================================================================
+ 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.ss.formula;
+
+import org.apache.poi.ss.formula.eval.AreaEval;
+import org.apache.poi.ss.formula.eval.ValueEval;
+
+/**
+ * Optional Extension to the likes of {@link AreaEval} and
+ * {@link org.apache.poi.ss.formula.eval.AreaEvalBase},
+ * which allows for looking up 3D (sheet+row+column) evaluations
+ */
+public interface ThreeDEval extends TwoDEval, SheetRange {
+ /**
+ * @param sheetIndex sheet index (zero based)
+ * @param rowIndex relative row index (zero based)
+ * @param columnIndex relative column index (zero based)
+ * @return element at the specified row and column position
+ */
+ ValueEval getValue(int sheetIndex, int rowIndex, int columnIndex);
+}
import org.apache.poi.ss.formula.eval.ValueEval;
/**
- * Common interface of {@link AreaEval} and {@link org.apache.poi.ss.formula.eval.AreaEvalBase}
- *
- * @author Josh Micich
+ * Common interface of {@link AreaEval} and {@link org.apache.poi.ss.formula.eval.AreaEvalBase},
+ * for 2D (row+column) evaluations
*/
public interface TwoDEval extends ValueEval {
package org.apache.poi.ss.formula.eval;
+import org.apache.poi.ss.formula.ThreeDEval;
import org.apache.poi.ss.formula.TwoDEval;
/**
- * @author Amol S. Deshmukh < amolweb at ya hoo dot com >
- *
+ * Evaluation of 2D (Row+Column) and 3D (Sheet+Row+Column) areas
*/
-public interface AreaEval extends TwoDEval {
+public interface AreaEval extends TwoDEval, ThreeDEval {
/**
* returns the 0-based index of the first row in
package org.apache.poi.ss.formula.eval;
+import org.apache.poi.ss.formula.SheetRange;
import org.apache.poi.ss.formula.ptg.AreaI;
/**
*/
public abstract class AreaEvalBase implements AreaEval {
+ private final int _firstSheet;
private final int _firstColumn;
private final int _firstRow;
+ private final int _lastSheet;
private final int _lastColumn;
private final int _lastRow;
private final int _nColumns;
private final int _nRows;
- protected AreaEvalBase(int firstRow, int firstColumn, int lastRow, int lastColumn) {
+ protected AreaEvalBase(SheetRange sheets, int firstRow, int firstColumn, int lastRow, int lastColumn) {
_firstColumn = firstColumn;
_firstRow = firstRow;
_lastColumn = lastColumn;
_nColumns = _lastColumn - _firstColumn + 1;
_nRows = _lastRow - _firstRow + 1;
+
+ if (sheets != null) {
+ _firstSheet = sheets.getFirstSheetIndex();
+ _lastSheet = sheets.getLastSheetIndex();
+ } else {
+ _firstSheet = -1;
+ _lastSheet = -1;
+ }
}
+ protected AreaEvalBase(int firstRow, int firstColumn, int lastRow, int lastColumn) {
+ this(null, firstRow, firstColumn, lastRow, lastColumn);
+ }
protected AreaEvalBase(AreaI ptg) {
- _firstRow = ptg.getFirstRow();
- _firstColumn = ptg.getFirstColumn();
- _lastRow = ptg.getLastRow();
- _lastColumn = ptg.getLastColumn();
-
- _nColumns = _lastColumn - _firstColumn + 1;
- _nRows = _lastRow - _firstRow + 1;
+ this(ptg, null);
+ }
+ protected AreaEvalBase(AreaI ptg, SheetRange sheets) {
+ this(sheets, ptg.getFirstRow(), ptg.getFirstColumn(), ptg.getLastRow(), ptg.getLastColumn());
}
public final int getFirstColumn() {
public final int getLastRow() {
return _lastRow;
}
- public final ValueEval getAbsoluteValue(int row, int col) {
+
+ public int getFirstSheetIndex() {
+ return _firstSheet;
+ }
+ public int getLastSheetIndex() {
+ return _lastSheet;
+ }
+
+ public final ValueEval getAbsoluteValue(int row, int col) {
int rowOffsetIx = row - _firstRow;
int colOffsetIx = col - _firstColumn;
public final ValueEval getValue(int row, int col) {
return getRelativeValue(row, col);
}
+ public final ValueEval getValue(int sheetIndex, int row, int col) {
+ return getRelativeValue(sheetIndex, row, col);
+ }
public abstract ValueEval getRelativeValue(int relativeRowIndex, int relativeColumnIndex);
+ public abstract ValueEval getRelativeValue(int sheetIndex, int relativeRowIndex, int relativeColumnIndex);
public int getWidth() {
return _lastColumn-_firstColumn+1;