moved ptg classes to org.apache.poi.ss.formula.ptg
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1038688 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
0c12a76991
commit
82aa0c6f09
@ -17,8 +17,8 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.NamePtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.NamePtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
/**
|
||||
* Abstracts a name record for formula evaluation.<br/>
|
||||
*
|
||||
|
@ -17,9 +17,9 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.NamePtg;
|
||||
import org.apache.poi.hssf.record.formula.NameXPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.NamePtg;
|
||||
import org.apache.poi.ss.formula.ptg.NameXPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
|
||||
/**
|
||||
* Abstracts a workbook for the purpose of formula evaluation.<br/>
|
||||
|
@ -18,7 +18,7 @@
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
/**
|
||||
* Should be implemented by any {@link org.apache.poi.hssf.record.formula.Ptg} subclass that needs has an extern sheet index <br/>
|
||||
* Should be implemented by any {@link org.apache.poi.ss.formula.ptg.Ptg} subclass that needs has an extern sheet index <br/>
|
||||
*
|
||||
* For POI internal use only
|
||||
*
|
||||
|
@ -19,10 +19,10 @@ package org.apache.poi.ss.formula;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.ExpPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.hssf.record.formula.TblPtg;
|
||||
import org.apache.poi.hssf.util.CellReference;
|
||||
import org.apache.poi.ss.formula.ptg.ExpPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.TblPtg;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
import org.apache.poi.util.LittleEndianByteArrayInputStream;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
|
@ -21,8 +21,8 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.poi.hssf.record.constant.ErrorConstant;
|
||||
import org.apache.poi.hssf.record.formula.*;
|
||||
import org.apache.poi.ss.formula.constant.ErrorConstant;
|
||||
import org.apache.poi.ss.formula.ptg.*;
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadata;
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadataRegistry;
|
||||
import org.apache.poi.ss.usermodel.ErrorConstants;
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.NameXPtg;
|
||||
import org.apache.poi.ss.formula.ptg.NameXPtg;
|
||||
import org.apache.poi.ss.SpreadsheetVersion;
|
||||
|
||||
/**
|
||||
|
@ -19,13 +19,13 @@ package org.apache.poi.ss.formula;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.AttrPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemAreaPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemErrPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemFuncPtg;
|
||||
import org.apache.poi.hssf.record.formula.OperationPtg;
|
||||
import org.apache.poi.hssf.record.formula.ParenthesisPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.AttrPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemAreaPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemErrPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemFuncPtg;
|
||||
import org.apache.poi.ss.formula.ptg.OperationPtg;
|
||||
import org.apache.poi.ss.formula.ptg.ParenthesisPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
|
||||
/**
|
||||
* Common logic for rendering formulas.<br/>
|
||||
|
@ -17,8 +17,8 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.NamePtg;
|
||||
import org.apache.poi.hssf.record.formula.NameXPtg;
|
||||
import org.apache.poi.ss.formula.ptg.NamePtg;
|
||||
import org.apache.poi.ss.formula.ptg.NameXPtg;
|
||||
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
|
||||
|
||||
/**
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.*;
|
||||
import org.apache.poi.ss.formula.ptg.*;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -22,7 +22,7 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.poi.hssf.util.CellReference;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
|
||||
/**
|
||||
* Optimisation - compacts many blank cell references used by a single formula.
|
||||
|
@ -17,12 +17,12 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.AreaI;
|
||||
import org.apache.poi.hssf.record.formula.AreaI.OffsetArea;
|
||||
import org.apache.poi.ss.formula.ptg.AreaI;
|
||||
import org.apache.poi.ss.formula.ptg.AreaI.OffsetArea;
|
||||
import org.apache.poi.ss.formula.eval.AreaEval;
|
||||
import org.apache.poi.ss.formula.eval.AreaEvalBase;
|
||||
import org.apache.poi.ss.formula.eval.ValueEval;
|
||||
import org.apache.poi.hssf.util.CellReference;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -17,12 +17,12 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.AreaI;
|
||||
import org.apache.poi.hssf.record.formula.AreaI.OffsetArea;
|
||||
import org.apache.poi.ss.formula.ptg.AreaI;
|
||||
import org.apache.poi.ss.formula.ptg.AreaI.OffsetArea;
|
||||
import org.apache.poi.ss.formula.eval.AreaEval;
|
||||
import org.apache.poi.ss.formula.eval.RefEvalBase;
|
||||
import org.apache.poi.ss.formula.eval.ValueEval;
|
||||
import org.apache.poi.hssf.util.CellReference;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -17,16 +17,16 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
|
||||
import org.apache.poi.hssf.record.formula.AttrPtg;
|
||||
import org.apache.poi.hssf.record.formula.ControlPtg;
|
||||
import org.apache.poi.hssf.record.formula.FuncVarPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemAreaPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemFuncPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.hssf.record.formula.RangePtg;
|
||||
import org.apache.poi.hssf.record.formula.UnionPtg;
|
||||
import org.apache.poi.hssf.record.formula.ValueOperatorPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AbstractFunctionPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AttrPtg;
|
||||
import org.apache.poi.ss.formula.ptg.ControlPtg;
|
||||
import org.apache.poi.ss.formula.ptg.FuncVarPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemAreaPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemFuncPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.RangePtg;
|
||||
import org.apache.poi.ss.formula.ptg.UnionPtg;
|
||||
import org.apache.poi.ss.formula.ptg.ValueOperatorPtg;
|
||||
|
||||
/**
|
||||
* This class performs 'operand class' transformation. Non-base tokens are classified into three
|
||||
|
@ -17,10 +17,10 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.Area3DPtg;
|
||||
import org.apache.poi.hssf.record.formula.NameXPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.hssf.record.formula.Ref3DPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Area3DPtg;
|
||||
import org.apache.poi.ss.formula.ptg.NameXPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.Ref3DPtg;
|
||||
import org.apache.poi.ss.formula.eval.*;
|
||||
import org.apache.poi.ss.formula.functions.FreeRefFunction;
|
||||
import org.apache.poi.ss.SpreadsheetVersion;
|
||||
|
@ -22,25 +22,25 @@ import java.lang.reflect.Modifier;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
|
||||
import org.apache.poi.hssf.record.formula.AddPtg;
|
||||
import org.apache.poi.hssf.record.formula.ConcatPtg;
|
||||
import org.apache.poi.hssf.record.formula.DividePtg;
|
||||
import org.apache.poi.hssf.record.formula.EqualPtg;
|
||||
import org.apache.poi.hssf.record.formula.GreaterEqualPtg;
|
||||
import org.apache.poi.hssf.record.formula.GreaterThanPtg;
|
||||
import org.apache.poi.hssf.record.formula.IntersectionPtg;
|
||||
import org.apache.poi.hssf.record.formula.LessEqualPtg;
|
||||
import org.apache.poi.hssf.record.formula.LessThanPtg;
|
||||
import org.apache.poi.hssf.record.formula.MultiplyPtg;
|
||||
import org.apache.poi.hssf.record.formula.NotEqualPtg;
|
||||
import org.apache.poi.hssf.record.formula.OperationPtg;
|
||||
import org.apache.poi.hssf.record.formula.PercentPtg;
|
||||
import org.apache.poi.hssf.record.formula.PowerPtg;
|
||||
import org.apache.poi.hssf.record.formula.RangePtg;
|
||||
import org.apache.poi.hssf.record.formula.SubtractPtg;
|
||||
import org.apache.poi.hssf.record.formula.UnaryMinusPtg;
|
||||
import org.apache.poi.hssf.record.formula.UnaryPlusPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AbstractFunctionPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AddPtg;
|
||||
import org.apache.poi.ss.formula.ptg.ConcatPtg;
|
||||
import org.apache.poi.ss.formula.ptg.DividePtg;
|
||||
import org.apache.poi.ss.formula.ptg.EqualPtg;
|
||||
import org.apache.poi.ss.formula.ptg.GreaterEqualPtg;
|
||||
import org.apache.poi.ss.formula.ptg.GreaterThanPtg;
|
||||
import org.apache.poi.ss.formula.ptg.IntersectionPtg;
|
||||
import org.apache.poi.ss.formula.ptg.LessEqualPtg;
|
||||
import org.apache.poi.ss.formula.ptg.LessThanPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MultiplyPtg;
|
||||
import org.apache.poi.ss.formula.ptg.NotEqualPtg;
|
||||
import org.apache.poi.ss.formula.ptg.OperationPtg;
|
||||
import org.apache.poi.ss.formula.ptg.PercentPtg;
|
||||
import org.apache.poi.ss.formula.ptg.PowerPtg;
|
||||
import org.apache.poi.ss.formula.ptg.RangePtg;
|
||||
import org.apache.poi.ss.formula.ptg.SubtractPtg;
|
||||
import org.apache.poi.ss.formula.ptg.UnaryMinusPtg;
|
||||
import org.apache.poi.ss.formula.ptg.UnaryPlusPtg;
|
||||
import org.apache.poi.ss.formula.eval.ConcatEval;
|
||||
import org.apache.poi.ss.formula.eval.FunctionEval;
|
||||
import org.apache.poi.ss.formula.eval.IntersectionEval;
|
||||
|
@ -17,12 +17,12 @@
|
||||
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.ArrayPtg;
|
||||
import org.apache.poi.hssf.record.formula.AttrPtg;
|
||||
import org.apache.poi.hssf.record.formula.FuncVarPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemAreaPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemFuncPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.ArrayPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AttrPtg;
|
||||
import org.apache.poi.ss.formula.ptg.FuncVarPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemAreaPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemFuncPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadataRegistry;
|
||||
/**
|
||||
* Represents a syntactic element from a formula by encapsulating the corresponding <tt>Ptg</tt>
|
||||
|
@ -16,7 +16,7 @@
|
||||
==================================================================== */
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.*;
|
||||
import org.apache.poi.ss.formula.ptg.*;
|
||||
import org.apache.poi.ss.SpreadsheetVersion;
|
||||
|
||||
/**
|
||||
@ -34,7 +34,7 @@ public class SharedFormula {
|
||||
|
||||
/**
|
||||
* Creates a non shared formula from the shared formula counterpart, i.e.
|
||||
* Converts the shared formula into the equivalent {@link org.apache.poi.hssf.record.formula.Ptg} array that it would have,
|
||||
* Converts the shared formula into the equivalent {@link org.apache.poi.ss.formula.ptg.Ptg} array that it would have,
|
||||
* were it not shared.
|
||||
*
|
||||
* @param ptgs parsed tokens of the shared formula
|
||||
|
@ -18,7 +18,7 @@
|
||||
package org.apache.poi.ss.formula;
|
||||
|
||||
/**
|
||||
* Should be implemented by any {@link org.apache.poi.hssf.record.formula.Ptg} subclass that needs a workbook to render its formula.
|
||||
* Should be implemented by any {@link org.apache.poi.ss.formula.ptg.Ptg} subclass that needs a workbook to render its formula.
|
||||
* <br/>
|
||||
*
|
||||
* For POI internal use only
|
||||
|
@ -21,33 +21,33 @@ import java.util.IdentityHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Stack;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.Area3DPtg;
|
||||
import org.apache.poi.hssf.record.formula.AreaErrPtg;
|
||||
import org.apache.poi.hssf.record.formula.AreaPtg;
|
||||
import org.apache.poi.hssf.record.formula.AttrPtg;
|
||||
import org.apache.poi.hssf.record.formula.BoolPtg;
|
||||
import org.apache.poi.hssf.record.formula.ControlPtg;
|
||||
import org.apache.poi.hssf.record.formula.DeletedArea3DPtg;
|
||||
import org.apache.poi.hssf.record.formula.DeletedRef3DPtg;
|
||||
import org.apache.poi.hssf.record.formula.ErrPtg;
|
||||
import org.apache.poi.hssf.record.formula.ExpPtg;
|
||||
import org.apache.poi.hssf.record.formula.FuncVarPtg;
|
||||
import org.apache.poi.hssf.record.formula.IntPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemAreaPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemErrPtg;
|
||||
import org.apache.poi.hssf.record.formula.MemFuncPtg;
|
||||
import org.apache.poi.hssf.record.formula.MissingArgPtg;
|
||||
import org.apache.poi.hssf.record.formula.NamePtg;
|
||||
import org.apache.poi.hssf.record.formula.NameXPtg;
|
||||
import org.apache.poi.hssf.record.formula.NumberPtg;
|
||||
import org.apache.poi.hssf.record.formula.OperationPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.hssf.record.formula.Ref3DPtg;
|
||||
import org.apache.poi.hssf.record.formula.RefErrorPtg;
|
||||
import org.apache.poi.hssf.record.formula.RefPtg;
|
||||
import org.apache.poi.hssf.record.formula.StringPtg;
|
||||
import org.apache.poi.hssf.record.formula.UnionPtg;
|
||||
import org.apache.poi.hssf.record.formula.UnknownPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Area3DPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AreaErrPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AreaPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AttrPtg;
|
||||
import org.apache.poi.ss.formula.ptg.BoolPtg;
|
||||
import org.apache.poi.ss.formula.ptg.ControlPtg;
|
||||
import org.apache.poi.ss.formula.ptg.DeletedArea3DPtg;
|
||||
import org.apache.poi.ss.formula.ptg.DeletedRef3DPtg;
|
||||
import org.apache.poi.ss.formula.ptg.ErrPtg;
|
||||
import org.apache.poi.ss.formula.ptg.ExpPtg;
|
||||
import org.apache.poi.ss.formula.ptg.FuncVarPtg;
|
||||
import org.apache.poi.ss.formula.ptg.IntPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemAreaPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemErrPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MemFuncPtg;
|
||||
import org.apache.poi.ss.formula.ptg.MissingArgPtg;
|
||||
import org.apache.poi.ss.formula.ptg.NamePtg;
|
||||
import org.apache.poi.ss.formula.ptg.NameXPtg;
|
||||
import org.apache.poi.ss.formula.ptg.NumberPtg;
|
||||
import org.apache.poi.ss.formula.ptg.OperationPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.Ref3DPtg;
|
||||
import org.apache.poi.ss.formula.ptg.RefErrorPtg;
|
||||
import org.apache.poi.ss.formula.ptg.RefPtg;
|
||||
import org.apache.poi.ss.formula.ptg.StringPtg;
|
||||
import org.apache.poi.ss.formula.ptg.UnionPtg;
|
||||
import org.apache.poi.ss.formula.ptg.UnknownPtg;
|
||||
import org.apache.poi.ss.formula.eval.BlankEval;
|
||||
import org.apache.poi.ss.formula.eval.BoolEval;
|
||||
import org.apache.poi.ss.formula.eval.ErrorEval;
|
||||
@ -63,7 +63,7 @@ import org.apache.poi.ss.formula.functions.FreeRefFunction;
|
||||
import org.apache.poi.ss.formula.functions.IfFunc;
|
||||
import org.apache.poi.ss.formula.udf.UDFFinder;
|
||||
import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
|
||||
import org.apache.poi.hssf.util.CellReference;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.WorkbookNotFoundException;
|
||||
import org.apache.poi.ss.formula.eval.NotImplementedException;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
|
@ -0,0 +1,157 @@
|
||||
/* ====================================================================
|
||||
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.constant;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
import org.apache.poi.util.StringUtil;
|
||||
|
||||
/**
|
||||
* To support Constant Values (2.5.7) as required by the CRN record.
|
||||
* This class is also used for two dimensional arrays which are encoded by
|
||||
* EXTERNALNAME (5.39) records and Array tokens.<p/>
|
||||
*
|
||||
* @author Josh Micich
|
||||
*/
|
||||
public final class ConstantValueParser {
|
||||
// note - these (non-combinable) enum values are sparse.
|
||||
private static final int TYPE_EMPTY = 0;
|
||||
private static final int TYPE_NUMBER = 1;
|
||||
private static final int TYPE_STRING = 2;
|
||||
private static final int TYPE_BOOLEAN = 4;
|
||||
private static final int TYPE_ERROR_CODE = 16; // TODO - update OOO document to include this value
|
||||
|
||||
private static final int TRUE_ENCODING = 1;
|
||||
private static final int FALSE_ENCODING = 0;
|
||||
|
||||
// TODO - is this the best way to represent 'EMPTY'?
|
||||
private static final Object EMPTY_REPRESENTATION = null;
|
||||
|
||||
private ConstantValueParser() {
|
||||
// no instances of this class
|
||||
}
|
||||
|
||||
public static Object[] parse(LittleEndianInput in, int nValues) {
|
||||
Object[] result = new Object[nValues];
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
result[i] = readAConstantValue(in);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static Object readAConstantValue(LittleEndianInput in) {
|
||||
byte grbit = in.readByte();
|
||||
switch(grbit) {
|
||||
case TYPE_EMPTY:
|
||||
in.readLong(); // 8 byte 'not used' field
|
||||
return EMPTY_REPRESENTATION;
|
||||
case TYPE_NUMBER:
|
||||
return new Double(in.readDouble());
|
||||
case TYPE_STRING:
|
||||
return StringUtil.readUnicodeString(in);
|
||||
case TYPE_BOOLEAN:
|
||||
return readBoolean(in);
|
||||
case TYPE_ERROR_CODE:
|
||||
int errCode = in.readUShort();
|
||||
// next 6 bytes are unused
|
||||
in.readUShort();
|
||||
in.readInt();
|
||||
return ErrorConstant.valueOf(errCode);
|
||||
}
|
||||
throw new RuntimeException("Unknown grbit value (" + grbit + ")");
|
||||
}
|
||||
|
||||
private static Object readBoolean(LittleEndianInput in) {
|
||||
byte val = (byte)in.readLong(); // 7 bytes 'not used'
|
||||
switch(val) {
|
||||
case FALSE_ENCODING:
|
||||
return Boolean.FALSE;
|
||||
case TRUE_ENCODING:
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
// Don't tolerate unusual boolean encoded values (unless it becomes evident that they occur)
|
||||
throw new RuntimeException("unexpected boolean encoding (" + val + ")");
|
||||
}
|
||||
|
||||
public static int getEncodedSize(Object[] values) {
|
||||
// start with one byte 'type' code for each value
|
||||
int result = values.length * 1;
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
result += getEncodedSize(values[i]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return encoded size without the 'type' code byte
|
||||
*/
|
||||
private static int getEncodedSize(Object object) {
|
||||
if(object == EMPTY_REPRESENTATION) {
|
||||
return 8;
|
||||
}
|
||||
Class cls = object.getClass();
|
||||
|
||||
if(cls == Boolean.class || cls == Double.class || cls == ErrorConstant.class) {
|
||||
return 8;
|
||||
}
|
||||
String strVal = (String)object;
|
||||
return StringUtil.getEncodedSize(strVal);
|
||||
}
|
||||
|
||||
public static void encode(LittleEndianOutput out, Object[] values) {
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
encodeSingleValue(out, values[i]);
|
||||
}
|
||||
}
|
||||
|
||||
private static void encodeSingleValue(LittleEndianOutput out, Object value) {
|
||||
if (value == EMPTY_REPRESENTATION) {
|
||||
out.writeByte(TYPE_EMPTY);
|
||||
out.writeLong(0L);
|
||||
return;
|
||||
}
|
||||
if (value instanceof Boolean) {
|
||||
Boolean bVal = ((Boolean)value);
|
||||
out.writeByte(TYPE_BOOLEAN);
|
||||
long longVal = bVal.booleanValue() ? 1L : 0L;
|
||||
out.writeLong(longVal);
|
||||
return;
|
||||
}
|
||||
if (value instanceof Double) {
|
||||
Double dVal = (Double) value;
|
||||
out.writeByte(TYPE_NUMBER);
|
||||
out.writeDouble(dVal.doubleValue());
|
||||
return;
|
||||
}
|
||||
if (value instanceof String) {
|
||||
String val = (String) value;
|
||||
out.writeByte(TYPE_STRING);
|
||||
StringUtil.writeUnicodeString(out, val);
|
||||
return;
|
||||
}
|
||||
if (value instanceof ErrorConstant) {
|
||||
ErrorConstant ecVal = (ErrorConstant) value;
|
||||
out.writeByte(TYPE_ERROR_CODE);
|
||||
long longVal = ecVal.getErrorCode();
|
||||
out.writeLong(longVal);
|
||||
return;
|
||||
}
|
||||
|
||||
throw new IllegalStateException("Unexpected value type (" + value.getClass().getName() + "'");
|
||||
}
|
||||
}
|
@ -0,0 +1,77 @@
|
||||
/* ====================================================================
|
||||
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.constant;
|
||||
|
||||
import org.apache.poi.ss.usermodel.ErrorConstants;
|
||||
/**
|
||||
* Represents a constant error code value as encoded in a constant values array. <p/>
|
||||
*
|
||||
* This class is a type-safe wrapper for a 16-bit int value performing a similar job to
|
||||
* <tt>ErrorEval</tt>.
|
||||
*
|
||||
* @author Josh Micich
|
||||
*/
|
||||
public class ErrorConstant {
|
||||
// convenient access to name space
|
||||
private static final ErrorConstants EC = null;
|
||||
|
||||
private static final ErrorConstant NULL = new ErrorConstant(EC.ERROR_NULL);
|
||||
private static final ErrorConstant DIV_0 = new ErrorConstant(EC.ERROR_DIV_0);
|
||||
private static final ErrorConstant VALUE = new ErrorConstant(EC.ERROR_VALUE);
|
||||
private static final ErrorConstant REF = new ErrorConstant(EC.ERROR_REF);
|
||||
private static final ErrorConstant NAME = new ErrorConstant(EC.ERROR_NAME);
|
||||
private static final ErrorConstant NUM = new ErrorConstant(EC.ERROR_NUM);
|
||||
private static final ErrorConstant NA = new ErrorConstant(EC.ERROR_NA);
|
||||
|
||||
private final int _errorCode;
|
||||
|
||||
private ErrorConstant(int errorCode) {
|
||||
_errorCode = errorCode;
|
||||
}
|
||||
|
||||
public int getErrorCode() {
|
||||
return _errorCode;
|
||||
}
|
||||
public String getText() {
|
||||
if(ErrorConstants.isValidCode(_errorCode)) {
|
||||
return ErrorConstants.getText(_errorCode);
|
||||
}
|
||||
return "unknown error code (" + _errorCode + ")";
|
||||
}
|
||||
|
||||
public static ErrorConstant valueOf(int errorCode) {
|
||||
switch (errorCode) {
|
||||
case ErrorConstants.ERROR_NULL: return NULL;
|
||||
case ErrorConstants.ERROR_DIV_0: return DIV_0;
|
||||
case ErrorConstants.ERROR_VALUE: return VALUE;
|
||||
case ErrorConstants.ERROR_REF: return REF;
|
||||
case ErrorConstants.ERROR_NAME: return NAME;
|
||||
case ErrorConstants.ERROR_NUM: return NUM;
|
||||
case ErrorConstants.ERROR_NA: return NA;
|
||||
}
|
||||
System.err.println("Warning - unexpected error code (" + errorCode + ")");
|
||||
return new ErrorConstant(errorCode);
|
||||
}
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer(64);
|
||||
sb.append(getClass().getName()).append(" [");
|
||||
sb.append(getText());
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
@ -17,7 +17,7 @@
|
||||
|
||||
package org.apache.poi.ss.formula.eval;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.AreaI;
|
||||
import org.apache.poi.ss.formula.ptg.AreaI;
|
||||
|
||||
/**
|
||||
* @author Josh Micich
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
package org.apache.poi.ss.formula.eval;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.NameXPtg;
|
||||
import org.apache.poi.ss.formula.ptg.NameXPtg;
|
||||
|
||||
/**
|
||||
* @author Josh Micich
|
||||
|
@ -20,9 +20,9 @@
|
||||
*/
|
||||
package org.apache.poi.ss.formula.eval;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.IntPtg;
|
||||
import org.apache.poi.hssf.record.formula.NumberPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.IntPtg;
|
||||
import org.apache.poi.ss.formula.ptg.NumberPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.util.NumberToTextConverter;
|
||||
|
||||
/**
|
||||
|
@ -17,8 +17,8 @@
|
||||
|
||||
package org.apache.poi.ss.formula.eval;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.hssf.record.formula.StringPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.StringPtg;
|
||||
|
||||
/**
|
||||
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
|
||||
|
@ -20,9 +20,9 @@ package org.apache.poi.ss.formula.eval.forked;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.NamePtg;
|
||||
import org.apache.poi.hssf.record.formula.NameXPtg;
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.NamePtg;
|
||||
import org.apache.poi.ss.formula.ptg.NameXPtg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.formula.EvaluationCell;
|
||||
import org.apache.poi.ss.formula.EvaluationName;
|
||||
import org.apache.poi.ss.formula.EvaluationSheet;
|
||||
|
@ -27,7 +27,7 @@ import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.poi.hssf.record.formula.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
|
||||
/**
|
||||
* Converts the text meta-data file into a <tt>FunctionMetadataRegistry</tt>
|
||||
|
164
src/java/org/apache/poi/ss/formula/ptg/AbstractFunctionPtg.java
Normal file
164
src/java/org/apache/poi/ss/formula/ptg/AbstractFunctionPtg.java
Normal file
@ -0,0 +1,164 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadata;
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadataRegistry;
|
||||
|
||||
|
||||
/**
|
||||
* This class provides the base functionality for Excel sheet functions
|
||||
* There are two kinds of function Ptgs - tFunc and tFuncVar
|
||||
* Therefore, this class will have ONLY two subclasses
|
||||
* @author Avik Sengupta
|
||||
* @author Andrew C. Oliver (acoliver at apache dot org)
|
||||
*/
|
||||
public abstract class AbstractFunctionPtg extends OperationPtg {
|
||||
|
||||
/**
|
||||
* The name of the IF function (i.e. "IF"). Extracted as a constant for clarity.
|
||||
*/
|
||||
public static final String FUNCTION_NAME_IF = "IF";
|
||||
/** All external functions have function index 255 */
|
||||
private static final short FUNCTION_INDEX_EXTERNAL = 255;
|
||||
|
||||
private final byte returnClass;
|
||||
private final byte[] paramClass;
|
||||
|
||||
private final byte _numberOfArgs;
|
||||
private final short _functionIndex;
|
||||
|
||||
protected AbstractFunctionPtg(int functionIndex, int pReturnClass, byte[] paramTypes, int nParams) {
|
||||
_numberOfArgs = (byte) nParams;
|
||||
_functionIndex = (short) functionIndex;
|
||||
returnClass = (byte) pReturnClass;
|
||||
paramClass = paramTypes;
|
||||
}
|
||||
public final boolean isBaseToken() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
StringBuilder sb = new StringBuilder(64);
|
||||
sb.append(getClass().getName()).append(" [");
|
||||
sb.append(lookupName(_functionIndex));
|
||||
sb.append(" nArgs=").append(_numberOfArgs);
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public final short getFunctionIndex() {
|
||||
return _functionIndex;
|
||||
}
|
||||
public final int getNumberOfOperands() {
|
||||
return _numberOfArgs;
|
||||
}
|
||||
|
||||
public final String getName() {
|
||||
return lookupName(_functionIndex);
|
||||
}
|
||||
/**
|
||||
* external functions get some special processing
|
||||
* @return <code>true</code> if this is an external function
|
||||
*/
|
||||
public final boolean isExternalFunction() {
|
||||
return _functionIndex == FUNCTION_INDEX_EXTERNAL;
|
||||
}
|
||||
|
||||
public final String toFormulaString() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuilder buf = new StringBuilder();
|
||||
|
||||
if(isExternalFunction()) {
|
||||
buf.append(operands[0]); // first operand is actually the function name
|
||||
appendArgs(buf, 1, operands);
|
||||
} else {
|
||||
buf.append(getName());
|
||||
appendArgs(buf, 0, operands);
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private static void appendArgs(StringBuilder buf, int firstArgIx, String[] operands) {
|
||||
buf.append('(');
|
||||
for (int i=firstArgIx;i<operands.length;i++) {
|
||||
if (i>firstArgIx) {
|
||||
buf.append(',');
|
||||
}
|
||||
buf.append(operands[i]);
|
||||
}
|
||||
buf.append(")");
|
||||
}
|
||||
|
||||
public abstract int getSize();
|
||||
|
||||
|
||||
/**
|
||||
* Used to detect whether a function name found in a formula is one of the standard excel functions
|
||||
* <p>
|
||||
* The name matching is case insensitive.
|
||||
* @return <code>true</code> if the name specifies a standard worksheet function,
|
||||
* <code>false</code> if the name should be assumed to be an external function.
|
||||
*/
|
||||
public static final boolean isBuiltInFunctionName(String name) {
|
||||
short ix = FunctionMetadataRegistry.lookupIndexByName(name.toUpperCase());
|
||||
return ix >= 0;
|
||||
}
|
||||
|
||||
protected final String lookupName(short index) {
|
||||
if(index == FunctionMetadataRegistry.FUNCTION_INDEX_EXTERNAL) {
|
||||
return "#external#";
|
||||
}
|
||||
FunctionMetadata fm = FunctionMetadataRegistry.getFunctionByIndex(index);
|
||||
if(fm == null) {
|
||||
throw new RuntimeException("bad function index (" + index + ")");
|
||||
}
|
||||
return fm.getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves internal function names into function indexes.
|
||||
* <p>
|
||||
* The name matching is case insensitive.
|
||||
* @return the standard worksheet function index if found, otherwise <tt>FUNCTION_INDEX_EXTERNAL</tt>
|
||||
*/
|
||||
protected static short lookupIndex(String name) {
|
||||
short ix = FunctionMetadataRegistry.lookupIndexByName(name.toUpperCase());
|
||||
if (ix < 0) {
|
||||
return FUNCTION_INDEX_EXTERNAL;
|
||||
}
|
||||
return ix;
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return returnClass;
|
||||
}
|
||||
|
||||
public final byte getParameterClass(int index) {
|
||||
if (index >= paramClass.length) {
|
||||
// For var-arg (and other?) functions, the metadata does not list all the parameter
|
||||
// operand classes. In these cases, all extra parameters are assumed to have the
|
||||
// same operand class as the last one specified.
|
||||
return paramClass[paramClass.length - 1];
|
||||
}
|
||||
return paramClass[index];
|
||||
}
|
||||
}
|
54
src/java/org/apache/poi/ss/formula/ptg/AddPtg.java
Normal file
54
src/java/org/apache/poi/ss/formula/ptg/AddPtg.java
Normal file
@ -0,0 +1,54 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Addition operator PTG the "+" binomial operator. If you need more
|
||||
* explanation than that then well...We really can't help you here.
|
||||
* @author Andrew C. Oliver (acoliver@apache.org)
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class AddPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x03;
|
||||
|
||||
private final static String ADD = "+";
|
||||
|
||||
public static final ValueOperatorPtg instance = new AddPtg();
|
||||
|
||||
private AddPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
/** implementation of method from OperationsPtg*/
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append(ADD);
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
64
src/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java
Normal file
64
src/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java
Normal file
@ -0,0 +1,64 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.AreaReference;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Common superclass of 2-D area refs
|
||||
*/
|
||||
public abstract class Area2DPtgBase extends AreaPtgBase {
|
||||
private final static int SIZE = 9;
|
||||
|
||||
protected Area2DPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
|
||||
super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
|
||||
}
|
||||
protected Area2DPtgBase(AreaReference ar) {
|
||||
super(ar);
|
||||
}
|
||||
|
||||
protected Area2DPtgBase(LittleEndianInput in) {
|
||||
readCoordinates(in);
|
||||
}
|
||||
|
||||
protected abstract byte getSid();
|
||||
|
||||
public final void write(LittleEndianOutput out) {
|
||||
out.writeByte(getSid() + getPtgClass());
|
||||
writeCoordinates(out);
|
||||
}
|
||||
|
||||
public final int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public final String toFormulaString() {
|
||||
return formatReferenceAsString();
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append(getClass().getName());
|
||||
sb.append(" [");
|
||||
sb.append(formatReferenceAsString());
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
105
src/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java
Normal file
105
src/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java
Normal file
@ -0,0 +1,105 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.AreaReference;
|
||||
import org.apache.poi.ss.formula.ExternSheetReferenceToken;
|
||||
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
|
||||
import org.apache.poi.ss.formula.WorkbookDependentFormula;
|
||||
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)
|
||||
*/
|
||||
public final class Area3DPtg extends AreaPtgBase implements WorkbookDependentFormula, ExternSheetReferenceToken {
|
||||
public final static byte sid = 0x3b;
|
||||
private final static int SIZE = 11; // 10 + 1 for Ptg
|
||||
|
||||
private int field_1_index_extern_sheet;
|
||||
|
||||
|
||||
public Area3DPtg(String arearef, int externIdx) {
|
||||
super(new AreaReference(arearef));
|
||||
setExternSheetIndex(externIdx);
|
||||
}
|
||||
|
||||
public Area3DPtg(LittleEndianInput in) {
|
||||
field_1_index_extern_sheet = in.readShort();
|
||||
readCoordinates(in);
|
||||
}
|
||||
|
||||
public Area3DPtg(int firstRow, int lastRow, int firstColumn, int lastColumn,
|
||||
boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative,
|
||||
int externalSheetIndex) {
|
||||
super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
|
||||
setExternSheetIndex(externalSheetIndex);
|
||||
}
|
||||
|
||||
public Area3DPtg(AreaReference arearef, int externIdx) {
|
||||
super(arearef);
|
||||
setExternSheetIndex(externIdx);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append(getClass().getName());
|
||||
sb.append(" [");
|
||||
sb.append("sheetIx=").append(getExternSheetIndex());
|
||||
sb.append(" ! ");
|
||||
sb.append(formatReferenceAsString());
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(field_1_index_extern_sheet);
|
||||
writeCoordinates(out);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public int getExternSheetIndex() {
|
||||
return field_1_index_extern_sheet;
|
||||
}
|
||||
|
||||
public void setExternSheetIndex(int index) {
|
||||
field_1_index_extern_sheet = index;
|
||||
}
|
||||
public String format2DRefAsString() {
|
||||
return formatReferenceAsString();
|
||||
}
|
||||
/**
|
||||
* @return text representation of this area reference that can be used in text
|
||||
* formulas. The sheet name will get properly delimited if required.
|
||||
*/
|
||||
public String toFormulaString(FormulaRenderingWorkbook book) {
|
||||
return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, formatReferenceAsString());
|
||||
}
|
||||
public String toFormulaString() {
|
||||
throw new RuntimeException("3D references need a workbook to determine formula text");
|
||||
}
|
||||
}
|
63
src/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java
Normal file
63
src/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java
Normal file
@ -0,0 +1,63 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.usermodel.ErrorConstants;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* AreaErr - handles deleted cell area references.
|
||||
*
|
||||
* @author Daniel Noll (daniel at nuix dot com dot au)
|
||||
*/
|
||||
public final class AreaErrPtg extends OperandPtg {
|
||||
public final static byte sid = 0x2B;
|
||||
private final int unused1;
|
||||
private final int unused2;
|
||||
|
||||
public AreaErrPtg() {
|
||||
unused1 = 0;
|
||||
unused2 = 0;
|
||||
}
|
||||
|
||||
public AreaErrPtg(LittleEndianInput in) {
|
||||
// 8 bytes unused:
|
||||
unused1 = in.readInt();
|
||||
unused2 = in.readInt();
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeInt(unused1);
|
||||
out.writeInt(unused2);
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return ErrorConstants.getText(ErrorConstants.ERROR_REF);
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_REF;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return 9;
|
||||
}
|
||||
}
|
||||
|
75
src/java/org/apache/poi/ss/formula/ptg/AreaI.java
Normal file
75
src/java/org/apache/poi/ss/formula/ptg/AreaI.java
Normal file
@ -0,0 +1,75 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Common interface for AreaPtg and Area3DPtg, and their child classes.
|
||||
*/
|
||||
public interface AreaI {
|
||||
/**
|
||||
* @return the first row in the area
|
||||
*/
|
||||
public int getFirstRow();
|
||||
|
||||
/**
|
||||
* @return last row in the range (x2 in x1,y1-x2,y2)
|
||||
*/
|
||||
public int getLastRow();
|
||||
|
||||
/**
|
||||
* @return the first column number in the area.
|
||||
*/
|
||||
public int getFirstColumn();
|
||||
|
||||
/**
|
||||
* @return lastcolumn in the area
|
||||
*/
|
||||
public int getLastColumn();
|
||||
|
||||
class OffsetArea implements AreaI {
|
||||
|
||||
private final int _firstColumn;
|
||||
private final int _firstRow;
|
||||
private final int _lastColumn;
|
||||
private final int _lastRow;
|
||||
|
||||
public OffsetArea(int baseRow, int baseColumn, int relFirstRowIx, int relLastRowIx,
|
||||
int relFirstColIx, int relLastColIx) {
|
||||
_firstRow = baseRow + Math.min(relFirstRowIx, relLastRowIx);
|
||||
_lastRow = baseRow + Math.max(relFirstRowIx, relLastRowIx);
|
||||
_firstColumn = baseColumn + Math.min(relFirstColIx, relLastColIx);
|
||||
_lastColumn = baseColumn + Math.max(relFirstColIx, relLastColIx);
|
||||
}
|
||||
|
||||
public int getFirstColumn() {
|
||||
return _firstColumn;
|
||||
}
|
||||
|
||||
public int getFirstRow() {
|
||||
return _firstRow;
|
||||
}
|
||||
|
||||
public int getLastColumn() {
|
||||
return _lastColumn;
|
||||
}
|
||||
|
||||
public int getLastRow() {
|
||||
return _lastRow;
|
||||
}
|
||||
}
|
||||
}
|
36
src/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java
Normal file
36
src/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java
Normal file
@ -0,0 +1,36 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
|
||||
/**
|
||||
* Specifies a rectangular area of cells A1:A4 for instance.
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class AreaNPtg extends Area2DPtgBase {
|
||||
public final static short sid = 0x2D;
|
||||
|
||||
public AreaNPtg(LittleEndianInput in) {
|
||||
super(in);
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
}
|
45
src/java/org/apache/poi/ss/formula/ptg/AreaPtg.java
Normal file
45
src/java/org/apache/poi/ss/formula/ptg/AreaPtg.java
Normal file
@ -0,0 +1,45 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.AreaReference;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
|
||||
/**
|
||||
* Specifies a rectangular area of cells A1:A4 for instance.
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class AreaPtg extends Area2DPtgBase {
|
||||
public final static short sid = 0x25;
|
||||
|
||||
public AreaPtg(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
|
||||
super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
|
||||
}
|
||||
public AreaPtg(LittleEndianInput in) {
|
||||
super(in);
|
||||
}
|
||||
public AreaPtg(String arearef) {
|
||||
super(new AreaReference(arearef));
|
||||
}
|
||||
public AreaPtg(AreaReference areaRef) {
|
||||
super(areaRef);
|
||||
}
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
}
|
272
src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java
Normal file
272
src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java
Normal file
@ -0,0 +1,272 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.AreaReference;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.util.BitField;
|
||||
import org.apache.poi.util.BitFieldFactory;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Specifies a rectangular area of cells A1:A4 for instance.
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public abstract class AreaPtgBase extends OperandPtg implements AreaI {
|
||||
/**
|
||||
* TODO - (May-2008) fix subclasses of AreaPtg 'AreaN~' which are used in shared formulas.
|
||||
* see similar comment in ReferencePtg
|
||||
*/
|
||||
protected final RuntimeException notImplemented() {
|
||||
return new RuntimeException("Coding Error: This method should never be called. This ptg should be converted");
|
||||
}
|
||||
|
||||
/** zero based, unsigned 16 bit */
|
||||
private int field_1_first_row;
|
||||
/** zero based, unsigned 16 bit */
|
||||
private int field_2_last_row;
|
||||
/** zero based, unsigned 8 bit */
|
||||
private int field_3_first_column;
|
||||
/** zero based, unsigned 8 bit */
|
||||
private int field_4_last_column;
|
||||
|
||||
private final static BitField rowRelative = BitFieldFactory.getInstance(0x8000);
|
||||
private final static BitField colRelative = BitFieldFactory.getInstance(0x4000);
|
||||
private final static BitField columnMask = BitFieldFactory.getInstance(0x3FFF);
|
||||
|
||||
protected AreaPtgBase() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
protected AreaPtgBase(AreaReference ar) {
|
||||
CellReference firstCell = ar.getFirstCell();
|
||||
CellReference lastCell = ar.getLastCell();
|
||||
setFirstRow(firstCell.getRow());
|
||||
setFirstColumn(firstCell.getCol() == -1 ? 0 : firstCell.getCol());
|
||||
setLastRow(lastCell.getRow());
|
||||
setLastColumn(lastCell.getCol() == -1 ? 0xFF : lastCell.getCol());
|
||||
setFirstColRelative(!firstCell.isColAbsolute());
|
||||
setLastColRelative(!lastCell.isColAbsolute());
|
||||
setFirstRowRelative(!firstCell.isRowAbsolute());
|
||||
setLastRowRelative(!lastCell.isRowAbsolute());
|
||||
}
|
||||
|
||||
protected AreaPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn,
|
||||
boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
|
||||
|
||||
if (lastRow > firstRow) {
|
||||
setFirstRow(firstRow);
|
||||
setLastRow(lastRow);
|
||||
setFirstRowRelative(firstRowRelative);
|
||||
setLastRowRelative(lastRowRelative);
|
||||
} else {
|
||||
setFirstRow(lastRow);
|
||||
setLastRow(firstRow);
|
||||
setFirstRowRelative(lastRowRelative);
|
||||
setLastRowRelative(firstRowRelative);
|
||||
}
|
||||
|
||||
if (lastColumn > firstColumn) {
|
||||
setFirstColumn(firstColumn);
|
||||
setLastColumn(lastColumn);
|
||||
setFirstColRelative(firstColRelative);
|
||||
setLastColRelative(lastColRelative);
|
||||
} else {
|
||||
setFirstColumn(lastColumn);
|
||||
setLastColumn(firstColumn);
|
||||
setFirstColRelative(lastColRelative);
|
||||
setLastColRelative(firstColRelative);
|
||||
}
|
||||
}
|
||||
|
||||
protected final void readCoordinates(LittleEndianInput in) {
|
||||
field_1_first_row = in.readUShort();
|
||||
field_2_last_row = in.readUShort();
|
||||
field_3_first_column = in.readUShort();
|
||||
field_4_last_column = in.readUShort();
|
||||
}
|
||||
protected final void writeCoordinates(LittleEndianOutput out) {
|
||||
out.writeShort(field_1_first_row);
|
||||
out.writeShort(field_2_last_row);
|
||||
out.writeShort(field_3_first_column);
|
||||
out.writeShort(field_4_last_column);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the first row in the area
|
||||
*/
|
||||
public final int getFirstRow() {
|
||||
return field_1_first_row;
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the first row
|
||||
* @param rowIx number (0-based)
|
||||
*/
|
||||
public final void setFirstRow(int rowIx) {
|
||||
field_1_first_row = rowIx;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return last row in the range (x2 in x1,y1-x2,y2)
|
||||
*/
|
||||
public final int getLastRow() {
|
||||
return field_2_last_row;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param rowIx last row number in the area
|
||||
*/
|
||||
public final void setLastRow(int rowIx) {
|
||||
field_2_last_row = rowIx;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the first column number in the area.
|
||||
*/
|
||||
public final int getFirstColumn() {
|
||||
return columnMask.getValue(field_3_first_column);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the first column number + the options bit settings unstripped
|
||||
*/
|
||||
public final short getFirstColumnRaw() {
|
||||
return (short) field_3_first_column; // TODO
|
||||
}
|
||||
|
||||
/**
|
||||
* @return whether or not the first row is a relative reference or not.
|
||||
*/
|
||||
public final boolean isFirstRowRelative() {
|
||||
return rowRelative.isSet(field_3_first_column);
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the first row to relative or not
|
||||
* @param rel is relative or not.
|
||||
*/
|
||||
public final void setFirstRowRelative(boolean rel) {
|
||||
field_3_first_column=rowRelative.setBoolean(field_3_first_column,rel);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return isrelative first column to relative or not
|
||||
*/
|
||||
public final boolean isFirstColRelative() {
|
||||
return colRelative.isSet(field_3_first_column);
|
||||
}
|
||||
|
||||
/**
|
||||
* set whether the first column is relative
|
||||
*/
|
||||
public final void setFirstColRelative(boolean rel) {
|
||||
field_3_first_column=colRelative.setBoolean(field_3_first_column,rel);
|
||||
}
|
||||
|
||||
/**
|
||||
* set the first column in the area
|
||||
*/
|
||||
public final void setFirstColumn(int colIx) {
|
||||
field_3_first_column=columnMask.setValue(field_3_first_column, colIx);
|
||||
}
|
||||
|
||||
/**
|
||||
* set the first column irrespective of the bitmasks
|
||||
*/
|
||||
public final void setFirstColumnRaw(int column) {
|
||||
field_3_first_column = column;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return lastcolumn in the area
|
||||
*/
|
||||
public final int getLastColumn() {
|
||||
return columnMask.getValue(field_4_last_column);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return last column and bitmask (the raw field)
|
||||
*/
|
||||
public final short getLastColumnRaw() {
|
||||
return (short) field_4_last_column;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return last row relative or not
|
||||
*/
|
||||
public final boolean isLastRowRelative() {
|
||||
return rowRelative.isSet(field_4_last_column);
|
||||
}
|
||||
|
||||
/**
|
||||
* set whether the last row is relative or not
|
||||
* @param rel <code>true</code> if the last row relative, else
|
||||
* <code>false</code>
|
||||
*/
|
||||
public final void setLastRowRelative(boolean rel) {
|
||||
field_4_last_column=rowRelative.setBoolean(field_4_last_column,rel);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return lastcol relative or not
|
||||
*/
|
||||
public final boolean isLastColRelative() {
|
||||
return colRelative.isSet(field_4_last_column);
|
||||
}
|
||||
|
||||
/**
|
||||
* set whether the last column should be relative or not
|
||||
*/
|
||||
public final void setLastColRelative(boolean rel) {
|
||||
field_4_last_column=colRelative.setBoolean(field_4_last_column,rel);
|
||||
}
|
||||
|
||||
/**
|
||||
* set the last column in the area
|
||||
*/
|
||||
public final void setLastColumn(int colIx) {
|
||||
field_4_last_column=columnMask.setValue(field_4_last_column, colIx);
|
||||
}
|
||||
|
||||
/**
|
||||
* set the last column irrespective of the bitmasks
|
||||
*/
|
||||
public final void setLastColumnRaw(short column) {
|
||||
field_4_last_column = column;
|
||||
}
|
||||
protected final String formatReferenceAsString() {
|
||||
CellReference topLeft = new CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative());
|
||||
CellReference botRight = new CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative());
|
||||
|
||||
if(AreaReference.isWholeColumnReference(topLeft, botRight)) {
|
||||
return (new AreaReference(topLeft, botRight)).formatAsString();
|
||||
}
|
||||
return topLeft.formatAsString() + ":" + botRight.formatAsString();
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return formatReferenceAsString();
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_REF;
|
||||
}
|
||||
}
|
268
src/java/org/apache/poi/ss/formula/ptg/ArrayPtg.java
Normal file
268
src/java/org/apache/poi/ss/formula/ptg/ArrayPtg.java
Normal file
@ -0,0 +1,268 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.formula.constant.ConstantValueParser;
|
||||
import org.apache.poi.ss.formula.constant.ErrorConstant;
|
||||
import org.apache.poi.ss.util.NumberToTextConverter;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* ArrayPtg - handles arrays
|
||||
*
|
||||
* The ArrayPtg is a little weird, the size of the Ptg when parsing initially only
|
||||
* includes the Ptg sid and the reserved bytes. The next Ptg in the expression then follows.
|
||||
* It is only after the "size" of all the Ptgs is met, that the ArrayPtg data is actually
|
||||
* held after this. So Ptg.createParsedExpression keeps track of the number of
|
||||
* ArrayPtg elements and need to parse the data upto the FORMULA record size.
|
||||
*
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class ArrayPtg extends Ptg {
|
||||
public static final byte sid = 0x20;
|
||||
|
||||
private static final int RESERVED_FIELD_LEN = 7;
|
||||
/**
|
||||
* The size of the plain tArray token written within the standard formula tokens
|
||||
* (not including the data which comes after all formula tokens)
|
||||
*/
|
||||
public static final int PLAIN_TOKEN_SIZE = 1+RESERVED_FIELD_LEN;
|
||||
|
||||
// 7 bytes of data (stored as an int, short and byte here)
|
||||
private final int _reserved0Int;
|
||||
private final int _reserved1Short;
|
||||
private final int _reserved2Byte;
|
||||
|
||||
// data from these fields comes after the Ptg data of all tokens in current formula
|
||||
private final int _nColumns;
|
||||
private final int _nRows;
|
||||
private final Object[] _arrayValues;
|
||||
|
||||
ArrayPtg(int reserved0, int reserved1, int reserved2, int nColumns, int nRows, Object[] arrayValues) {
|
||||
_reserved0Int = reserved0;
|
||||
_reserved1Short = reserved1;
|
||||
_reserved2Byte = reserved2;
|
||||
_nColumns = nColumns;
|
||||
_nRows = nRows;
|
||||
_arrayValues = arrayValues;
|
||||
}
|
||||
/**
|
||||
* @param values2d array values arranged in rows
|
||||
*/
|
||||
public ArrayPtg(Object[][] values2d) {
|
||||
int nColumns = values2d[0].length;
|
||||
int nRows = values2d.length;
|
||||
// convert 2-d to 1-d array (row by row according to getValueIndex())
|
||||
_nColumns = (short) nColumns;
|
||||
_nRows = (short) nRows;
|
||||
|
||||
Object[] vv = new Object[_nColumns * _nRows];
|
||||
for (int r=0; r<nRows; r++) {
|
||||
Object[] rowData = values2d[r];
|
||||
for (int c=0; c<nColumns; c++) {
|
||||
vv[getValueIndex(c, r)] = rowData[c];
|
||||
}
|
||||
}
|
||||
|
||||
_arrayValues = vv;
|
||||
_reserved0Int = 0;
|
||||
_reserved1Short = 0;
|
||||
_reserved2Byte = 0;
|
||||
}
|
||||
/**
|
||||
* @return 2-d array (inner index is rowIx, outer index is colIx)
|
||||
*/
|
||||
public Object[][] getTokenArrayValues() {
|
||||
if (_arrayValues == null) {
|
||||
throw new IllegalStateException("array values not read yet");
|
||||
}
|
||||
Object[][] result = new Object[_nRows][_nColumns];
|
||||
for (int r = 0; r < _nRows; r++) {
|
||||
Object[] rowData = result[r];
|
||||
for (int c = 0; c < _nColumns; c++) {
|
||||
rowData[c] = _arrayValues[getValueIndex(c, r)];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean isBaseToken() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer("[ArrayPtg]\n");
|
||||
|
||||
sb.append("nRows = ").append(getRowCount()).append("\n");
|
||||
sb.append("nCols = ").append(getColumnCount()).append("\n");
|
||||
if (_arrayValues == null) {
|
||||
sb.append(" #values#uninitialised#\n");
|
||||
} else {
|
||||
sb.append(" ").append(toFormulaString());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Note - (2D) array elements are stored row by row
|
||||
* @return the index into the internal 1D array for the specified column and row
|
||||
*/
|
||||
/* package */ int getValueIndex(int colIx, int rowIx) {
|
||||
if(colIx < 0 || colIx >= _nColumns) {
|
||||
throw new IllegalArgumentException("Specified colIx (" + colIx
|
||||
+ ") is outside the allowed range (0.." + (_nColumns-1) + ")");
|
||||
}
|
||||
if(rowIx < 0 || rowIx >= _nRows) {
|
||||
throw new IllegalArgumentException("Specified rowIx (" + rowIx
|
||||
+ ") is outside the allowed range (0.." + (_nRows-1) + ")");
|
||||
}
|
||||
return rowIx * _nColumns + colIx;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeInt(_reserved0Int);
|
||||
out.writeShort(_reserved1Short);
|
||||
out.writeByte(_reserved2Byte);
|
||||
}
|
||||
|
||||
public int writeTokenValueBytes(LittleEndianOutput out) {
|
||||
|
||||
out.writeByte(_nColumns-1);
|
||||
out.writeShort(_nRows-1);
|
||||
ConstantValueParser.encode(out, _arrayValues);
|
||||
return 3 + ConstantValueParser.getEncodedSize(_arrayValues);
|
||||
}
|
||||
|
||||
public int getRowCount() {
|
||||
return _nRows;
|
||||
}
|
||||
|
||||
public int getColumnCount() {
|
||||
return _nColumns;
|
||||
}
|
||||
|
||||
/** This size includes the size of the array Ptg plus the Array Ptg Token value size*/
|
||||
public int getSize() {
|
||||
return PLAIN_TOKEN_SIZE
|
||||
// data written after the all tokens:
|
||||
+ 1 + 2 // column, row
|
||||
+ ConstantValueParser.getEncodedSize(_arrayValues);
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
StringBuffer b = new StringBuffer();
|
||||
b.append("{");
|
||||
for (int y=0;y<getRowCount();y++) {
|
||||
if (y > 0) {
|
||||
b.append(";");
|
||||
}
|
||||
for (int x=0;x<getColumnCount();x++) {
|
||||
if (x > 0) {
|
||||
b.append(",");
|
||||
}
|
||||
Object o = _arrayValues[getValueIndex(x, y)];
|
||||
b.append(getConstantText(o));
|
||||
}
|
||||
}
|
||||
b.append("}");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
private static String getConstantText(Object o) {
|
||||
|
||||
if (o == null) {
|
||||
throw new RuntimeException("Array item cannot be null");
|
||||
}
|
||||
if (o instanceof String) {
|
||||
return "\"" + (String)o + "\"";
|
||||
}
|
||||
if (o instanceof Double) {
|
||||
return NumberToTextConverter.toText(((Double)o).doubleValue());
|
||||
}
|
||||
if (o instanceof Boolean) {
|
||||
return ((Boolean)o).booleanValue() ? "TRUE" : "FALSE";
|
||||
}
|
||||
if (o instanceof ErrorConstant) {
|
||||
return ((ErrorConstant)o).getText();
|
||||
}
|
||||
throw new IllegalArgumentException("Unexpected constant class (" + o.getClass().getName() + ")");
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_ARRAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents the initial plain tArray token (without the constant data that trails the whole
|
||||
* formula). Objects of this class are only temporary and cannot be used as {@link Ptg}s.
|
||||
* These temporary objects get converted to {@link ArrayPtg} by the
|
||||
* {@link #finishReading(LittleEndianInput)} method.
|
||||
*/
|
||||
static final class Initial extends Ptg {
|
||||
private final int _reserved0;
|
||||
private final int _reserved1;
|
||||
private final int _reserved2;
|
||||
|
||||
public Initial(LittleEndianInput in) {
|
||||
_reserved0 = in.readInt();
|
||||
_reserved1 = in.readUShort();
|
||||
_reserved2 = in.readUByte();
|
||||
}
|
||||
private static RuntimeException invalid() {
|
||||
throw new IllegalStateException("This object is a partially initialised tArray, and cannot be used as a Ptg");
|
||||
}
|
||||
public byte getDefaultOperandClass() {
|
||||
throw invalid();
|
||||
}
|
||||
public int getSize() {
|
||||
return PLAIN_TOKEN_SIZE;
|
||||
}
|
||||
public boolean isBaseToken() {
|
||||
return false;
|
||||
}
|
||||
public String toFormulaString() {
|
||||
throw invalid();
|
||||
}
|
||||
public void write(LittleEndianOutput out) {
|
||||
throw invalid();
|
||||
}
|
||||
/**
|
||||
* Read in the actual token (array) values. This occurs
|
||||
* AFTER the last Ptg in the expression.
|
||||
* See page 304-305 of Excel97-2007BinaryFileFormat(xls)Specification.pdf
|
||||
*/
|
||||
public ArrayPtg finishReading(LittleEndianInput in) {
|
||||
int nColumns = in.readUByte();
|
||||
short nRows = in.readShort();
|
||||
//The token_1_columns and token_2_rows do not follow the documentation.
|
||||
//The number of physical rows and columns is actually +1 of these values.
|
||||
//Which is not explicitly documented.
|
||||
nColumns++;
|
||||
nRows++;
|
||||
|
||||
int totalCount = nRows * nColumns;
|
||||
Object[] arrayValues = ConstantValueParser.parse(in, totalCount);
|
||||
|
||||
ArrayPtg result = new ArrayPtg(_reserved0, _reserved1, _reserved2, nColumns, nRows, arrayValues);
|
||||
result.setClass(getPtgClass());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
263
src/java/org/apache/poi/ss/formula/ptg/AttrPtg.java
Normal file
263
src/java/org/apache/poi/ss/formula/ptg/AttrPtg.java
Normal file
@ -0,0 +1,263 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.BitField;
|
||||
import org.apache.poi.util.BitFieldFactory;
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* "Special Attributes"
|
||||
* This seems to be a Misc Stuff and Junk record. One function it serves is
|
||||
* in SUM functions (i.e. SUM(A1:A3) causes an area PTG then an ATTR with the SUM option set)
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class AttrPtg extends ControlPtg {
|
||||
public final static byte sid = 0x19;
|
||||
private final static int SIZE = 4;
|
||||
private final byte _options;
|
||||
private final short _data;
|
||||
|
||||
/** only used for tAttrChoose: table of offsets to starts of args */
|
||||
private final int[] _jumpTable;
|
||||
/** only used for tAttrChoose: offset to the tFuncVar for CHOOSE() */
|
||||
private final int _chooseFuncOffset;
|
||||
|
||||
// flags 'volatile' and 'space', can be combined.
|
||||
// OOO spec says other combinations are theoretically possible but not likely to occur.
|
||||
private static final BitField semiVolatile = BitFieldFactory.getInstance(0x01);
|
||||
private static final BitField optiIf = BitFieldFactory.getInstance(0x02);
|
||||
private static final BitField optiChoose = BitFieldFactory.getInstance(0x04);
|
||||
private static final BitField optiSkip = BitFieldFactory.getInstance(0x08);
|
||||
private static final BitField optiSum = BitFieldFactory.getInstance(0x10);
|
||||
private static final BitField baxcel = BitFieldFactory.getInstance(0x20); // 'assignment-style formula in a macro sheet'
|
||||
private static final BitField space = BitFieldFactory.getInstance(0x40);
|
||||
|
||||
public static final AttrPtg SUM = new AttrPtg(0x0010, 0, null, -1);
|
||||
|
||||
public static final class SpaceType {
|
||||
private SpaceType() {
|
||||
// no instances of this class
|
||||
}
|
||||
|
||||
/** 00H = Spaces before the next token (not allowed before tParen token) */
|
||||
public static final int SPACE_BEFORE = 0x00;
|
||||
/** 01H = Carriage returns before the next token (not allowed before tParen token) */
|
||||
public static final int CR_BEFORE = 0x01;
|
||||
/** 02H = Spaces before opening parenthesis (only allowed before tParen token) */
|
||||
public static final int SPACE_BEFORE_OPEN_PAREN = 0x02;
|
||||
/** 03H = Carriage returns before opening parenthesis (only allowed before tParen token) */
|
||||
public static final int CR_BEFORE_OPEN_PAREN = 0x03;
|
||||
/** 04H = Spaces before closing parenthesis (only allowed before tParen, tFunc, and tFuncVar tokens) */
|
||||
public static final int SPACE_BEFORE_CLOSE_PAREN = 0x04;
|
||||
/** 05H = Carriage returns before closing parenthesis (only allowed before tParen, tFunc, and tFuncVar tokens) */
|
||||
public static final int CR_BEFORE_CLOSE_PAREN = 0x05;
|
||||
/** 06H = Spaces following the equality sign (only in macro sheets) */
|
||||
public static final int SPACE_AFTER_EQUALITY = 0x06;
|
||||
}
|
||||
|
||||
public AttrPtg(LittleEndianInput in) {
|
||||
_options = in.readByte();
|
||||
_data = in.readShort();
|
||||
if (isOptimizedChoose()) {
|
||||
int nCases = _data;
|
||||
int[] jumpTable = new int[nCases];
|
||||
for (int i = 0; i < jumpTable.length; i++) {
|
||||
jumpTable[i] = in.readUShort();
|
||||
}
|
||||
_jumpTable = jumpTable;
|
||||
_chooseFuncOffset = in.readUShort();
|
||||
} else {
|
||||
_jumpTable = null;
|
||||
_chooseFuncOffset = -1;
|
||||
}
|
||||
|
||||
}
|
||||
private AttrPtg(int options, int data, int[] jt, int chooseFuncOffset) {
|
||||
_options = (byte) options;
|
||||
_data = (short) data;
|
||||
_jumpTable = jt;
|
||||
_chooseFuncOffset = chooseFuncOffset;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param type a constant from <tt>SpaceType</tt>
|
||||
* @param count the number of space characters
|
||||
*/
|
||||
public static AttrPtg createSpace(int type, int count) {
|
||||
int data = type & 0x00FF | (count << 8) & 0x00FFFF;
|
||||
return new AttrPtg(space.set(0), data, null, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param dist distance (in bytes) to start of either <ul><li>false parameter</li>
|
||||
* <li>tFuncVar(IF) token (when false parameter is not present)</li></ul>
|
||||
*/
|
||||
public static AttrPtg createIf(int dist) {
|
||||
return new AttrPtg(optiIf.set(0), dist, null, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param dist distance (in bytes) to position behind tFuncVar(IF) token (minus 1)
|
||||
*/
|
||||
public static AttrPtg createSkip(int dist) {
|
||||
return new AttrPtg(optiSkip.set(0), dist, null, -1);
|
||||
}
|
||||
|
||||
public static AttrPtg getSumSingle() {
|
||||
return new AttrPtg(optiSum.set(0), 0, null, -1);
|
||||
}
|
||||
|
||||
|
||||
public boolean isSemiVolatile() {
|
||||
return semiVolatile.isSet(_options);
|
||||
}
|
||||
|
||||
public boolean isOptimizedIf() {
|
||||
return optiIf.isSet(_options);
|
||||
}
|
||||
|
||||
public boolean isOptimizedChoose() {
|
||||
return optiChoose.isSet(_options);
|
||||
}
|
||||
|
||||
public boolean isSum() {
|
||||
return optiSum.isSet(_options);
|
||||
}
|
||||
public boolean isSkip() {
|
||||
return optiSkip.isSet(_options);
|
||||
}
|
||||
|
||||
// lets hope no one uses this anymore
|
||||
private boolean isBaxcel() {
|
||||
return baxcel.isSet(_options);
|
||||
}
|
||||
|
||||
public boolean isSpace() {
|
||||
return space.isSet(_options);
|
||||
}
|
||||
|
||||
public short getData() {
|
||||
return _data;
|
||||
}
|
||||
public int[] getJumpTable() {
|
||||
return _jumpTable.clone();
|
||||
}
|
||||
public int getChooseFuncOffset() {
|
||||
if (_jumpTable == null) {
|
||||
throw new IllegalStateException("Not tAttrChoose");
|
||||
}
|
||||
return _chooseFuncOffset;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer(64);
|
||||
sb.append(getClass().getName()).append(" [");
|
||||
|
||||
if(isSemiVolatile()) {
|
||||
sb.append("volatile ");
|
||||
}
|
||||
if(isSpace()) {
|
||||
sb.append("space count=").append((_data >> 8) & 0x00FF);
|
||||
sb.append(" type=").append(_data & 0x00FF).append(" ");
|
||||
}
|
||||
// the rest seem to be mutually exclusive
|
||||
if(isOptimizedIf()) {
|
||||
sb.append("if dist=").append(_data);
|
||||
} else if(isOptimizedChoose()) {
|
||||
sb.append("choose nCases=").append(_data);
|
||||
} else if(isSkip()) {
|
||||
sb.append("skip dist=").append(_data);
|
||||
} else if(isSum()) {
|
||||
sb.append("sum ");
|
||||
} else if(isBaxcel()) {
|
||||
sb.append("assign ");
|
||||
}
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeByte(_options);
|
||||
out.writeShort(_data);
|
||||
int[] jt = _jumpTable;
|
||||
if (jt != null) {
|
||||
for (int i = 0; i < jt.length; i++) {
|
||||
out.writeShort(jt[i]);
|
||||
}
|
||||
out.writeShort(_chooseFuncOffset);
|
||||
}
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
if (_jumpTable != null) {
|
||||
return SIZE + (_jumpTable.length + 1) * LittleEndian.SHORT_SIZE;
|
||||
}
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
if(space.isSet(_options)) {
|
||||
return operands[ 0 ];
|
||||
} else if (optiIf.isSet(_options)) {
|
||||
return toFormulaString() + "(" + operands[0] + ")";
|
||||
} else if (optiSkip.isSet(_options)) {
|
||||
return toFormulaString() + operands[0]; //goto isn't a real formula element should not show up
|
||||
} else {
|
||||
return toFormulaString() + "(" + operands[0] + ")";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return -1;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
if(semiVolatile.isSet(_options)) {
|
||||
return "ATTR(semiVolatile)";
|
||||
}
|
||||
if(optiIf.isSet(_options)) {
|
||||
return "IF";
|
||||
}
|
||||
if( optiChoose.isSet(_options)) {
|
||||
return "CHOOSE";
|
||||
}
|
||||
if(optiSkip.isSet(_options)) {
|
||||
return "";
|
||||
}
|
||||
if(optiSum.isSet(_options)) {
|
||||
return "SUM";
|
||||
}
|
||||
if(baxcel.isSet(_options)) {
|
||||
return "ATTR(baxcel)";
|
||||
}
|
||||
if(space.isSet(_options)) {
|
||||
return "";
|
||||
}
|
||||
return "UNKNOWN ATTRIBUTE";
|
||||
}
|
||||
}
|
66
src/java/org/apache/poi/ss/formula/ptg/BoolPtg.java
Normal file
66
src/java/org/apache/poi/ss/formula/ptg/BoolPtg.java
Normal file
@ -0,0 +1,66 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Boolean (boolean) Stores a (java) boolean value in a formula.
|
||||
*
|
||||
* @author Paul Krause (pkrause at soundbite dot com)
|
||||
* @author Andrew C. Oliver (acoliver at apache dot org)
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class BoolPtg extends ScalarConstantPtg {
|
||||
public static final int SIZE = 2;
|
||||
public static final byte sid = 0x1D;
|
||||
|
||||
private static final BoolPtg FALSE = new BoolPtg(false);
|
||||
private static final BoolPtg TRUE = new BoolPtg(true);
|
||||
|
||||
private final boolean _value;
|
||||
|
||||
private BoolPtg(boolean b) {
|
||||
_value = b;
|
||||
}
|
||||
|
||||
public static BoolPtg valueOf(boolean b) {
|
||||
return b ? TRUE : FALSE;
|
||||
}
|
||||
public static BoolPtg read(LittleEndianInput in) {
|
||||
return valueOf(in.readByte() == 1);
|
||||
}
|
||||
|
||||
public boolean getValue() {
|
||||
return _value;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeByte(_value ? 1 : 0);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return _value ? "TRUE" : "FALSE";
|
||||
}
|
||||
}
|
52
src/java/org/apache/poi/ss/formula/ptg/ConcatPtg.java
Normal file
52
src/java/org/apache/poi/ss/formula/ptg/ConcatPtg.java
Normal file
@ -0,0 +1,52 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class ConcatPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x08;
|
||||
|
||||
private final static String CONCAT = "&";
|
||||
|
||||
public static final ValueOperatorPtg instance = new ConcatPtg();
|
||||
|
||||
private ConcatPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append(CONCAT);
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
38
src/java/org/apache/poi/ss/formula/ptg/ControlPtg.java
Normal file
38
src/java/org/apache/poi/ss/formula/ptg/ControlPtg.java
Normal file
@ -0,0 +1,38 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Common superclass for
|
||||
* tExp
|
||||
* tTbl
|
||||
* tParen
|
||||
* tNlr
|
||||
* tAttr
|
||||
* tSheet
|
||||
* tEndSheet
|
||||
*/
|
||||
public abstract class ControlPtg extends Ptg {
|
||||
|
||||
public boolean isBaseToken() {
|
||||
return true;
|
||||
}
|
||||
public final byte getDefaultOperandClass() {
|
||||
throw new IllegalStateException("Control tokens are not classified");
|
||||
}
|
||||
}
|
69
src/java/org/apache/poi/ss/formula/ptg/DeletedArea3DPtg.java
Normal file
69
src/java/org/apache/poi/ss/formula/ptg/DeletedArea3DPtg.java
Normal file
@ -0,0 +1,69 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.usermodel.ErrorConstants;
|
||||
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
|
||||
import org.apache.poi.ss.formula.WorkbookDependentFormula;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Title: Deleted Area 3D Ptg - 3D referecnce (Sheet + Area)<P>
|
||||
* Description: Defined a area in Extern Sheet. <P>
|
||||
* REFERENCE: <P>
|
||||
* @author Patrick Luby
|
||||
* @version 1.0-pre
|
||||
*/
|
||||
public final class DeletedArea3DPtg extends OperandPtg implements WorkbookDependentFormula {
|
||||
public final static byte sid = 0x3d;
|
||||
private final int field_1_index_extern_sheet;
|
||||
private final int unused1;
|
||||
private final int unused2;
|
||||
|
||||
public DeletedArea3DPtg(int externSheetIndex) {
|
||||
field_1_index_extern_sheet = externSheetIndex;
|
||||
unused1 = 0;
|
||||
unused2 = 0;
|
||||
}
|
||||
|
||||
public DeletedArea3DPtg(LittleEndianInput in) {
|
||||
field_1_index_extern_sheet = in.readUShort();
|
||||
unused1 = in.readInt();
|
||||
unused2 = in.readInt();
|
||||
}
|
||||
public String toFormulaString(FormulaRenderingWorkbook book) {
|
||||
return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet,
|
||||
ErrorConstants.getText(ErrorConstants.ERROR_REF));
|
||||
}
|
||||
public String toFormulaString() {
|
||||
throw new RuntimeException("3D references need a workbook to determine formula text");
|
||||
}
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_REF;
|
||||
}
|
||||
public int getSize() {
|
||||
return 11;
|
||||
}
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(field_1_index_extern_sheet);
|
||||
out.writeInt(unused1);
|
||||
out.writeInt(unused2);
|
||||
}
|
||||
}
|
68
src/java/org/apache/poi/ss/formula/ptg/DeletedRef3DPtg.java
Normal file
68
src/java/org/apache/poi/ss/formula/ptg/DeletedRef3DPtg.java
Normal file
@ -0,0 +1,68 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
|
||||
import org.apache.poi.ss.usermodel.ErrorConstants;
|
||||
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
|
||||
import org.apache.poi.ss.formula.WorkbookDependentFormula;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Title: Deleted Reference 3D Ptg <P>
|
||||
* Description: Defined a cell in extern sheet. <P>
|
||||
* REFERENCE: <P>
|
||||
* @author Patrick Luby
|
||||
* @version 1.0-pre
|
||||
*/
|
||||
public final class DeletedRef3DPtg extends OperandPtg implements WorkbookDependentFormula {
|
||||
public final static byte sid = 0x3c;
|
||||
private final int field_1_index_extern_sheet;
|
||||
private final int unused1;
|
||||
|
||||
/** Creates new DeletedRef3DPtg */
|
||||
public DeletedRef3DPtg(LittleEndianInput in) {
|
||||
field_1_index_extern_sheet = in.readUShort();
|
||||
unused1 = in.readInt();
|
||||
}
|
||||
|
||||
public DeletedRef3DPtg(int externSheetIndex) {
|
||||
field_1_index_extern_sheet = externSheetIndex;
|
||||
unused1 = 0;
|
||||
}
|
||||
|
||||
public String toFormulaString(FormulaRenderingWorkbook book) {
|
||||
return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet,
|
||||
ErrorConstants.getText(ErrorConstants.ERROR_REF));
|
||||
}
|
||||
public String toFormulaString() {
|
||||
throw new RuntimeException("3D references need a workbook to determine formula text");
|
||||
}
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_REF;
|
||||
}
|
||||
public int getSize() {
|
||||
return 7;
|
||||
}
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(field_1_index_extern_sheet);
|
||||
out.writeInt(unused1);
|
||||
}
|
||||
}
|
50
src/java/org/apache/poi/ss/formula/ptg/DividePtg.java
Normal file
50
src/java/org/apache/poi/ss/formula/ptg/DividePtg.java
Normal file
@ -0,0 +1,50 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* This PTG implements the standard binomial divide "/"
|
||||
* @author Andrew C. Oliver acoliver at apache dot org
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class DividePtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x06;
|
||||
|
||||
public static final ValueOperatorPtg instance = new DividePtg();
|
||||
|
||||
private DividePtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append("/");
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
50
src/java/org/apache/poi/ss/formula/ptg/EqualPtg.java
Normal file
50
src/java/org/apache/poi/ss/formula/ptg/EqualPtg.java
Normal file
@ -0,0 +1,50 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andy
|
||||
*/
|
||||
public final class EqualPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x0b;
|
||||
|
||||
public static final ValueOperatorPtg instance = new EqualPtg();
|
||||
|
||||
private EqualPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append("=");
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
94
src/java/org/apache/poi/ss/formula/ptg/ErrPtg.java
Normal file
94
src/java/org/apache/poi/ss/formula/ptg/ErrPtg.java
Normal file
@ -0,0 +1,94 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.usermodel.ErrorConstants;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* @author Daniel Noll (daniel at nuix dot com dot au)
|
||||
*/
|
||||
public final class ErrPtg extends ScalarConstantPtg {
|
||||
|
||||
// convenient access to namespace
|
||||
private static final ErrorConstants EC = null;
|
||||
|
||||
/** <b>#NULL!</b> - Intersection of two cell ranges is empty */
|
||||
public static final ErrPtg NULL_INTERSECTION = new ErrPtg(EC.ERROR_NULL);
|
||||
/** <b>#DIV/0!</b> - Division by zero */
|
||||
public static final ErrPtg DIV_ZERO = new ErrPtg(EC.ERROR_DIV_0);
|
||||
/** <b>#VALUE!</b> - Wrong type of operand */
|
||||
public static final ErrPtg VALUE_INVALID = new ErrPtg(EC.ERROR_VALUE);
|
||||
/** <b>#REF!</b> - Illegal or deleted cell reference */
|
||||
public static final ErrPtg REF_INVALID = new ErrPtg(EC.ERROR_REF);
|
||||
/** <b>#NAME?</b> - Wrong function or range name */
|
||||
public static final ErrPtg NAME_INVALID = new ErrPtg(EC.ERROR_NAME);
|
||||
/** <b>#NUM!</b> - Value range overflow */
|
||||
public static final ErrPtg NUM_ERROR = new ErrPtg(EC.ERROR_NUM);
|
||||
/** <b>#N/A</b> - Argument or function not available */
|
||||
public static final ErrPtg N_A = new ErrPtg(EC.ERROR_NA);
|
||||
|
||||
|
||||
public static final short sid = 0x1c;
|
||||
private static final int SIZE = 2;
|
||||
private final int field_1_error_code;
|
||||
|
||||
/** Creates new ErrPtg */
|
||||
|
||||
private ErrPtg(int errorCode) {
|
||||
if(!ErrorConstants.isValidCode(errorCode)) {
|
||||
throw new IllegalArgumentException("Invalid error code (" + errorCode + ")");
|
||||
}
|
||||
field_1_error_code = errorCode;
|
||||
}
|
||||
|
||||
public static ErrPtg read(LittleEndianInput in) {
|
||||
return valueOf(in.readByte());
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeByte(field_1_error_code);
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return ErrorConstants.getText(field_1_error_code);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public int getErrorCode() {
|
||||
return field_1_error_code;
|
||||
}
|
||||
|
||||
public static ErrPtg valueOf(int code) {
|
||||
switch(code) {
|
||||
case ErrorConstants.ERROR_DIV_0: return DIV_ZERO;
|
||||
case ErrorConstants.ERROR_NA: return N_A;
|
||||
case ErrorConstants.ERROR_NAME: return NAME_INVALID;
|
||||
case ErrorConstants.ERROR_NULL: return NULL_INTERSECTION;
|
||||
case ErrorConstants.ERROR_NUM: return NUM_ERROR;
|
||||
case ErrorConstants.ERROR_REF: return REF_INVALID;
|
||||
case ErrorConstants.ERROR_VALUE: return VALUE_INVALID;
|
||||
}
|
||||
throw new RuntimeException("Unexpected error code (" + code + ")");
|
||||
}
|
||||
}
|
73
src/java/org/apache/poi/ss/formula/ptg/ExpPtg.java
Normal file
73
src/java/org/apache/poi/ss/formula/ptg/ExpPtg.java
Normal file
@ -0,0 +1,73 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
* @author dmui (save existing implementation)
|
||||
*/
|
||||
public final class ExpPtg extends ControlPtg {
|
||||
private final static int SIZE = 5;
|
||||
public final static short sid = 0x1;
|
||||
private final int field_1_first_row;
|
||||
private final int field_2_first_col;
|
||||
|
||||
public ExpPtg(LittleEndianInput in) {
|
||||
field_1_first_row = in.readShort();
|
||||
field_2_first_col = in.readShort();
|
||||
}
|
||||
|
||||
public ExpPtg(int firstRow, int firstCol) {
|
||||
this.field_1_first_row = firstRow;
|
||||
this.field_2_first_col = firstCol;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(field_1_first_row);
|
||||
out.writeShort(field_2_first_col);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public int getRow() {
|
||||
return field_1_first_row;
|
||||
}
|
||||
|
||||
public int getColumn() {
|
||||
return field_2_first_col;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
throw new RuntimeException("Coding Error: Expected ExpPtg to be converted from Shared to Non-Shared Formula by ValueRecordsAggregate, but it wasn't");
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer buffer = new StringBuffer("[Array Formula or Shared Formula]\n");
|
||||
buffer.append("row = ").append(getRow()).append("\n");
|
||||
buffer.append("col = ").append(getColumn()).append("\n");
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
|
||||
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
|
||||
import org.apache.poi.ss.formula.SheetNameFormatter;
|
||||
|
||||
/**
|
||||
* @author Josh Micich
|
||||
*/
|
||||
final class ExternSheetNameResolver {
|
||||
|
||||
private ExternSheetNameResolver() {
|
||||
// no instances of this class
|
||||
}
|
||||
|
||||
public static String prependSheetName(FormulaRenderingWorkbook book, int field_1_index_extern_sheet, String cellRefText) {
|
||||
ExternalSheet externalSheet = book.getExternalSheet(field_1_index_extern_sheet);
|
||||
StringBuffer sb;
|
||||
if (externalSheet != null) {
|
||||
String wbName = externalSheet.getWorkbookName();
|
||||
String sheetName = externalSheet.getSheetName();
|
||||
sb = new StringBuffer(wbName.length() + sheetName.length() + cellRefText.length() + 4);
|
||||
SheetNameFormatter.appendFormat(sb, wbName, sheetName);
|
||||
} else {
|
||||
String sheetName = book.getSheetNameByExternSheet(field_1_index_extern_sheet);
|
||||
sb = new StringBuffer(sheetName.length() + cellRefText.length() + 4);
|
||||
if (sheetName.length() < 1) {
|
||||
// What excel does if sheet has been deleted
|
||||
sb.append("#REF"); // note - '!' added just once below
|
||||
} else {
|
||||
SheetNameFormatter.appendFormat(sb, sheetName);
|
||||
}
|
||||
}
|
||||
sb.append('!');
|
||||
sb.append(cellRefText);
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
60
src/java/org/apache/poi/ss/formula/ptg/FuncPtg.java
Normal file
60
src/java/org/apache/poi/ss/formula/ptg/FuncPtg.java
Normal file
@ -0,0 +1,60 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadata;
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadataRegistry;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* @author aviks
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
* @author Danny Mui (dmui at apache dot org) (Leftover handling)
|
||||
*/
|
||||
public final class FuncPtg extends AbstractFunctionPtg {
|
||||
|
||||
public final static byte sid = 0x21;
|
||||
public final static int SIZE = 3;
|
||||
|
||||
public static FuncPtg create(LittleEndianInput in) {
|
||||
return create(in.readUShort());
|
||||
}
|
||||
|
||||
private FuncPtg(int funcIndex, FunctionMetadata fm) {
|
||||
super(funcIndex, fm.getReturnClassCode(), fm.getParameterClassCodes(), fm.getMinParams()); // minParams same as max since these are not var-arg funcs
|
||||
}
|
||||
|
||||
public static FuncPtg create(int functionIndex) {
|
||||
FunctionMetadata fm = FunctionMetadataRegistry.getFunctionByIndex(functionIndex);
|
||||
if(fm == null) {
|
||||
throw new RuntimeException("Invalid built-in function index (" + functionIndex + ")");
|
||||
}
|
||||
return new FuncPtg(functionIndex, fm);
|
||||
}
|
||||
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(getFunctionIndex());
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
}
|
73
src/java/org/apache/poi/ss/formula/ptg/FuncVarPtg.java
Normal file
73
src/java/org/apache/poi/ss/formula/ptg/FuncVarPtg.java
Normal file
@ -0,0 +1,73 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadata;
|
||||
import org.apache.poi.ss.formula.function.FunctionMetadataRegistry;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class FuncVarPtg extends AbstractFunctionPtg{
|
||||
|
||||
public final static byte sid = 0x22;
|
||||
private final static int SIZE = 4;
|
||||
|
||||
/**
|
||||
* Single instance of this token for 'sum() taking a single argument'
|
||||
*/
|
||||
public static final OperationPtg SUM = FuncVarPtg.create("SUM", 1);
|
||||
|
||||
private FuncVarPtg(int functionIndex, int returnClass, byte[] paramClasses, int numArgs) {
|
||||
super(functionIndex, returnClass, paramClasses, numArgs);
|
||||
}
|
||||
|
||||
/**Creates new function pointer from a byte array
|
||||
* usually called while reading an excel file.
|
||||
*/
|
||||
public static FuncVarPtg create(LittleEndianInput in) {
|
||||
return create(in.readByte(), in.readShort());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a function ptg from a string tokenised by the parser
|
||||
*/
|
||||
public static FuncVarPtg create(String pName, int numArgs) {
|
||||
return create(numArgs, lookupIndex(pName));
|
||||
}
|
||||
|
||||
private static FuncVarPtg create(int numArgs, int functionIndex) {
|
||||
FunctionMetadata fm = FunctionMetadataRegistry.getFunctionByIndex(functionIndex);
|
||||
if(fm == null) {
|
||||
// Happens only as a result of a call to FormulaParser.parse(), with a non-built-in function name
|
||||
return new FuncVarPtg(functionIndex, Ptg.CLASS_VALUE, new byte[] {Ptg.CLASS_VALUE}, numArgs);
|
||||
}
|
||||
return new FuncVarPtg(functionIndex, fm.getReturnClassCode(), fm.getParameterClassCodes(), numArgs);
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeByte(getNumberOfOperands());
|
||||
out.writeShort(getFunctionIndex());
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
}
|
54
src/java/org/apache/poi/ss/formula/ptg/GreaterEqualPtg.java
Normal file
54
src/java/org/apache/poi/ss/formula/ptg/GreaterEqualPtg.java
Normal file
@ -0,0 +1,54 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
|
||||
/**
|
||||
* PTG class to implement greater or equal to
|
||||
*
|
||||
* @author fred at stsci dot edu
|
||||
*/
|
||||
public final class GreaterEqualPtg extends ValueOperatorPtg {
|
||||
public final static int SIZE = 1;
|
||||
public final static byte sid = 0x0c;
|
||||
|
||||
public static final ValueOperatorPtg instance = new GreaterEqualPtg();
|
||||
|
||||
private GreaterEqualPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
|
||||
buffer.append(">=");
|
||||
buffer.append(operands[ 1 ]);
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
61
src/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java
Normal file
61
src/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java
Normal file
@ -0,0 +1,61 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
|
||||
/**
|
||||
* Greater than operator PTG ">"
|
||||
* @author Cameron Riley (criley at ekmail.com)
|
||||
*/
|
||||
public final class GreaterThanPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x0D;
|
||||
private final static String GREATERTHAN = ">";
|
||||
|
||||
public static final ValueOperatorPtg instance = new GreaterThanPtg();
|
||||
|
||||
private GreaterThanPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of operands for the Less than operator
|
||||
* @return int the number of operands
|
||||
*/
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of method from OperationsPtg
|
||||
* @param operands a String array of operands
|
||||
* @return String the Formula as a String
|
||||
*/
|
||||
public String toFormulaString(String[] operands)
|
||||
{
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append(GREATERTHAN);
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
76
src/java/org/apache/poi/ss/formula/ptg/IntPtg.java
Normal file
76
src/java/org/apache/poi/ss/formula/ptg/IntPtg.java
Normal file
@ -0,0 +1,76 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Integer (unsigned short integer) Stores an unsigned short value (java int) in
|
||||
* a formula
|
||||
*
|
||||
* @author Andrew C. Oliver (acoliver at apache dot org)
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class IntPtg extends ScalarConstantPtg {
|
||||
// 16 bit unsigned integer
|
||||
private static final int MIN_VALUE = 0x0000;
|
||||
private static final int MAX_VALUE = 0xFFFF;
|
||||
|
||||
/**
|
||||
* Excel represents integers 0..65535 with the tInt token.
|
||||
*
|
||||
* @return <code>true</code> if the specified value is within the range of values
|
||||
* <tt>IntPtg</tt> can represent.
|
||||
*/
|
||||
public static boolean isInRange(int i) {
|
||||
return i >= MIN_VALUE && i <= MAX_VALUE;
|
||||
}
|
||||
|
||||
public final static int SIZE = 3;
|
||||
public final static byte sid = 0x1e;
|
||||
private final int field_1_value;
|
||||
|
||||
public IntPtg(LittleEndianInput in) {
|
||||
this(in.readUShort());
|
||||
}
|
||||
|
||||
public IntPtg(int value) {
|
||||
if (!isInRange(value)) {
|
||||
throw new IllegalArgumentException("value is out of range: " + value);
|
||||
}
|
||||
field_1_value = value;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return field_1_value;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(getValue());
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return String.valueOf(getValue());
|
||||
}
|
||||
}
|
62
src/java/org/apache/poi/ss/formula/ptg/IntersectionPtg.java
Normal file
62
src/java/org/apache/poi/ss/formula/ptg/IntersectionPtg.java
Normal file
@ -0,0 +1,62 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* @author Daniel Noll (daniel at nuix dot com dot au)
|
||||
*/
|
||||
public final class IntersectionPtg extends OperationPtg {
|
||||
public final static byte sid = 0x0f;
|
||||
|
||||
public static final OperationPtg instance = new IntersectionPtg();
|
||||
|
||||
private IntersectionPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
public final boolean isBaseToken() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return " ";
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[0]);
|
||||
buffer.append(" ");
|
||||
buffer.append(operands[1]);
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
}
|
53
src/java/org/apache/poi/ss/formula/ptg/LessEqualPtg.java
Normal file
53
src/java/org/apache/poi/ss/formula/ptg/LessEqualPtg.java
Normal file
@ -0,0 +1,53 @@
|
||||
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Ptg class to implement less than or equal
|
||||
*
|
||||
* @author fred at stsci dot edu
|
||||
*/
|
||||
public final class LessEqualPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x0a;
|
||||
|
||||
public static final ValueOperatorPtg instance = new LessEqualPtg();
|
||||
|
||||
private LessEqualPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append( operands[0] );
|
||||
buffer.append("<=");
|
||||
buffer.append( operands[1] );
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
64
src/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java
Normal file
64
src/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java
Normal file
@ -0,0 +1,64 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Less than operator PTG "<". The SID is taken from the
|
||||
* Openoffice.orgs Documentation of the Excel File Format,
|
||||
* Table 3.5.7
|
||||
* @author Cameron Riley (criley at ekmail.com)
|
||||
*/
|
||||
public final class LessThanPtg extends ValueOperatorPtg {
|
||||
/** the sid for the less than operator as hex */
|
||||
public final static byte sid = 0x09;
|
||||
|
||||
/** identifier for LESS THAN char */
|
||||
private final static String LESSTHAN = "<";
|
||||
|
||||
public static final ValueOperatorPtg instance = new LessThanPtg();
|
||||
|
||||
private LessThanPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of operands for the Less than operator
|
||||
* @return int the number of operands
|
||||
*/
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of method from OperationsPtg
|
||||
* @param operands a String array of operands
|
||||
* @return String the Formula as a String
|
||||
*/
|
||||
public String toFormulaString(String[] operands)
|
||||
{
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append(LESSTHAN);
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
74
src/java/org/apache/poi/ss/formula/ptg/MemAreaPtg.java
Normal file
74
src/java/org/apache/poi/ss/formula/ptg/MemAreaPtg.java
Normal file
@ -0,0 +1,74 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* @author Daniel Noll (daniel at nuix dot com dot au)
|
||||
*/
|
||||
public final class MemAreaPtg extends OperandPtg {
|
||||
public final static short sid = 0x26;
|
||||
private final static int SIZE = 7;
|
||||
private final int field_1_reserved;
|
||||
private final int field_2_subex_len;
|
||||
|
||||
/** Creates new MemAreaPtg */
|
||||
|
||||
public MemAreaPtg(int subexLen) {
|
||||
field_1_reserved = 0;
|
||||
field_2_subex_len = subexLen;
|
||||
}
|
||||
|
||||
public MemAreaPtg(LittleEndianInput in) {
|
||||
field_1_reserved = in.readInt();
|
||||
field_2_subex_len = in.readShort();
|
||||
}
|
||||
|
||||
public int getLenRefSubexpression() {
|
||||
return field_2_subex_len;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeInt(field_1_reserved);
|
||||
out.writeShort(field_2_subex_len);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return ""; // TODO: Not sure how to format this. -- DN
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_VALUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final String toString() {
|
||||
StringBuffer sb = new StringBuffer(64);
|
||||
sb.append(getClass().getName()).append(" [len=");
|
||||
sb.append(field_2_subex_len);
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
57
src/java/org/apache/poi/ss/formula/ptg/MemErrPtg.java
Normal file
57
src/java/org/apache/poi/ss/formula/ptg/MemErrPtg.java
Normal file
@ -0,0 +1,57 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
* @author Daniel Noll (daniel at nuix dot com dot au)
|
||||
*/
|
||||
public final class MemErrPtg extends OperandPtg {
|
||||
public final static short sid = 0x27;
|
||||
private final static int SIZE = 7;
|
||||
private int field_1_reserved;
|
||||
private short field_2_subex_len;
|
||||
|
||||
public MemErrPtg(LittleEndianInput in) {
|
||||
field_1_reserved = in.readInt();
|
||||
field_2_subex_len = in.readShort();
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeInt(field_1_reserved);
|
||||
out.writeShort(field_2_subex_len);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return "ERR#";
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_VALUE;
|
||||
}
|
||||
}
|
75
src/java/org/apache/poi/ss/formula/ptg/MemFuncPtg.java
Normal file
75
src/java/org/apache/poi/ss/formula/ptg/MemFuncPtg.java
Normal file
@ -0,0 +1,75 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* @author Glen Stampoultzis (glens at apache.org)
|
||||
*/
|
||||
public final class MemFuncPtg extends OperandPtg {
|
||||
|
||||
public final static byte sid = 0x29;
|
||||
private final int field_1_len_ref_subexpression;
|
||||
|
||||
/**
|
||||
* Creates new function pointer from a byte array usually called while
|
||||
* reading an excel file.
|
||||
*/
|
||||
public MemFuncPtg(LittleEndianInput in) {
|
||||
this(in.readUShort());
|
||||
}
|
||||
|
||||
public MemFuncPtg(int subExprLen) {
|
||||
field_1_len_ref_subexpression = subExprLen;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return 3;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(field_1_len_ref_subexpression);
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return "";
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_REF;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return field_1_len_ref_subexpression;
|
||||
}
|
||||
|
||||
public int getLenRefSubexpression() {
|
||||
return field_1_len_ref_subexpression;
|
||||
}
|
||||
@Override
|
||||
public final String toString() {
|
||||
StringBuffer sb = new StringBuffer(64);
|
||||
sb.append(getClass().getName()).append(" [len=");
|
||||
sb.append(field_1_len_ref_subexpression);
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
51
src/java/org/apache/poi/ss/formula/ptg/MissingArgPtg.java
Normal file
51
src/java/org/apache/poi/ss/formula/ptg/MissingArgPtg.java
Normal file
@ -0,0 +1,51 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Missing Function Arguments
|
||||
*
|
||||
* Avik Sengupta <avik at apache.org>
|
||||
*
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class MissingArgPtg extends ScalarConstantPtg {
|
||||
|
||||
private final static int SIZE = 1;
|
||||
public final static byte sid = 0x16;
|
||||
|
||||
public static final Ptg instance = new MissingArgPtg();
|
||||
|
||||
private MissingArgPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return " ";
|
||||
}
|
||||
}
|
50
src/java/org/apache/poi/ss/formula/ptg/MultiplyPtg.java
Normal file
50
src/java/org/apache/poi/ss/formula/ptg/MultiplyPtg.java
Normal file
@ -0,0 +1,50 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Implements the standard mathmatical multiplication - *
|
||||
* @author Andrew C. Oliver (acoliver at apache dot org)
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class MultiplyPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x05;
|
||||
|
||||
public static final ValueOperatorPtg instance = new MultiplyPtg();
|
||||
|
||||
private MultiplyPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append("*");
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
79
src/java/org/apache/poi/ss/formula/ptg/NamePtg.java
Normal file
79
src/java/org/apache/poi/ss/formula/ptg/NamePtg.java
Normal file
@ -0,0 +1,79 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
|
||||
import org.apache.poi.ss.formula.WorkbookDependentFormula;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class NamePtg extends OperandPtg implements WorkbookDependentFormula {
|
||||
public final static short sid = 0x23;
|
||||
private final static int SIZE = 5;
|
||||
/** one-based index to defined name record */
|
||||
private int field_1_label_index;
|
||||
private short field_2_zero; // reserved must be 0
|
||||
|
||||
/**
|
||||
* @param nameIndex zero-based index to name within workbook
|
||||
*/
|
||||
public NamePtg(int nameIndex) {
|
||||
field_1_label_index = 1 + nameIndex; // convert to 1-based
|
||||
}
|
||||
|
||||
/** Creates new NamePtg */
|
||||
|
||||
public NamePtg(LittleEndianInput in) {
|
||||
field_1_label_index = in.readShort();
|
||||
field_2_zero = in.readShort();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return zero based index to a defined name record in the LinkTable
|
||||
*/
|
||||
public int getIndex() {
|
||||
return field_1_label_index - 1; // convert to zero based
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(field_1_label_index);
|
||||
out.writeShort(field_2_zero);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString(FormulaRenderingWorkbook book) {
|
||||
return book.getNameText(this);
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
throw new RuntimeException("3D references need a workbook to determine formula text");
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_REF;
|
||||
}
|
||||
}
|
93
src/java/org/apache/poi/ss/formula/ptg/NameXPtg.java
Normal file
93
src/java/org/apache/poi/ss/formula/ptg/NameXPtg.java
Normal file
@ -0,0 +1,93 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
|
||||
import org.apache.poi.ss.formula.WorkbookDependentFormula;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aviks
|
||||
*/
|
||||
public final class NameXPtg extends OperandPtg implements WorkbookDependentFormula {
|
||||
public final static short sid = 0x39;
|
||||
private final static int SIZE = 7;
|
||||
|
||||
/** index to REF entry in externsheet record */
|
||||
private final int _sheetRefIndex;
|
||||
/** index to defined name or externname table(1 based) */
|
||||
private final int _nameNumber;
|
||||
/** reserved must be 0 */
|
||||
private final int _reserved;
|
||||
|
||||
private NameXPtg(int sheetRefIndex, int nameNumber, int reserved) {
|
||||
_sheetRefIndex = sheetRefIndex;
|
||||
_nameNumber = nameNumber;
|
||||
_reserved = reserved;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sheetRefIndex index to REF entry in externsheet record
|
||||
* @param nameIndex index to defined name or externname table
|
||||
*/
|
||||
public NameXPtg(int sheetRefIndex, int nameIndex) {
|
||||
this(sheetRefIndex, nameIndex + 1, 0);
|
||||
}
|
||||
|
||||
public NameXPtg(LittleEndianInput in) {
|
||||
this(in.readUShort(), in.readUShort(), in.readUShort());
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(_sheetRefIndex);
|
||||
out.writeShort(_nameNumber);
|
||||
out.writeShort(_reserved);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString(FormulaRenderingWorkbook book) {
|
||||
// -1 to convert definedNameIndex from 1-based to zero-based
|
||||
return book.resolveNameXText(this);
|
||||
}
|
||||
public String toFormulaString() {
|
||||
throw new RuntimeException("3D references need a workbook to determine formula text");
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
String retValue = "NameXPtg:[sheetRefIndex:" + _sheetRefIndex +
|
||||
" , nameNumber:" + _nameNumber + "]" ;
|
||||
return retValue;
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_VALUE;
|
||||
}
|
||||
|
||||
public int getSheetRefIndex() {
|
||||
return _sheetRefIndex;
|
||||
}
|
||||
public int getNameIndex() {
|
||||
return _nameNumber - 1;
|
||||
}
|
||||
}
|
52
src/java/org/apache/poi/ss/formula/ptg/NotEqualPtg.java
Normal file
52
src/java/org/apache/poi/ss/formula/ptg/NotEqualPtg.java
Normal file
@ -0,0 +1,52 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Ptg class to implement not equal
|
||||
*
|
||||
* @author fred at stsci dot edu
|
||||
*/
|
||||
public final class NotEqualPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x0e;
|
||||
|
||||
public static final ValueOperatorPtg instance = new NotEqualPtg();
|
||||
|
||||
private NotEqualPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append( operands[0] );
|
||||
|
||||
buffer.append("<>");
|
||||
buffer.append( operands[1] );
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
71
src/java/org/apache/poi/ss/formula/ptg/NumberPtg.java
Normal file
71
src/java/org/apache/poi/ss/formula/ptg/NumberPtg.java
Normal file
@ -0,0 +1,71 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.NumberToTextConverter;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Number Stores a floating point value in a formula value stored in a 8 byte
|
||||
* field using IEEE notation
|
||||
*
|
||||
* @author Avik Sengupta
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class NumberPtg extends ScalarConstantPtg {
|
||||
public final static int SIZE = 9;
|
||||
public final static byte sid = 0x1f;
|
||||
private final double field_1_value;
|
||||
|
||||
public NumberPtg(LittleEndianInput in) {
|
||||
this(in.readDouble());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a NumberPtg from a string representation of the number Number
|
||||
* format is not checked, it is expected to be validated in the parser that
|
||||
* calls this method.
|
||||
*
|
||||
* @param value String representation of a floating point number
|
||||
*/
|
||||
public NumberPtg(String value) {
|
||||
this(Double.parseDouble(value));
|
||||
}
|
||||
|
||||
public NumberPtg(double value) {
|
||||
field_1_value = value;
|
||||
}
|
||||
|
||||
public double getValue() {
|
||||
return field_1_value;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeDouble(getValue());
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return NumberToTextConverter.toText(field_1_value);
|
||||
}
|
||||
}
|
38
src/java/org/apache/poi/ss/formula/ptg/OperandPtg.java
Normal file
38
src/java/org/apache/poi/ss/formula/ptg/OperandPtg.java
Normal file
@ -0,0 +1,38 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* @author Josh Micich
|
||||
*/
|
||||
public abstract class OperandPtg extends Ptg implements Cloneable {
|
||||
|
||||
/**
|
||||
* All Operand {@link Ptg}s are classified ('relative', 'value', 'array')
|
||||
*/
|
||||
public final boolean isBaseToken() {
|
||||
return false;
|
||||
}
|
||||
public final OperandPtg copy() {
|
||||
try {
|
||||
return (OperandPtg) clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
45
src/java/org/apache/poi/ss/formula/ptg/OperationPtg.java
Normal file
45
src/java/org/apache/poi/ss/formula/ptg/OperationPtg.java
Normal file
@ -0,0 +1,45 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* defines a Ptg that is an operation instead of an operand
|
||||
* @author andy
|
||||
*/
|
||||
public abstract class OperationPtg extends Ptg {
|
||||
public final static int TYPE_UNARY = 0;
|
||||
public final static int TYPE_BINARY = 1;
|
||||
public final static int TYPE_FUNCTION = 2;
|
||||
|
||||
/**
|
||||
* returns a string representation of the operations
|
||||
* the length of the input array should equal the number returned by
|
||||
* @see #getNumberOfOperands
|
||||
*
|
||||
*/
|
||||
public abstract String toFormulaString(String[] operands);
|
||||
|
||||
/**
|
||||
* The number of operands expected by the operations
|
||||
*/
|
||||
public abstract int getNumberOfOperands();
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_VALUE;
|
||||
}
|
||||
}
|
58
src/java/org/apache/poi/ss/formula/ptg/ParenthesisPtg.java
Normal file
58
src/java/org/apache/poi/ss/formula/ptg/ParenthesisPtg.java
Normal file
@ -0,0 +1,58 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* While formula tokens are stored in RPN order and thus do not need parenthesis
|
||||
* for precedence reasons, Parenthesis tokens ARE written to ensure that user
|
||||
* entered parenthesis are displayed as-is on reading back
|
||||
*
|
||||
* Avik Sengupta <lists@aviksengupta.com> Andrew C. Oliver (acoliver at
|
||||
* apache dot org)
|
||||
*
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class ParenthesisPtg extends ControlPtg {
|
||||
|
||||
private final static int SIZE = 1;
|
||||
public final static byte sid = 0x15;
|
||||
|
||||
public static final ControlPtg instance = new ParenthesisPtg();
|
||||
|
||||
private ParenthesisPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return "()";
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
return "(" + operands[0] + ")";
|
||||
}
|
||||
}
|
52
src/java/org/apache/poi/ss/formula/ptg/PercentPtg.java
Normal file
52
src/java/org/apache/poi/ss/formula/ptg/PercentPtg.java
Normal file
@ -0,0 +1,52 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Percent PTG.
|
||||
*
|
||||
* @author Daniel Noll (daniel at nuix.com.au)
|
||||
*/
|
||||
public final class PercentPtg extends ValueOperatorPtg {
|
||||
public final static int SIZE = 1;
|
||||
public final static byte sid = 0x14;
|
||||
|
||||
private final static String PERCENT = "%";
|
||||
|
||||
public static final ValueOperatorPtg instance = new PercentPtg();
|
||||
|
||||
private PercentPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append(PERCENT);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
51
src/java/org/apache/poi/ss/formula/ptg/PowerPtg.java
Normal file
51
src/java/org/apache/poi/ss/formula/ptg/PowerPtg.java
Normal file
@ -0,0 +1,51 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class PowerPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x07;
|
||||
|
||||
public static final ValueOperatorPtg instance = new PowerPtg();
|
||||
|
||||
private PowerPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2; // TODO - 2 seems wrong (Jun 2008). Maybe this method is not relevant
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append("^");
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
321
src/java/org/apache/poi/ss/formula/ptg/Ptg.java
Normal file
321
src/java/org/apache/poi/ss/formula/ptg/Ptg.java
Normal file
@ -0,0 +1,321 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.poi.util.LittleEndianByteArrayOutputStream;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* <tt>Ptg</tt> represents a syntactic token in a formula. 'PTG' is an acronym for
|
||||
* '<b>p</b>arse <b>t</b>hin<b>g</b>'. Originally, the name referred to the single
|
||||
* byte identifier at the start of the token, but in POI, <tt>Ptg</tt> encapsulates
|
||||
* the whole formula token (initial byte + value data).
|
||||
* <p/>
|
||||
*
|
||||
* <tt>Ptg</tt>s are logically arranged in a tree representing the structure of the
|
||||
* parsed formula. However, in BIFF files <tt>Ptg</tt>s are written/read in
|
||||
* <em>Reverse-Polish Notation</em> order. The RPN ordering also simplifies formula
|
||||
* evaluation logic, so POI mostly accesses <tt>Ptg</tt>s in the same way.
|
||||
*
|
||||
* @author andy
|
||||
* @author avik
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public abstract class Ptg {
|
||||
public static final Ptg[] EMPTY_PTG_ARRAY = { };
|
||||
|
||||
|
||||
/**
|
||||
* Reads <tt>size</tt> bytes of the input stream, to create an array of <tt>Ptg</tt>s.
|
||||
* Extra data (beyond <tt>size</tt>) may be read if and <tt>ArrayPtg</tt>s are present.
|
||||
*/
|
||||
public static Ptg[] readTokens(int size, LittleEndianInput in) {
|
||||
List<Ptg> temp = new ArrayList<Ptg>(4 + size / 2);
|
||||
int pos = 0;
|
||||
boolean hasArrayPtgs = false;
|
||||
while (pos < size) {
|
||||
Ptg ptg = Ptg.createPtg(in);
|
||||
if (ptg instanceof ArrayPtg.Initial) {
|
||||
hasArrayPtgs = true;
|
||||
}
|
||||
pos += ptg.getSize();
|
||||
temp.add(ptg);
|
||||
}
|
||||
if(pos != size) {
|
||||
throw new RuntimeException("Ptg array size mismatch");
|
||||
}
|
||||
if (hasArrayPtgs) {
|
||||
Ptg[] result = toPtgArray(temp);
|
||||
for (int i=0;i<result.length;i++) {
|
||||
if (result[i] instanceof ArrayPtg.Initial) {
|
||||
result[i] = ((ArrayPtg.Initial) result[i]).finishReading(in);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return toPtgArray(temp);
|
||||
}
|
||||
|
||||
public static Ptg createPtg(LittleEndianInput in) {
|
||||
byte id = in.readByte();
|
||||
|
||||
if (id < 0x20) {
|
||||
return createBasePtg(id, in);
|
||||
}
|
||||
|
||||
Ptg retval = createClassifiedPtg(id, in);
|
||||
|
||||
if (id >= 0x60) {
|
||||
retval.setClass(CLASS_ARRAY);
|
||||
} else if (id >= 0x40) {
|
||||
retval.setClass(CLASS_VALUE);
|
||||
} else {
|
||||
retval.setClass(CLASS_REF);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
private static Ptg createClassifiedPtg(byte id, LittleEndianInput in) {
|
||||
|
||||
int baseId = id & 0x1F | 0x20;
|
||||
|
||||
switch (baseId) {
|
||||
case ArrayPtg.sid: return new ArrayPtg.Initial(in);//0x20, 0x40, 0x60
|
||||
case FuncPtg.sid: return FuncPtg.create(in); // 0x21, 0x41, 0x61
|
||||
case FuncVarPtg.sid: return FuncVarPtg.create(in);//0x22, 0x42, 0x62
|
||||
case NamePtg.sid: return new NamePtg(in); // 0x23, 0x43, 0x63
|
||||
case RefPtg.sid: return new RefPtg(in); // 0x24, 0x44, 0x64
|
||||
case AreaPtg.sid: return new AreaPtg(in); // 0x25, 0x45, 0x65
|
||||
case MemAreaPtg.sid: return new MemAreaPtg(in); // 0x26, 0x46, 0x66
|
||||
case MemErrPtg.sid: return new MemErrPtg(in); // 0x27, 0x47, 0x67
|
||||
case MemFuncPtg.sid: return new MemFuncPtg(in); // 0x29, 0x49, 0x69
|
||||
case RefErrorPtg.sid: return new RefErrorPtg(in); // 0x2a, 0x4a, 0x6a
|
||||
case AreaErrPtg.sid: return new AreaErrPtg(in); // 0x2b, 0x4b, 0x6b
|
||||
case RefNPtg.sid: return new RefNPtg(in); // 0x2c, 0x4c, 0x6c
|
||||
case AreaNPtg.sid: return new AreaNPtg(in); // 0x2d, 0x4d, 0x6d
|
||||
|
||||
case NameXPtg.sid: return new NameXPtg(in); // 0x39, 0x49, 0x79
|
||||
case Ref3DPtg.sid: return new Ref3DPtg(in); // 0x3a, 0x5a, 0x7a
|
||||
case Area3DPtg.sid: return new Area3DPtg(in); // 0x3b, 0x5b, 0x7b
|
||||
case DeletedRef3DPtg.sid: return new DeletedRef3DPtg(in); // 0x3c, 0x5c, 0x7c
|
||||
case DeletedArea3DPtg.sid: return new DeletedArea3DPtg(in); // 0x3d, 0x5d, 0x7d
|
||||
}
|
||||
throw new UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+
|
||||
Integer.toHexString(id) + " (" + ( int ) id + ")");
|
||||
}
|
||||
|
||||
private static Ptg createBasePtg(byte id, LittleEndianInput in) {
|
||||
switch(id) {
|
||||
case 0x00: return new UnknownPtg(id); // TODO - not a real Ptg
|
||||
case ExpPtg.sid: return new ExpPtg(in); // 0x01
|
||||
case TblPtg.sid: return new TblPtg(in); // 0x02
|
||||
case AddPtg.sid: return AddPtg.instance; // 0x03
|
||||
case SubtractPtg.sid: return SubtractPtg.instance; // 0x04
|
||||
case MultiplyPtg.sid: return MultiplyPtg.instance; // 0x05
|
||||
case DividePtg.sid: return DividePtg.instance; // 0x06
|
||||
case PowerPtg.sid: return PowerPtg.instance; // 0x07
|
||||
case ConcatPtg.sid: return ConcatPtg.instance; // 0x08
|
||||
case LessThanPtg.sid: return LessThanPtg.instance; // 0x09
|
||||
case LessEqualPtg.sid: return LessEqualPtg.instance; // 0x0a
|
||||
case EqualPtg.sid: return EqualPtg.instance; // 0x0b
|
||||
case GreaterEqualPtg.sid: return GreaterEqualPtg.instance;// 0x0c
|
||||
case GreaterThanPtg.sid: return GreaterThanPtg.instance; // 0x0d
|
||||
case NotEqualPtg.sid: return NotEqualPtg.instance; // 0x0e
|
||||
case IntersectionPtg.sid: return IntersectionPtg.instance;// 0x0f
|
||||
case UnionPtg.sid: return UnionPtg.instance; // 0x10
|
||||
case RangePtg.sid: return RangePtg.instance; // 0x11
|
||||
case UnaryPlusPtg.sid: return UnaryPlusPtg.instance; // 0x12
|
||||
case UnaryMinusPtg.sid: return UnaryMinusPtg.instance; // 0x13
|
||||
case PercentPtg.sid: return PercentPtg.instance; // 0x14
|
||||
case ParenthesisPtg.sid: return ParenthesisPtg.instance; // 0x15
|
||||
case MissingArgPtg.sid: return MissingArgPtg.instance; // 0x16
|
||||
|
||||
case StringPtg.sid: return new StringPtg(in); // 0x17
|
||||
case AttrPtg.sid: return new AttrPtg(in); // 0x19
|
||||
case ErrPtg.sid: return ErrPtg.read(in); // 0x1c
|
||||
case BoolPtg.sid: return BoolPtg.read(in); // 0x1d
|
||||
case IntPtg.sid: return new IntPtg(in); // 0x1e
|
||||
case NumberPtg.sid: return new NumberPtg(in); // 0x1f
|
||||
}
|
||||
throw new RuntimeException("Unexpected base token id (" + id + ")");
|
||||
}
|
||||
|
||||
private static Ptg[] toPtgArray(List<Ptg> l) {
|
||||
if (l.isEmpty()) {
|
||||
return EMPTY_PTG_ARRAY;
|
||||
}
|
||||
Ptg[] result = new Ptg[l.size()];
|
||||
l.toArray(result);
|
||||
return result;
|
||||
}
|
||||
/**
|
||||
* This method will return the same result as {@link #getEncodedSizeWithoutArrayData(Ptg[])}
|
||||
* if there are no array tokens present.
|
||||
* @return the full size taken to encode the specified <tt>Ptg</tt>s
|
||||
*/
|
||||
public static int getEncodedSize(Ptg[] ptgs) {
|
||||
int result = 0;
|
||||
for (int i = 0; i < ptgs.length; i++) {
|
||||
result += ptgs[i].getSize();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/**
|
||||
* Used to calculate value that should be encoded at the start of the encoded Ptg token array;
|
||||
* @return the size of the encoded Ptg tokens not including any trailing array data.
|
||||
*/
|
||||
public static int getEncodedSizeWithoutArrayData(Ptg[] ptgs) {
|
||||
int result = 0;
|
||||
for (int i = 0; i < ptgs.length; i++) {
|
||||
Ptg ptg = ptgs[i];
|
||||
if (ptg instanceof ArrayPtg) {
|
||||
result += ArrayPtg.PLAIN_TOKEN_SIZE;
|
||||
} else {
|
||||
result += ptg.getSize();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/**
|
||||
* Writes the ptgs to the data buffer, starting at the specified offset.
|
||||
*
|
||||
* <br/>
|
||||
* The 2 byte encode length field is <b>not</b> written by this method.
|
||||
* @return number of bytes written
|
||||
*/
|
||||
public static int serializePtgs(Ptg[] ptgs, byte[] array, int offset) {
|
||||
int nTokens = ptgs.length;
|
||||
|
||||
LittleEndianByteArrayOutputStream out = new LittleEndianByteArrayOutputStream(array, offset);
|
||||
|
||||
List<Ptg> arrayPtgs = null;
|
||||
|
||||
for (int k = 0; k < nTokens; k++) {
|
||||
Ptg ptg = ptgs[k];
|
||||
|
||||
ptg.write(out);
|
||||
if (ptg instanceof ArrayPtg) {
|
||||
if (arrayPtgs == null) {
|
||||
arrayPtgs = new ArrayList<Ptg>(5);
|
||||
}
|
||||
arrayPtgs.add(ptg);
|
||||
}
|
||||
}
|
||||
if (arrayPtgs != null) {
|
||||
for (int i=0;i<arrayPtgs.size();i++) {
|
||||
ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
|
||||
p.writeTokenValueBytes(out);
|
||||
}
|
||||
}
|
||||
return out.getWriteIndex() - offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the encoded length of this Ptg, including the initial Ptg type identifier byte.
|
||||
*/
|
||||
public abstract int getSize();
|
||||
|
||||
public abstract void write(LittleEndianOutput out);
|
||||
|
||||
/**
|
||||
* return a string representation of this token alone
|
||||
*/
|
||||
public abstract String toFormulaString();
|
||||
|
||||
/** Overridden toString method to ensure object hash is not printed.
|
||||
* This helps get rid of gratuitous diffs when comparing two dumps
|
||||
* Subclasses may output more relevant information by overriding this method
|
||||
**/
|
||||
public String toString(){
|
||||
return this.getClass().toString();
|
||||
}
|
||||
|
||||
public static final byte CLASS_REF = 0x00;
|
||||
public static final byte CLASS_VALUE = 0x20;
|
||||
public static final byte CLASS_ARRAY = 0x40;
|
||||
|
||||
private byte ptgClass = CLASS_REF; //base ptg
|
||||
|
||||
public final void setClass(byte thePtgClass) {
|
||||
if (isBaseToken()) {
|
||||
throw new RuntimeException("setClass should not be called on a base token");
|
||||
}
|
||||
ptgClass = thePtgClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the 'operand class' (REF/VALUE/ARRAY) for this Ptg
|
||||
*/
|
||||
public final byte getPtgClass() {
|
||||
return ptgClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Debug / diagnostic method to get this token's 'operand class' type.
|
||||
* @return 'R' for 'reference', 'V' for 'value', 'A' for 'array' and '.' for base tokens
|
||||
*/
|
||||
public final char getRVAType() {
|
||||
if (isBaseToken()) {
|
||||
return '.';
|
||||
}
|
||||
switch (ptgClass) {
|
||||
case Ptg.CLASS_REF: return 'R';
|
||||
case Ptg.CLASS_VALUE: return 'V';
|
||||
case Ptg.CLASS_ARRAY: return 'A';
|
||||
}
|
||||
throw new RuntimeException("Unknown operand class (" + ptgClass + ")");
|
||||
}
|
||||
|
||||
public abstract byte getDefaultOperandClass();
|
||||
|
||||
/**
|
||||
* @return <code>false</code> if this token is classified as 'reference', 'value', or 'array'
|
||||
*/
|
||||
public abstract boolean isBaseToken();
|
||||
|
||||
public static boolean doesFormulaReferToDeletedCell(Ptg[] ptgs) {
|
||||
for (int i = 0; i < ptgs.length; i++) {
|
||||
if (isDeletedCellRef(ptgs[i])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
private static boolean isDeletedCellRef(Ptg ptg) {
|
||||
if (ptg == ErrPtg.REF_INVALID) {
|
||||
return true;
|
||||
}
|
||||
if (ptg instanceof DeletedArea3DPtg) {
|
||||
return true;
|
||||
}
|
||||
if (ptg instanceof DeletedRef3DPtg) {
|
||||
return true;
|
||||
}
|
||||
if (ptg instanceof AreaErrPtg) {
|
||||
return true;
|
||||
}
|
||||
if (ptg instanceof RefErrorPtg) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
71
src/java/org/apache/poi/ss/formula/ptg/RangePtg.java
Normal file
71
src/java/org/apache/poi/ss/formula/ptg/RangePtg.java
Normal file
@ -0,0 +1,71 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
|
||||
/**
|
||||
* @author Daniel Noll (daniel at nuix dot com dot au)
|
||||
*/
|
||||
public final class RangePtg extends OperationPtg {
|
||||
public final static int SIZE = 1;
|
||||
public final static byte sid = 0x11;
|
||||
|
||||
public static final OperationPtg instance = new RangePtg();
|
||||
|
||||
private RangePtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
public final boolean isBaseToken() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getSize()
|
||||
{
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
}
|
||||
|
||||
public String toFormulaString()
|
||||
{
|
||||
return ":";
|
||||
}
|
||||
|
||||
|
||||
/** implementation of method from OperationsPtg*/
|
||||
public String toFormulaString(String[] operands)
|
||||
{
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append(":");
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
public int getNumberOfOperands()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
}
|
69
src/java/org/apache/poi/ss/formula/ptg/Ref2DPtgBase.java
Normal file
69
src/java/org/apache/poi/ss/formula/ptg/Ref2DPtgBase.java
Normal file
@ -0,0 +1,69 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* @author Josh Micich
|
||||
*/
|
||||
abstract class Ref2DPtgBase extends RefPtgBase {
|
||||
private final static int SIZE = 5;
|
||||
|
||||
|
||||
protected Ref2DPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
|
||||
setRow(row);
|
||||
setColumn(column);
|
||||
setRowRelative(isRowRelative);
|
||||
setColRelative(isColumnRelative);
|
||||
}
|
||||
|
||||
protected Ref2DPtgBase(LittleEndianInput in) {
|
||||
readCoordinates(in);
|
||||
}
|
||||
|
||||
protected Ref2DPtgBase(CellReference cr) {
|
||||
super(cr);
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(getSid() + getPtgClass());
|
||||
writeCoordinates(out);
|
||||
}
|
||||
|
||||
public final String toFormulaString() {
|
||||
return formatReferenceAsString();
|
||||
}
|
||||
|
||||
protected abstract byte getSid();
|
||||
|
||||
public final int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append(getClass().getName());
|
||||
sb.append(" [");
|
||||
sb.append(formatReferenceAsString());
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
96
src/java/org/apache/poi/ss/formula/ptg/Ref3DPtg.java
Normal file
96
src/java/org/apache/poi/ss/formula/ptg/Ref3DPtg.java
Normal file
@ -0,0 +1,96 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.ss.formula.ExternSheetReferenceToken;
|
||||
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
|
||||
import org.apache.poi.ss.formula.WorkbookDependentFormula;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Title: Reference 3D Ptg <P>
|
||||
* Description: Defined a cell in extern sheet. <P>
|
||||
* REFERENCE: <P>
|
||||
* @author Libin Roman (Vista Portal LDT. Developer)
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class Ref3DPtg extends RefPtgBase implements WorkbookDependentFormula, ExternSheetReferenceToken {
|
||||
public final static byte sid = 0x3a;
|
||||
|
||||
private final static int SIZE = 7; // 6 + 1 for Ptg
|
||||
private int field_1_index_extern_sheet;
|
||||
|
||||
|
||||
public Ref3DPtg(LittleEndianInput in) {
|
||||
field_1_index_extern_sheet = in.readShort();
|
||||
readCoordinates(in);
|
||||
}
|
||||
|
||||
public Ref3DPtg(String cellref, int externIdx ) {
|
||||
this(new CellReference(cellref), externIdx);
|
||||
}
|
||||
|
||||
public Ref3DPtg(CellReference c, int externIdx) {
|
||||
super(c);
|
||||
setExternSheetIndex(externIdx);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append(getClass().getName());
|
||||
sb.append(" [");
|
||||
sb.append("sheetIx=").append(getExternSheetIndex());
|
||||
sb.append(" ! ");
|
||||
sb.append(formatReferenceAsString());
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(getExternSheetIndex());
|
||||
writeCoordinates(out);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public int getExternSheetIndex() {
|
||||
return field_1_index_extern_sheet;
|
||||
}
|
||||
|
||||
public void setExternSheetIndex(int index) {
|
||||
field_1_index_extern_sheet = index;
|
||||
}
|
||||
public String format2DRefAsString() {
|
||||
return formatReferenceAsString();
|
||||
}
|
||||
/**
|
||||
* @return text representation of this cell reference that can be used in text
|
||||
* formulas. The sheet name will get properly delimited if required.
|
||||
*/
|
||||
public String toFormulaString(FormulaRenderingWorkbook book) {
|
||||
return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, formatReferenceAsString());
|
||||
}
|
||||
public String toFormulaString() {
|
||||
throw new RuntimeException("3D references need a workbook to determine formula text");
|
||||
}
|
||||
}
|
62
src/java/org/apache/poi/ss/formula/ptg/RefErrorPtg.java
Normal file
62
src/java/org/apache/poi/ss/formula/ptg/RefErrorPtg.java
Normal file
@ -0,0 +1,62 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.usermodel.ErrorConstants;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* RefError - handles deleted cell reference
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class RefErrorPtg extends OperandPtg {
|
||||
|
||||
private final static int SIZE = 5;
|
||||
public final static byte sid = 0x2A;
|
||||
private int field_1_reserved;
|
||||
|
||||
public RefErrorPtg() {
|
||||
field_1_reserved = 0;
|
||||
}
|
||||
public RefErrorPtg(LittleEndianInput in) {
|
||||
field_1_reserved = in.readInt();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return getClass().getName();
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeInt(field_1_reserved);
|
||||
}
|
||||
|
||||
public int getSize()
|
||||
{
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return ErrorConstants.getText(ErrorConstants.ERROR_REF);
|
||||
}
|
||||
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_REF;
|
||||
}
|
||||
}
|
36
src/java/org/apache/poi/ss/formula/ptg/RefNPtg.java
Normal file
36
src/java/org/apache/poi/ss/formula/ptg/RefNPtg.java
Normal file
@ -0,0 +1,36 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
|
||||
/**
|
||||
* RefNPtg
|
||||
* @author Jason Height (jheight at apache dot com)
|
||||
*/
|
||||
public final class RefNPtg extends Ref2DPtgBase {
|
||||
public final static byte sid = 0x2C;
|
||||
|
||||
public RefNPtg(LittleEndianInput in) {
|
||||
super(in);
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
}
|
54
src/java/org/apache/poi/ss/formula/ptg/RefPtg.java
Normal file
54
src/java/org/apache/poi/ss/formula/ptg/RefPtg.java
Normal file
@ -0,0 +1,54 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
|
||||
/**
|
||||
* ReferencePtg - handles references (such as A1, A2, IA4)
|
||||
* @author Andrew C. Oliver (acoliver@apache.org)
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class RefPtg extends Ref2DPtgBase {
|
||||
public final static byte sid = 0x24;
|
||||
|
||||
/**
|
||||
* Takes in a String representation of a cell reference and fills out the
|
||||
* numeric fields.
|
||||
*/
|
||||
public RefPtg(String cellref) {
|
||||
super(new CellReference(cellref));
|
||||
}
|
||||
|
||||
public RefPtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
|
||||
super(row, column, isRowRelative, isColumnRelative);
|
||||
}
|
||||
|
||||
public RefPtg(LittleEndianInput in) {
|
||||
super(in);
|
||||
}
|
||||
|
||||
public RefPtg(CellReference cr) {
|
||||
super(cr);
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
}
|
117
src/java/org/apache/poi/ss/formula/ptg/RefPtgBase.java
Normal file
117
src/java/org/apache/poi/ss/formula/ptg/RefPtgBase.java
Normal file
@ -0,0 +1,117 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.util.BitField;
|
||||
import org.apache.poi.util.BitFieldFactory;
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* ReferencePtgBase - handles references (such as A1, A2, IA4)
|
||||
*
|
||||
* @author Andrew C. Oliver (acoliver@apache.org)
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public abstract class RefPtgBase extends OperandPtg {
|
||||
|
||||
/** The row index - zero based unsigned 16 bit value */
|
||||
private int field_1_row;
|
||||
/**
|
||||
* Field 2 - lower 8 bits is the zero based unsigned byte column index - bit
|
||||
* 16 - isRowRelative - bit 15 - isColumnRelative
|
||||
*/
|
||||
private int field_2_col;
|
||||
private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000);
|
||||
private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
|
||||
|
||||
/**
|
||||
* YK: subclasses of RefPtgBase are used by the FormulaParser and FormulaEvaluator accross HSSF and XSSF.
|
||||
* The bit mask should accomodate the maximum number of avaiable columns, i.e. 0x3FFF.
|
||||
*
|
||||
* @see org.apache.poi.ss.SpreadsheetVersion
|
||||
*/
|
||||
private static final BitField column = BitFieldFactory.getInstance(0x3FFF);
|
||||
|
||||
protected RefPtgBase() {
|
||||
// Required for clone methods
|
||||
}
|
||||
|
||||
protected RefPtgBase(CellReference c) {
|
||||
setRow(c.getRow());
|
||||
setColumn(c.getCol());
|
||||
setColRelative(!c.isColAbsolute());
|
||||
setRowRelative(!c.isRowAbsolute());
|
||||
}
|
||||
|
||||
protected final void readCoordinates(LittleEndianInput in) {
|
||||
field_1_row = in.readUShort();
|
||||
field_2_col = in.readUShort();
|
||||
}
|
||||
|
||||
protected final void writeCoordinates(LittleEndianOutput out) {
|
||||
out.writeShort(field_1_row);
|
||||
out.writeShort(field_2_col);
|
||||
}
|
||||
|
||||
public final void setRow(int rowIndex) {
|
||||
field_1_row = rowIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the row number as an int
|
||||
*/
|
||||
public final int getRow() {
|
||||
return field_1_row;
|
||||
}
|
||||
|
||||
public final boolean isRowRelative() {
|
||||
return rowRelative.isSet(field_2_col);
|
||||
}
|
||||
|
||||
public final void setRowRelative(boolean rel) {
|
||||
field_2_col = rowRelative.setBoolean(field_2_col, rel);
|
||||
}
|
||||
|
||||
public final boolean isColRelative() {
|
||||
return colRelative.isSet(field_2_col);
|
||||
}
|
||||
|
||||
public final void setColRelative(boolean rel) {
|
||||
field_2_col = colRelative.setBoolean(field_2_col, rel);
|
||||
}
|
||||
|
||||
public final void setColumn(int col) {
|
||||
field_2_col = column.setValue(field_2_col, col);
|
||||
}
|
||||
|
||||
public final int getColumn() {
|
||||
return column.getValue(field_2_col);
|
||||
}
|
||||
|
||||
protected final String formatReferenceAsString() {
|
||||
// Only make cell references as needed. Memory is an issue
|
||||
CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(), !isColRelative());
|
||||
return cr.formatAsString();
|
||||
}
|
||||
|
||||
public final byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_REF;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
|
||||
/**
|
||||
* Common superclass of all {@link Ptg}s that represent simple constant values.
|
||||
*
|
||||
* @author Josh Micich
|
||||
*/
|
||||
public abstract class ScalarConstantPtg extends Ptg {
|
||||
public final boolean isBaseToken() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public final byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_VALUE;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
StringBuffer sb = new StringBuffer(64);
|
||||
sb.append(getClass().getName()).append(" [");
|
||||
sb.append(toFormulaString());
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
108
src/java/org/apache/poi/ss/formula/ptg/StringPtg.java
Normal file
108
src/java/org/apache/poi/ss/formula/ptg/StringPtg.java
Normal file
@ -0,0 +1,108 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
import org.apache.poi.util.StringUtil;
|
||||
|
||||
/**
|
||||
* String Stores a String value in a formula value stored in the format
|
||||
* <length 2 bytes>char[]
|
||||
*
|
||||
* @author Werner Froidevaux
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
* @author Bernard Chesnoy
|
||||
*/
|
||||
public final class StringPtg extends ScalarConstantPtg {
|
||||
public final static byte sid = 0x17;
|
||||
/** the character (") used in formulas to delimit string literals */
|
||||
private static final char FORMULA_DELIMITER = '"';
|
||||
|
||||
private final boolean _is16bitUnicode;
|
||||
/**
|
||||
* NOTE: OO doc says 16bit length, but BiffViewer says 8 Book says something
|
||||
* totally different, so don't look there!
|
||||
*/
|
||||
private final String field_3_string;
|
||||
|
||||
/** Create a StringPtg from a stream */
|
||||
public StringPtg(LittleEndianInput in) {
|
||||
int nChars = in.readUByte(); // Note - nChars is 8-bit
|
||||
_is16bitUnicode = (in.readByte() & 0x01) != 0;
|
||||
if (_is16bitUnicode) {
|
||||
field_3_string = StringUtil.readUnicodeLE(in, nChars);
|
||||
} else {
|
||||
field_3_string = StringUtil.readCompressedUnicode(in, nChars);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a StringPtg from a string representation of the number Number
|
||||
* format is not checked, it is expected to be validated in the parser that
|
||||
* calls this method.
|
||||
*
|
||||
* @param value :
|
||||
* String representation of a floating point number
|
||||
*/
|
||||
public StringPtg(String value) {
|
||||
if (value.length() > 255) {
|
||||
throw new IllegalArgumentException(
|
||||
"String literals in formulas can't be bigger than 255 characters ASCII");
|
||||
}
|
||||
_is16bitUnicode = StringUtil.hasMultibyte(value);
|
||||
field_3_string = value;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return field_3_string;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeByte(field_3_string.length()); // Note - nChars is 8-bit
|
||||
out.writeByte(_is16bitUnicode ? 0x01 : 0x00);
|
||||
if (_is16bitUnicode) {
|
||||
StringUtil.putUnicodeLE(field_3_string, out);
|
||||
} else {
|
||||
StringUtil.putCompressedUnicode(field_3_string, out);
|
||||
}
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return 3 + field_3_string.length() * (_is16bitUnicode ? 2 : 1);
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
String value = field_3_string;
|
||||
int len = value.length();
|
||||
StringBuffer sb = new StringBuffer(len + 4);
|
||||
sb.append(FORMULA_DELIMITER);
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
char c = value.charAt(i);
|
||||
if (c == FORMULA_DELIMITER) {
|
||||
sb.append(FORMULA_DELIMITER);
|
||||
}
|
||||
sb.append(c);
|
||||
}
|
||||
|
||||
sb.append(FORMULA_DELIMITER);
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
50
src/java/org/apache/poi/ss/formula/ptg/SubtractPtg.java
Normal file
50
src/java/org/apache/poi/ss/formula/ptg/SubtractPtg.java
Normal file
@ -0,0 +1,50 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public final class SubtractPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x04;
|
||||
|
||||
public static final ValueOperatorPtg instance = new SubtractPtg();
|
||||
|
||||
private SubtractPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append("-");
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
80
src/java/org/apache/poi/ss/formula/ptg/TblPtg.java
Normal file
80
src/java/org/apache/poi/ss/formula/ptg/TblPtg.java
Normal file
@ -0,0 +1,80 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianInput;
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* This ptg indicates a data table.
|
||||
* It only occurs in a FORMULA record, never in an
|
||||
* ARRAY or NAME record. When ptgTbl occurs in a
|
||||
* formula, it is the only token in the formula.
|
||||
*
|
||||
* This indicates that the cell containing the
|
||||
* formula is an interior cell in a data table;
|
||||
* the table description is found in a TABLE
|
||||
* record. Rows and columns which contain input
|
||||
* values to be substituted in the table do
|
||||
* not contain ptgTbl.
|
||||
* See page 811 of the june 08 binary docs.
|
||||
*/
|
||||
public final class TblPtg extends ControlPtg {
|
||||
private final static int SIZE = 5;
|
||||
public final static short sid = 0x02;
|
||||
/** The row number of the upper left corner */
|
||||
private final int field_1_first_row;
|
||||
/** The column number of the upper left corner */
|
||||
private final int field_2_first_col;
|
||||
|
||||
public TblPtg(LittleEndianInput in) {
|
||||
field_1_first_row = in.readUShort();
|
||||
field_2_first_col = in.readUShort();
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
out.writeShort(field_1_first_row);
|
||||
out.writeShort(field_2_first_col);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public int getRow() {
|
||||
return field_1_first_row;
|
||||
}
|
||||
|
||||
public int getColumn() {
|
||||
return field_2_first_col;
|
||||
}
|
||||
|
||||
public String toFormulaString()
|
||||
{
|
||||
// table(....)[][]
|
||||
throw new RuntimeException("Table and Arrays are not yet supported");
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer buffer = new StringBuffer("[Data Table - Parent cell is an interior cell in a data table]\n");
|
||||
buffer.append("top left row = ").append(getRow()).append("\n");
|
||||
buffer.append("top left col = ").append(getColumn()).append("\n");
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
51
src/java/org/apache/poi/ss/formula/ptg/UnaryMinusPtg.java
Normal file
51
src/java/org/apache/poi/ss/formula/ptg/UnaryMinusPtg.java
Normal file
@ -0,0 +1,51 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Unary Plus operator
|
||||
* does not have any effect on the operand
|
||||
* @author Avik Sengupta
|
||||
*/
|
||||
public final class UnaryMinusPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x13;
|
||||
|
||||
private final static String MINUS = "-";
|
||||
|
||||
public static final ValueOperatorPtg instance = new UnaryMinusPtg();
|
||||
|
||||
private UnaryMinusPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** implementation of method from OperationsPtg*/
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append(MINUS);
|
||||
buffer.append(operands[ 0]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
51
src/java/org/apache/poi/ss/formula/ptg/UnaryPlusPtg.java
Normal file
51
src/java/org/apache/poi/ss/formula/ptg/UnaryPlusPtg.java
Normal file
@ -0,0 +1,51 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
/**
|
||||
* Unary Plus operator
|
||||
* does not have any effect on the operand
|
||||
* @author Avik Sengupta
|
||||
*/
|
||||
public final class UnaryPlusPtg extends ValueOperatorPtg {
|
||||
public final static byte sid = 0x12;
|
||||
|
||||
private final static String ADD = "+";
|
||||
|
||||
public static final ValueOperatorPtg instance = new UnaryPlusPtg();
|
||||
|
||||
private UnaryPlusPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
protected byte getSid() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
public int getNumberOfOperands() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** implementation of method from OperationsPtg*/
|
||||
public String toFormulaString(String[] operands) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append(ADD);
|
||||
buffer.append(operands[ 0]);
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
70
src/java/org/apache/poi/ss/formula/ptg/UnionPtg.java
Normal file
70
src/java/org/apache/poi/ss/formula/ptg/UnionPtg.java
Normal file
@ -0,0 +1,70 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
|
||||
/**
|
||||
* @author Glen Stampoultzis (glens at apache.org)
|
||||
*/
|
||||
public final class UnionPtg extends OperationPtg {
|
||||
public final static byte sid = 0x10;
|
||||
|
||||
public static final OperationPtg instance = new UnionPtg();
|
||||
|
||||
private UnionPtg() {
|
||||
// enforce singleton
|
||||
}
|
||||
|
||||
public final boolean isBaseToken() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getSize()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(sid + getPtgClass());
|
||||
}
|
||||
|
||||
public String toFormulaString()
|
||||
{
|
||||
return ",";
|
||||
}
|
||||
|
||||
|
||||
/** implementation of method from OperationsPtg*/
|
||||
public String toFormulaString(String[] operands)
|
||||
{
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append(operands[ 0 ]);
|
||||
buffer.append(",");
|
||||
buffer.append(operands[ 1 ]);
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
public int getNumberOfOperands()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
}
|
50
src/java/org/apache/poi/ss/formula/ptg/UnknownPtg.java
Normal file
50
src/java/org/apache/poi/ss/formula/ptg/UnknownPtg.java
Normal file
@ -0,0 +1,50 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* @author andy
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
public class UnknownPtg extends Ptg {
|
||||
private short size = 1;
|
||||
private final int _sid;
|
||||
|
||||
public UnknownPtg(int sid) {
|
||||
_sid = sid;
|
||||
}
|
||||
|
||||
public boolean isBaseToken() {
|
||||
return true;
|
||||
}
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(_sid);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public String toFormulaString() {
|
||||
return "UNKNOWN";
|
||||
}
|
||||
public byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_VALUE;
|
||||
}
|
||||
}
|
56
src/java/org/apache/poi/ss/formula/ptg/ValueOperatorPtg.java
Normal file
56
src/java/org/apache/poi/ss/formula/ptg/ValueOperatorPtg.java
Normal file
@ -0,0 +1,56 @@
|
||||
/* ====================================================================
|
||||
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.ptg;
|
||||
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
|
||||
/**
|
||||
* Common superclass of all value operators. Subclasses include all unary and
|
||||
* binary operators except for the reference operators (IntersectionPtg,
|
||||
* RangePtg, UnionPtg)
|
||||
*
|
||||
* @author Josh Micich
|
||||
*/
|
||||
public abstract class ValueOperatorPtg extends OperationPtg {
|
||||
|
||||
/**
|
||||
* All Operator <tt>Ptg</tt>s are base tokens (i.e. are not RVA classified)
|
||||
*/
|
||||
public final boolean isBaseToken() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public final byte getDefaultOperandClass() {
|
||||
return Ptg.CLASS_VALUE;
|
||||
}
|
||||
|
||||
public void write(LittleEndianOutput out) {
|
||||
out.writeByte(getSid());
|
||||
}
|
||||
|
||||
protected abstract byte getSid();
|
||||
|
||||
public final int getSize() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
public final String toFormulaString() {
|
||||
// TODO - prune this method out of the hierarchy
|
||||
throw new RuntimeException("toFormulaString(String[] operands) should be used for subclasses of OperationPtgs");
|
||||
}
|
||||
}
|
38
src/java/org/apache/poi/ss/formula/ptg/package.html
Normal file
38
src/java/org/apache/poi/ss/formula/ptg/package.html
Normal file
@ -0,0 +1,38 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
||||
<!--
|
||||
====================================================================
|
||||
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.
|
||||
====================================================================
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
|
||||
formula package contains binary PTG structures used in Formulas
|
||||
|
||||
<h2>Related Documentation</h2>
|
||||
|
||||
For overviews, tutorials, examples, guides, and tool documentation, please see:
|
||||
<ul>
|
||||
<li><a href="http://poi.apache.org">Apache POI Project</a>
|
||||
</ul>
|
||||
|
||||
<!-- Put @see and @since tags down here. -->
|
||||
@see org.apache.poi.hssf.record
|
||||
@see org.apache.poi.hssf.record.FormulaRecord
|
||||
</body>
|
||||
</html>
|
@ -22,7 +22,7 @@ package org.apache.poi.ss.usermodel;
|
||||
* For a list of all the different fields that can be
|
||||
* placed into a footer, such as page number,
|
||||
* bold, underline etc, see
|
||||
* {@link org.apache.poi.hssf.usermodel.HeaderFooter}.
|
||||
* {@link org.apache.poi.ss.usermodel.HeaderFooter}.
|
||||
*/
|
||||
public interface Footer extends HeaderFooter {
|
||||
/**
|
||||
|
@ -22,7 +22,7 @@ package org.apache.poi.ss.usermodel;
|
||||
* For a list of all the different fields that can be
|
||||
* placed into a header, such as page number,
|
||||
* bold, underline etc, see
|
||||
* {@link org.apache.poi.hssf.usermodel.HeaderFooter}.
|
||||
* {@link org.apache.poi.ss.usermodel.HeaderFooter}.
|
||||
*/
|
||||
public interface Header extends HeaderFooter {
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user