Commit Graph

34 Commits

Author SHA1 Message Date
Nicolás Hatcher
6f577575c7 UPDATE: Dynamic arrays! 2025-04-17 05:24:26 +02:00
Nicolás Hatcher
9a4e798313 FIX: Make clippy happy. Manual fixes 2025-04-15 15:44:56 +02:00
Nicolás Hatcher
e5ec75495a UPDATE: Introducing Arrays
# This PR introduces:

## Parsing arrays:

{1,2,3} and {1;2;3}

Note that array elements can be numbers, booleans and errors (#VALUE!)

## Evaluating arrays in the SUM function

=SUM({1,2,3}) works!

## Evaluating arithmetic operation with arrays

=SUM({1,2,3} * 8) or =SUM({1,2,3}+{2,4,5}) works

This is done with just one function (handle_arithmetic) for most operations

## Some mathematical functions implement arrays

=SUM(SIN({1,2,3})) works

This is done with macros. See fn_single_number
So that implementing new functions that supports array are easy


# Not done in this PR

## Most functions are not supporting arrays

When that happens we either through #N/IMPL! (not implemented error)
or do implicit intersection. Some functions will be rather trivial to "arraify" some will be hard

## The final result in a cell cannot be an array

The formula ={1,2,3} in a cell will result in #N/IMPL!

## Exporting arrays to Excel might not work correctly

Excel uses the cm (cell metadata) for formulas that contain dynamic arrays.
Although the present PR does not introduce dynamic arrays some formulas like =SUM(SIN({1,2,3}))
is considered a dynamic formula

## There are not a lot of tests in this delivery

The bulk of the tests will be added once we start going function by function# This PR introduces:

## Parsing arrays:

{1,2,3} and {1;2;3}

Note that array elements can be numbers, booleans and errors (#VALUE!)

## Evaluating arrays in the SUM function

=SUM({1,2,3}) works!

## Evaluating arithmetic operation with arrays

=SUM({1,2,3} * 8) or =SUM({1,2,3}+{2,4,5}) works

This is done with just one function (handle_arithmetic) for most operations

## Some mathematical functions implement arrays

=SUM(SIN({1,2,3})) works

This is done with macros. See fn_single_number
So that implementing new functions that supports array are easy


# Not done in this PR

## Most functions are not supporting arrays

When that happens we either through #N/IMPL! (not implemented error)
or do implicit intersection. Some functions will be rather trivial to "arraify" some will be hard

## The final result in a cell cannot be an array

The formula ={1,2,3} in a cell will result in #N/IMPL!

## Exporting arrays to Excel might not work correctly

Excel uses the cm (cell metadata) for formulas that contain dynamic arrays.
Although the present PR does not introduce dynamic arrays some formulas like =SUM(SIN({1,2,3}))
is considered a dynamic formula

## There are not a lot of tests in this delivery

The bulk of the tests will be added once we start going function by function

## The array parsing does not respect the locale

Locales that use ',' as a decimal separator need to use something different for arrays

## The might introduce a small performance penalty

We haven't been benchmarking, and having closures for every arithmetic operation and every function
evaluation will introduce a performance hit. Fixing that in he future is not so hard writing tailored
code for the operation
2025-03-17 20:04:47 +01:00
Nicolás Hatcher
da017b6113 UPDATE: Implement the implicit Intersection Operator
The II operator takes a range and returns a single cell that is in the same column or the same row
as the present cell.

This is needed for backwards compatibility with old Excel models and as a first step towards dynamic arrays.

In the past Excel would evaluate `=A1:A10` in cell `C3` as `A3`, but today in results in an array containing all
values in the range. To be compatible with old workbooks Excel inserts the II operator
on those cases.

So this PR performs an static analysis on all formulas inserting on import automatically the II operator
where necessary. This we call the _automatic implicit operator_. When exporting to Excel the operator is striped away.
You can also manually use the II. For instance `=SUM(@A1:A10)` in cell `C3`.
This was not possible before and such a formula would break backwards compatibility with Excel. To Excel that "non automatic"
form of the II is exported as `_xlfn.SINGLE()`.

Th static analysis has to be done for all arithmetic operations and all functions.
This is a bit of a daunting task and it is not done fully in this PR. We also need to implement arrays and dynamic arrays.
My believe is that once the core operations have been implemented we can go formula by formula writing proper tests and documentation.

After this PR formulas like `=A1:A10` for instance will return `#N/IMPL!` instead of performing the implicit intersection
2025-03-03 21:59:42 +01:00
Nicolás Hatcher
1b7389fd23 FIX: Make Clippy happy
Automatic fixes
2025-01-19 14:31:58 +01:00
Nicolás Hatcher
cbda30f951 FIX: Use 1 as the first serial number corresponding to 1899-12-31 2025-01-01 11:53:05 +01:00
Nicolás Hatcher
c6adf8449b FIX: Dates are only valid up to the last day of 9999 2024-12-30 14:15:09 +01:00
Shalom Yiblet
7c32088480 feat: update date 2024-12-30 13:12:33 +01:00
Nicolás Hatcher
6326c44941 FIX: TRUE and FALSE can also be functions
Previously the engine was internally transforming TRUE() to TRUE

Note that the friendly giant implements this only for
compatibility reasons
2024-12-29 19:17:54 +01:00
Nicolás Hatcher
dc3bf8826b FIX: PV Return #DIV/0! instead of #NUM! if rate = -1 2024-12-27 20:19:32 +01:00
Gian Hancock
655d663590 FIX: Make XOR, OR, AND functions more consistent with Excel
The way these functions interpret their arguments is inconsistent with
Excel in a few ways:

- EmptyCell: Excel ignores arguments evaluating to these types of
  values, treating them as if they didn't exist.

- Text: Text cells are ignored unless they are "TRUE" or "FALSE" (case
  insensitive). EXCEPT if the string value comes from a reference, in
  which case it is always ignored regardless of its value.

- Error if no args: Excel returns a #VALUE! error for these functions if
  no arguments are provided, or if all arguments are ignored (see
  above).

- EmptyArg: Bizarrely, Unlike EmptyCell, EmptyArg is not ignored and is
  treated as if it were FALSE by Excel.

- ErrorPropagation: Excel propagates errors in the arguments and in
  cells belonging to any Range arguments.

Additionally, these functions are not consistent with each other, XOR,
OR, AND vary in how they handle the cases mentioned above.

Rectify these consistency issues by re-implementing them all in terms of
a single base function which is more consistent with Excel behavior.
2024-12-26 15:06:54 +01:00
Nicolás Hatcher
e455ed14ea UPDATE: API for defined names 2024-12-26 10:21:21 +01:00
Nicolás Hatcher
23814ec18c FIX: Several fixes on the FV function
(1+x)^(1+y) was stringifyfied incorrectly
We still need work on this

FV now returns currency

FV(-1,-2,1) should return #DIV/0! not #NUM!
2024-12-14 22:08:44 +01:00
Gian Hancock
17cd1fee96 Validate arg count for OR function
To be compatible with Excel, at least 1 argument is required.

Fixes #175
2024-12-12 13:06:12 +01:00
Andrew Fillmore
d4a2289826 Add GEOMEAN .xlsx, Update .md files, and Run cargo fmt 2024-12-12 05:58:20 +01:00
Andrew Fillmore
4c3374c0de Add GEOMEAN to Functions 2024-12-12 05:58:20 +01:00
Nicolás Hatcher
e065477b5a FIX: Make clippy happy
This is mostly Rust 1.83
2024-11-29 19:55:12 +01:00
Nicolás Hatcher
472740f296 UPDATE: Use regex-lite crate instead of of regex
This removes almost 1Mb form the generated wasm(!!!)
2024-11-29 19:55:12 +01:00
Nicolás Hatcher
d70ab85396 FIX: Adds some more tests fro FORMULATEXT 2024-11-27 22:28:07 +01:00
Nicolás Hatcher
726fc1399d UPDATE: Adds FORMULATEXT for Steve 2024-11-27 22:28:07 +01:00
Bruno Carvalhal
be6819fec3 Remove unwrap logic 2024-11-17 16:49:41 +01:00
Bruno Carvalhal
c2a2983937 Add missing UNICODE to to_xlsx_string 2024-11-17 16:49:41 +01:00
Bruno Carvalhal
63817e2d50 Also accept _xlfn.UNICODE 2024-11-17 16:49:41 +01:00
Bruno Carvalhal
028ae1ce98 Change output formatting of UNICODE to Number 2024-11-17 16:49:41 +01:00
Bruno Carvalhal
0b1199056f Remove unneeded comment 2024-11-17 16:49:41 +01:00
Bruno Carvalhal
726bf677ed Implement UNICODE function 2024-11-17 16:49:41 +01:00
Nicolás Hatcher
420ea9829c FIX: Refactor some finatial functions to use common code 2024-11-17 11:59:10 +01:00
Nicolás Hatcher
49ae2d8915 FIX: Forbid unwrap, expect and panic in the base code 2024-11-17 11:59:10 +01:00
Nicolás Hatcher
bdd2c8fe04 FIX: Fix several indentation issues in comments
Thanks clippy!
2024-11-17 11:59:10 +01:00
Nicolás Hatcher Andrés
489027991c UPDATE: Adds Web browser wasm bindings (#30)
* UPDATE: Adds Web browser wasm bindings

* FIX: install wasm-pack in the GitHub actions
2024-04-07 12:41:33 +02:00
Nicolás Hatcher Andrés
d445553d85 UPDATE: Adds 'user model' API (#27)
* bump version for documentation
* Fixes wrong doc comment
* renames old APIs to be consistent
2024-04-03 22:41:15 +02:00
Nicolás Hatcher Andrés
0029901ca3 UPDATE: Adds minimal generated documented functions (#22)
See #21
2024-03-16 12:57:25 +01:00
Nicolas Hatcher
ab2f1f10fc FIX: Consolidate two structs 2024-02-20 15:19:05 +01:00
Nicolás Hatcher
c5b8efd83d UPDATE: Dump of initial files 2023-11-20 10:46:19 +01:00