++ed by:
1 non-PAUSE user
Author image Tony Bowden


Spreadsheet::Engine - Core calculation engine for a spreadsheet


  use Spreadsheet::Engine;
  my $sheet = Spreadsheet::Engine->new;
  my $sheet = Spreadsheet::Engine->load_data([@data]);

  $sheet->execute('set A1 value n 2');
  $sheet->execute('set A2 value n 4');
  $sheet->execute('set A3 formula SUM(A1:A2)');

  my $data = $sheet->raw;
  print $data->{datavalues}{A3}; # 6


This provides back-end spreadsheet functionality for creating a sheet, setting cells to have values or formulae, and performing all necessary calculations. There is no front-end UI provided - this is purely the calculation engine.

Over 110 spreadsheet functions are provided: see Spreadsheet::Engine::Function::* and Spreadsheet::Engine::Functions for the full list.



  my $sheet = Spreadsheet::Engine->new;

Instantiate a new blank spreadsheet.


  my $sheet = Spreadsheet::Engine->load_data([@data]);

Instantiate a sheet from lines of data in the saved file format (see Spreadsheet::Engine::Sheet for documentation)


  $sheet->execute('set A1 value n 2');
  $sheet->execute('set A2 value n 4');
  $sheet->execute('set A3 formula SUM(A1:A2)');

Execute the given command against the sheet. See Spreadsheet::Engine::Sheet for documentation of commands.



Recalculate the values for all formulae in the sheet. This never happens automatically - it must be explicitly called.


  my $data = $sheet->raw;
  print $data->{datavalues}{A3}; # 6

Access the raw datastructure for the sheet. This is a temporary method until we provide proper accessors to the underlying data.


Although the core underlying code is relatively mature and featureful, there will be significant interface changes and refactoring going forward with this version. As well as any bugs in the original SocialCalc code, the process of rearranging the code is likely to introduce more.

There is a reasonably complete test suite for most of the functions, but much of the other code is as yet untested. (See 'coverage.txt' in the root directory of the distribution for a little more detail).

Please pay close attention to the CHANGES file if you upgrade this package.


Spreadsheet::Engine attemps to conform as closely as possible to the Open Formula specification and provide all the features of the "Small" group as defined there. Divergences from that are detailed below. It is hoped to add the extra functionality of the "Medium" and "Large" groups eventually, but the initial work is on refactoring the code base to make it easier for users to plug in their own extensions to provide more of that functionality.

The latest version of the specification can be found at http://www.oasis-open.org/committees/office


On top of the "Small" group functionality the following features are provided:

  • "Year 1583": Dates between 1583 and 1900 are handled correctly.

  • Text is automatically converted to numbers in some (but not all) circumstances (see t/of-autonum.t gives examples)

  • PLAINTEXT() and HTML() functions


We do not meet the Open Formula specification at the following sections:

  • (4.8.7) Whitespace is significant in database tests: '> 2006-01-01

  • (5.6) Empty parameters cannot be omitted: IF(FALSE(),7,)

  • (5.8) Semicolon is sometimes not recognised as a separator in function calls, cell/range lists, etc.: SUM(A1;B2;B3), IF(FALSE();7;8)

  • (5.8) Cell references of the form [.B1] are not supported

  • (5.8) References to other sheets are not supported (this feature is in SocialCalc, but for now is out of scope for this engine)

  • (5.10.1) Range names cannot contain unicode characters

  • (5.10.1) Range names do not support $$ markers

  • (5.11) Errors cannot be as strings (#N/A, #DIV/0! etc) in formulae

  • (6.2.4) Empty cell in numeric context is not treated as 0

  • (6.2.4) Reference to TRUE in numeric context is not treated as 0

  • (6.3.10) Whitespace is significant in string-concatenation using &

  • (6.3.2) Whitespace is significant in unary minus: (5 - - 2) vs (5--2)

  • (6.3.6) Different types can be equal: 5 = "5"

  • (6.3.9) Range extensions are not implemented: B4:C4:C5

  • (6.3.11) Range intersections are not implemented: B3:B5!B5:B6

  • (6.3.14) Strings are converted to number with prefix +: +"Hello"

  • (6.9.1) Roll-over dates may not be correct (DATE(2006,25,34) = 2008-02-05 vs 2008-02-03)

  • (6.12.5) COUNT() includes TRUE/FALSE values

  • (6.12.32) VALUE("-1 1/2") is interpreted (-1)+(1/2) not -1.5

  • (6.12.32) VALUE("3/32/2006") is interpreted as 1st April 2006

  • (6.12.32) VALUE does not raise error for false leap years

  • (6.12.32) Cannot take VALUE() of a datetime (with space or T)

  • (6.12.32) Cannot enter dates with alphabetic month names

  • (6.14.3) IF() does not have default ifTrue/ifFalse values

  • (6.15.29) FACT() operates on negative numbers

  • (6.15.44) PRODUCT() with no paramters is an error

  • (6.17.45) MIN("a") returns 0 rather than an error

  • (6.19.11) LEFT() does not have a default length

  • (6.19.14) MID() with a start beyond string returns undef

  • (6.19.18) RIGHT() does not have a default length


  • (6.13.11) VLOOKUP for an integer must be exact, not <=

  • (6.19.14) MID() does not accept a zero length

  • (6.15.37) LOG() does not default to base 10


The original Spreadsheet::Engine code was taken from SocialCalc version 1.1.0, which in turn originated as wikiCalc(R) version 1.0.


Spreadsheet::Engine is developed and maintained by Tony Bowden <tony@tmtm.com>

SocialCalc 1.1.0 was developed by Dan Bricklin, Casey West, and Tony Bowden, at Socialtext, Inc.

wikiCalc was developed by Dan Bricklin, at Software Garden, Inc.


Portions (c) Copyright 2005, 2006, 2007 Software Garden, Inc. All Rights Reserved.

Portions (c) Copyright 2007 Socialtext, Inc. All Rights Reserved.

Portions (c) Copyright 2007, 2008 Tony Bowden. Some Rights Reserved.


The contents of this file are subject to the Artistic License 2.0; you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.perlfoundation.org/artistic_license_2_0