Documentation ¶
Overview ¶
Package formula provides formula parsing and evaluation. The lexer is implemented with a ragel grammar while the the parser is implemented with goyacc. The entire formula grammar is not implemented and not all functions are supported yet. For compatibility sake, upon failure to parse or execute a formula, gooxml leaves cached formula results blank allowing Excel to compute formulas upon load. This is similar to what most other Excel libraries do which leave all cached results blank instead of attempting to execute formulas.
The unit tests for this package are unique in that we can take advantage of "cached" formula results that Excel/LibreOffice write to the sheet. These are the computed results of a formula in string form. By comparing these values to the value computed by the gooxml evaluation of the formula, adding a new test means just adding a new formula to one of the reference sheets with Excel. During the unit test, we evaluate the formula and compare it to the value that Excel computed. If they're the same, the test passes.
Index ¶
- Variables
- func LexReader(r io.Reader) chan *node
- func ParseCellReference(s string) (col string, row uint32, err error)
- func RegisterFunction(name string, fn Function)
- func RegisterFunctionComplex(name string, fn FunctionComplex)
- func SupportedFunctions() []string
- type BinOpType
- type BinaryExpr
- type Bool
- type CellRef
- type ConstArrayExpr
- type Context
- type EmptyExpr
- type Error
- type ErrorType
- type Evaluator
- type Expression
- func NewBinaryExpr(lhs Expression, op BinOpType, rhs Expression) Expression
- func NewBool(v string) Expression
- func NewCellRef(v string) Expression
- func NewConstArrayExpr(data [][]Expression) Expression
- func NewEmptyExpr() Expression
- func NewError(v string) Expression
- func NewFunction(name string, args []Expression) Expression
- func NewNamedRangeRef(v string) Expression
- func NewNegate(e Expression) Expression
- func NewNumber(v string) Expression
- func NewPrefixExpr(pfx, exp Expression) Expression
- func NewRange(from, to Expression) Expression
- func NewSheetPrefixExpr(s string) Expression
- func NewString(v string) Expression
- func Parse(r io.Reader) Expression
- func ParseString(s string) Expression
- type Function
- type FunctionCall
- type FunctionComplex
- type Lexer
- type NamedRangeRef
- type Negate
- type Number
- type PrefixExpr
- type Range
- type Reference
- type ReferenceType
- type Result
- func And(args []Result) Result
- func Arabic(args []Result) Result
- func Atan2(args []Result) Result
- func Average(args []Result) Result
- func Averagea(args []Result) Result
- func Base(args []Result) Result
- func Ceiling(args []Result) Result
- func CeilingMath(args []Result) Result
- func CeilingPrecise(args []Result) Result
- func Char(args []Result) Result
- func Clean(args []Result) Result
- func Code(args []Result) Result
- func Combin(args []Result) Result
- func Combina(args []Result) Result
- func Concatenate(args []Result) Result
- func Count(args []Result) Result
- func CountBlank(args []Result) Result
- func Counta(args []Result) Result
- func Decimal(args []Result) Result
- func Degrees(args []Result) Result
- func Even(args []Result) Result
- func Exact(args []Result) Result
- func Fact(args []Result) Result
- func FactDouble(args []Result) Result
- func False(args []Result) Result
- func Floor(args []Result) Result
- func FloorMath(args []Result) Result
- func FloorPrecise(args []Result) Result
- func GCD(args []Result) Result
- func HLookup(args []Result) Result
- func If(args []Result) Result
- func IfError(args []Result) Result
- func IfNA(args []Result) Result
- func Index(args []Result) Result
- func Indirect(ctx Context, ev Evaluator, args []Result) Result
- func Int(args []Result) Result
- func LCM(args []Result) Result
- func Left(args []Result) Result
- func Len(args []Result) Result
- func Log(args []Result) Result
- func Lookup(args []Result) Result
- func Lower(args []Result) Result
- func MDeterm(args []Result) Result
- func MakeArrayResult(arr [][]Result) Result
- func MakeBoolResult(b bool) Result
- func MakeEmptyResult() Result
- func MakeErrorResult(msg string) Result
- func MakeErrorResultType(t ErrorType, msg string) Result
- func MakeListResult(list []Result) Result
- func MakeNumberResult(v float64) Result
- func MakeStringResult(s string) Result
- func Max(args []Result) Result
- func Median(args []Result) Result
- func Min(args []Result) Result
- func Mod(args []Result) Result
- func Mround(args []Result) Result
- func Multinomial(args []Result) Result
- func Munit(args []Result) Result
- func NA(args []Result) Result
- func Not(args []Result) Result
- func Odd(args []Result) Result
- func Offset(ctx Context, ev Evaluator, args []Result) Result
- func Or(args []Result) Result
- func Pi(args []Result) Result
- func Power(args []Result) Result
- func Product(args []Result) Result
- func Proper(args []Result) Result
- func Quotient(args []Result) Result
- func Radians(args []Result) Result
- func Rand(args []Result) Result
- func RandBetween(args []Result) Result
- func Rept(args []Result) Result
- func Right(args []Result) Result
- func Roman(args []Result) Result
- func Round(args []Result) Result
- func RoundDown(args []Result) Result
- func RoundUp(args []Result) Result
- func SeriesSum(args []Result) Result
- func Sign(args []Result) Result
- func Sum(args []Result) Result
- func SumProduct(args []Result) Result
- func SumSquares(args []Result) Result
- func T(args []Result) Result
- func Transpose(args []Result) Result
- func Trim(args []Result) Result
- func True(args []Result) Result
- func Trunc(args []Result) Result
- func Unicode(args []Result) Result
- func Upper(args []Result) Result
- func VLookup(args []Result) Result
- func Xor(args []Result) Result
- type ResultType
- type SheetPrefixExpr
- type String
Constants ¶
This section is empty.
Variables ¶
var InvalidReferenceContext = &ivr{}
InvalidReferenceContext is a Context that can be used when evaluating an invalid reference (e.g. referencing a non-existent sheet). It implements Context safely, but returns error results.
var ReferenceInvalid = Reference{Type: ReferenceTypeInvalid}
Functions ¶
func ParseCellReference ¶
TODO: move these somewhere to remove duplication
func RegisterFunction ¶
RegisterFunction registers a standard function.
func RegisterFunctionComplex ¶
func RegisterFunctionComplex(name string, fn FunctionComplex)
RegisterFunctionComplex registers a standard function.
func SupportedFunctions ¶
func SupportedFunctions() []string
SupportedFunctions returns a list of supported functions.
Types ¶
type BinOpType ¶
type BinOpType byte
BinOpType is the binary operation operator type
type BinaryExpr ¶
type BinaryExpr struct {
// contains filtered or unexported fields
}
BinaryExpr is a binary expression.
type CellRef ¶
type CellRef struct {
// contains filtered or unexported fields
}
CellRef is a reference to a single cell
type ConstArrayExpr ¶
type ConstArrayExpr struct {
// contains filtered or unexported fields
}
type Context ¶
type Context interface { // Cell returns the result of evaluating a cell. Cell(ref string, ev Evaluator) Result // Sheet returns an evaluation context for a given sheet name. This is used // when evaluating cells that pull data from other sheets (e.g. ='Sheet 2'!A1) Sheet(name string) Context // NamedRange returns a named range. NamedRange(name string) Reference // SetOffset is used so that the Context can evaluate cell references // differently when they are not absolute (e.g. not like '$A$5'). See the // shared formula support in Cell for usage. SetOffset(col, row uint32) }
Context is a formula execution context. Formula evaluation uses the context to retreive information from sheets.
type Evaluator ¶
Evaluator is the interface for a formula evaluator. This is needed so we can pass it to the spreadsheet to let it evaluate formula cells before returning the results.
func NewEvaluator ¶
func NewEvaluator() Evaluator
type Expression ¶
type Expression interface { Eval(ctx Context, ev Evaluator) Result Reference(ctx Context, ev Evaluator) Reference }
func NewBinaryExpr ¶
func NewBinaryExpr(lhs Expression, op BinOpType, rhs Expression) Expression
NewBinaryExpr constructs a new binary expression with a given operator.
func NewBool ¶
func NewBool(v string) Expression
func NewConstArrayExpr ¶
func NewConstArrayExpr(data [][]Expression) Expression
func NewEmptyExpr ¶
func NewEmptyExpr() Expression
func NewError ¶
func NewError(v string) Expression
func NewFunction ¶
func NewFunction(name string, args []Expression) Expression
func NewNamedRangeRef ¶
func NewNamedRangeRef(v string) Expression
NewNamedRangeRef constructs a new named range reference.
func NewNegate ¶
func NewNegate(e Expression) Expression
func NewNumber ¶
func NewNumber(v string) Expression
func NewPrefixExpr ¶
func NewPrefixExpr(pfx, exp Expression) Expression
func NewSheetPrefixExpr ¶
func NewSheetPrefixExpr(s string) Expression
func NewString ¶
func NewString(v string) Expression
func Parse ¶
func Parse(r io.Reader) Expression
func ParseString ¶
func ParseString(s string) Expression
type Function ¶
Function is a standard function whose result only depends on its arguments.
func LookupFunction ¶
LookupFunction looks up and returns a standard function or nil.
type FunctionCall ¶
type FunctionCall struct {
// contains filtered or unexported fields
}
type FunctionComplex ¶
FunctionComplex is a function whose result depends on its arguments and the context that it's in. As an example, INDIRECT is a complex function so that INDIRECT("A1") which returns the value of the "A1" cell in a sheet can use the context to reach into the sheet and pull out required values.
func LookupFunctionComplex ¶
func LookupFunctionComplex(name string) FunctionComplex
LookupFunctionComplex looks up and returns a complex function or nil.
type NamedRangeRef ¶
type NamedRangeRef struct {
// contains filtered or unexported fields
}
NamedRangeRef is a reference to a named range
type PrefixExpr ¶
type PrefixExpr struct {
// contains filtered or unexported fields
}
type Range ¶
type Range struct {
// contains filtered or unexported fields
}
Range is a range expression that when evaluated returns a list of Results.
type Reference ¶
type Reference struct { Type ReferenceType Value string }
func MakeRangeReference ¶
type ReferenceType ¶
type ReferenceType byte
ReferenceType is a type of reference
const ( ReferenceTypeInvalid ReferenceType = iota ReferenceTypeCell ReferenceTypeNamedRange ReferenceTypeRange ReferenceTypeSheet )
func (ReferenceType) String ¶
func (i ReferenceType) String() string
type Result ¶
type Result struct { ValueNumber float64 ValueString string ValueList []Result ValueArray [][]Result ErrorMessage string Type ResultType Ref Reference }
Result is the result of a formula or cell evaluation .
func Arabic ¶
Arabic implements the Excel ARABIC function which parses roman numerals. It accepts one numeric argument.
func Atan2 ¶
Atan2 implements the Excel ATAN2 function. It accepts two numeric arguments, and the arguments are (x,y), reversed from normal to match Excel's behaviour.
func Average ¶
Average implements the AVERAGE function. It differs slightly from Excel (and agrees with LibreOffice) in that boolean values are counted. As an example, AVERAGE of two cells containing TRUE & FALSE is 0.5 in LibreOffice and #DIV/0! in Excel. gooxml will return 0.5 in this case.
func Averagea ¶
Averagea implements the AVERAGEA function, AVERAGEA counts cells that contain text as a zero where AVERAGE ignores them entirely.
func Base ¶
Base is an implementation of the Excel BASE function that returns a string form of an integer in a specified base and of a minimum length with padded zeros.
func Ceiling ¶
Ceiling is an implementation of the CEILING function which returns the ceiling of a number.
func CeilingMath ¶
CeilingMath implements _xlfn.CEILING.MATH which rounds numbers to the nearest multiple of the second argument, toward or away from zero as specified by the third argument.
func CeilingPrecise ¶
CeilingPrecise is an implementation of the CEILING.PRECISE function which returns the ceiling of a number.
func Char ¶
Char is an implementation of the Excel CHAR function that takes an integer in the range [0,255] and returns the corresponding ASCII character.
func Clean ¶
Clean is an implementation of the Excel CLEAN function that removes unprintable characters.
func Code ¶
Code is an implementation of the Excel CODE function that returns the first character of the string as a number.
func Combin ¶
Combin is an implementation of the Excel COMBINA function whic returns the number of combinations.
func Combina ¶
Combina is an implementation of the Excel COMBINA function whic returns the number of combinations with repetitions.
func Concatenate ¶
Concatenate is an implementation of the Excel CONCATENATE() function.
func CountBlank ¶
CountBlank implements the COUNTBLANK function.
func Decimal ¶
Decimal is an implementation of the Excel function DECIMAL() that parses a string in a given base and returns the numeric result.
func Degrees ¶
Degrees is an implementation of the Excel function DEGREES() that converts radians to degrees.
func Even ¶
Even is an implementation of the Excel EVEN() that rounds a number to the nearest even integer.
func Fact ¶
Fact is an implementation of the excel FACT function which returns the factorial of a positive numeric input.
func FactDouble ¶
FactDouble is an implementation of the excel FACTDOUBLE function which returns the double factorial of a positive numeric input.
func FloorMath ¶
FloorMath implements _xlfn.FLOOR.MATH which rounds numbers down to the nearest multiple of the second argument, toward or away from zero as specified by the third argument.
func FloorPrecise ¶
FloorPrecise is an implementation of the FlOOR.PRECISE function.
func GCD ¶
GCD implements the Excel GCD() function which returns the greatest common divisor of a range of numbers.
func HLookup ¶
HLookup implements the HLOOKUP function that returns a matching value from a row in an array.
func IfError ¶
IfError is an implementation of the Excel IFERROR() function. It takes two arguments.
func Indirect ¶
Indirect is an implementation of the Excel INDIRECT function that returns the contents of a cell.
func Int ¶
Int is an implementation of the Excel INT() function that rounds a number down to an integer.
func LCM ¶
LCM implements the Excel LCM() function which returns the least common multiple of a range of numbers.
func Left ¶
Left implements the Excel LEFT(string,[n]) function which returns the leftmost n characters.
func Log ¶
Log implements the Excel LOG function which returns the log of a number. By default the result is base 10, however the second argument to the function can specify a different base.
func Lookup ¶
Lookup implements the LOOKUP function that returns a matching value from a column, or from the same index in a second column.
func Lower ¶
Lower is an implementation of the Excel LOWER function that returns a lower case version of a string.
func MDeterm ¶
MDeterm is an implementation of the Excel MDETERM which finds the determinant of a matrix.
func MakeArrayResult ¶
MakeArrayResult constructs an array result (matrix).
func MakeBoolResult ¶
MakeBoolResult constructs a boolean result (internally a number).
func MakeEmptyResult ¶
func MakeEmptyResult() Result
MakeEmptyResult is ued when parsing an empty argument.
func MakeErrorResult ¶
MakeErrorResult constructs a #VALUE! error with a given extra error message. The error message is for debugging formula evaluation only and is not stored in the sheet.
func MakeErrorResultType ¶
MakeErrorResultType makes an error result of a given type with a specified debug message
func MakeListResult ¶
MakeListResult constructs a list result.
func MakeNumberResult ¶
MakeNumberResult constructs a number result.
func MakeStringResult ¶
MakeStringResult constructs a string result.
func Mod ¶
Mod is an implementation of the Excel MOD function which returns the remainder after division. It requires two numeric argumnts.
func Mround ¶
Mround is an implementation of the Excel MROUND function. It is not a generic rounding function and has some oddities to match Excel's behavior.
func Multinomial ¶
Multinomial implements the excel MULTINOMIAL function.
func Munit ¶
Munit is an implementation of the Excel MUNIT function that returns an identity matrix.
func Odd ¶
Odd is an implementation of the Excel ODD() that rounds a number to the nearest odd integer.
func Or ¶
Or is an implementation of the Excel OR() function and takes a variable number of arguments.
func Power ¶
Power is an implementation of the Excel POWER function that raises a number to a power. It requires two numeric arguments.
func Proper ¶
Proper is an implementation of the Excel PROPER function that returns a copy of the string with each word capitalized.
func Quotient ¶
Quotient is an implementation of the Excel QUOTIENT function that returns the integer portion of division.
func Radians ¶
Radians is an implementation of the Excel function RADIANS() that converts degrees to radians.
func Rand ¶
Rand is an implementation of the Excel RAND() function that returns random numbers in the range [0,1).
func RandBetween ¶
RandBetween is an implementation of the Excel RANDBETWEEN() function that returns a random integer in the range specified.
func Right ¶
Right implements the Excel RIGHT(string,[n]) function which returns the rightmost n characters.
func Roman ¶
Roman is an implementation of the Excel ROMAN function that convers numbers to roman numerals in one of 5 formats.
func Round ¶
Round is an implementation of the Excel ROUND function that rounds a number to a specified number of digits.
func RoundDown ¶
RoundDown is an implementation of the Excel ROUNDDOWN function that rounds a number down to a specified number of digits.
func RoundUp ¶
RoundUp is an implementation of the Excel ROUNDUP function that rounds a number up to a specified number of digits.
func SumProduct ¶
SumProduct is an implementation of the Excel SUMPRODUCT() function.
func SumSquares ¶
SumSquares is an implementation of the Excel SUMSQ() function.
func Trim ¶
Trim is an implementation of the Excel TRIM function that removes leading, trailing and consecutive spaces.
func Upper ¶
Upper is an implementation of the Excel UPPER function that returns a upper case version of a string.
func VLookup ¶
VLookup implements the VLOOKUP function that returns a matching value from a column in an array.
func Xor ¶
Xor is an implementation of the Excel XOR() function and takes a variable number of arguments. It's odd to say the least. If any argument is numeric, it returns true if the number of non-zero numeric arguments is odd and false otherwise. If no argument is numeric, it returns an error.
func (Result) AsNumber ¶
AsNumber attempts to intepret a string cell value as a number. Upon success, it returns a new number result, upon failure it returns the original result. This is used as functions return strings that can then act like number (e.g. LEFT(1.2345,3) + LEFT(1.2345,3) = 2.4)
func (Result) ListValues ¶
ListValues converts an array to a list or returns a lists values. This is used for functions that can accept an array, but don't care about ordering to reuse the list function logic.
type ResultType ¶
type ResultType byte
ResultType is the type of the result
const ( ResultTypeUnknown ResultType = iota ResultTypeNumber ResultTypeString ResultTypeList ResultTypeArray ResultTypeError ResultTypeEmpty )
ResultType constants.
func (ResultType) String ¶
func (i ResultType) String() string
type SheetPrefixExpr ¶
type SheetPrefixExpr struct {
// contains filtered or unexported fields
}
Source Files ¶
- binaryexpr.go
- binoptype_string.go
- bool.go
- cellref.go
- constarrayexpr.go
- context.go
- doc.go
- emptyexpr.go
- error.go
- evaluator.go
- expression.go
- fnindex.go
- fninformation.go
- fnlogical.go
- fnmathtrig.go
- fnstatistical.go
- fntext.go
- functioncall.go
- grammar.go
- invalidreferencecontext.go
- lex.go
- lexer.go
- namedrangeref.go
- negate.go
- number.go
- parser.go
- prefixexpr.go
- range.go
- reference.go
- referencetype_string.go
- register.go
- result.go
- resulttype_string.go
- sheetprefixexpr.go
- string.go