123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /* ====================================================================
- 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.AreaEvalBase;
- import org.apache.poi.ss.formula.eval.BlankEval;
- import org.apache.poi.ss.formula.eval.ValueEval;
- import org.apache.poi.ss.formula.ptg.AreaI;
- import org.apache.poi.ss.formula.ptg.AreaI.OffsetArea;
- import org.apache.poi.ss.util.CellReference;
-
- /**
- * @author Robert Hulbert
- * Provides holding structure for temporary values in arrays during the evaluation process.
- * As such, Row/Column references do not actually correspond to data in the file.
- */
-
- public final class CacheAreaEval extends AreaEvalBase {
-
- /* Value Containter */
- private final ValueEval[] _values;
-
- public CacheAreaEval(AreaI ptg, ValueEval[] values) {
- super(ptg);
- _values = values;
- }
-
- public CacheAreaEval(int firstRow, int firstColumn, int lastRow, int lastColumn, ValueEval[] values) {
- super(firstRow, firstColumn, lastRow, lastColumn);
- _values = values;
- }
-
- public ValueEval getRelativeValue(int relativeRowIndex, int relativeColumnIndex) {
- return getRelativeValue(-1, relativeRowIndex, relativeColumnIndex);
- }
-
- public ValueEval getRelativeValue(int sheetIndex, int relativeRowIndex, int relativeColumnIndex) {
- int oneDimensionalIndex = relativeRowIndex * getWidth() + relativeColumnIndex;
- return _values[oneDimensionalIndex];
- }
-
- public AreaEval offset(int relFirstRowIx, int relLastRowIx,
- int relFirstColIx, int relLastColIx) {
-
- AreaI area = new OffsetArea(getFirstRow(), getFirstColumn(),
- relFirstRowIx, relLastRowIx, relFirstColIx, relLastColIx);
-
- int height = area.getLastRow() - area.getFirstRow() + 1;
- int width = area.getLastColumn() - area.getFirstColumn() + 1;
-
- ValueEval[] newVals = new ValueEval[height * width];
-
- int startRow = area.getFirstRow() - getFirstRow();
- int startCol = area.getFirstColumn() - getFirstColumn();
-
- for (int j = 0; j < height; j++) {
- for (int i = 0; i < width; i++) {
- ValueEval temp;
-
- /* CacheAreaEval is only temporary value representation, does not equal sheet selection
- * so any attempts going beyond the selection results in BlankEval
- */
- if (startRow + j > getLastRow() || startCol + i > getLastColumn()) {
- temp = BlankEval.instance;
- }
- else {
- temp = _values[(startRow + j) * getWidth() + (startCol + i)];
- }
- newVals[j * width + i] = temp;
- }
- }
-
- return new CacheAreaEval(area, newVals);
- }
-
- public TwoDEval getRow(int rowIndex) {
- if (rowIndex >= getHeight()) {
- throw new IllegalArgumentException("Invalid rowIndex " + rowIndex
- + ". Allowable range is (0.." + getHeight() + ").");
- }
- int absRowIndex = getFirstRow() + rowIndex;
- ValueEval[] values = new ValueEval[getWidth()];
-
- for (int i = 0; i < values.length; i++) {
- values[i] = getRelativeValue(rowIndex, i);
- }
- return new CacheAreaEval(absRowIndex, getFirstColumn() , absRowIndex, getLastColumn(), values);
- }
-
- public TwoDEval getColumn(int columnIndex) {
- if (columnIndex >= getWidth()) {
- throw new IllegalArgumentException("Invalid columnIndex " + columnIndex
- + ". Allowable range is (0.." + getWidth() + ").");
- }
- int absColIndex = getFirstColumn() + columnIndex;
- ValueEval[] values = new ValueEval[getHeight()];
-
- for (int i = 0; i < values.length; i++) {
- values[i] = getRelativeValue(i, columnIndex);
- }
-
- return new CacheAreaEval(getFirstRow(), absColIndex, getLastRow(), absColIndex, values);
- }
-
- public String toString() {
- CellReference crA = new CellReference(getFirstRow(), getFirstColumn());
- CellReference crB = new CellReference(getLastRow(), getLastColumn());
- return getClass().getName() + "[" +
- crA.formatAsString() +
- ':' +
- crB.formatAsString() +
- "]";
- }
- }
|