Commit Graph

1055 Commits

Author SHA1 Message Date
MarkBaker fda996e192 Initial work on handling Structured References in the Calculation Engine 2022-12-24 00:20:10 +01:00
MarkBaker 70e668a593 Unit Tests 2022-12-21 12:26:14 +01:00
MarkBaker ca7226e9d7 Ensure that Full Table Structured References are correctly recognised, and don't throw an error 2022-12-19 04:44:24 +01:00
MarkBaker 5839533dc1 Handling the new _xlws. prefix used for SORT() and FILTER() functions in both the Calculation Engine, and in the Xlsx Writer
Create stubs for new uncategorised ANCHORARRAY(), LAMBDA(), and SINGLE(); and for the new Logical functions BYCOL() and BYROW()
2022-12-15 13:16:45 +01:00
MarkBaker 379e3fc5a5 Additional unit tests for Table Writer 2022-12-13 16:00:22 +01:00
MarkBaker f350037ba1 Allow option for disabled filtering on tables 2022-12-13 11:01:29 +01:00
oleibman 29b07a7c86 Namespace-Aware Code for SheetViewOptions, SheetProtection (minor break) (#3230)
* Namespace-Aware Code for SheetViewOptions, SheetProtection (minor break)

This is fairly straightforward for SheetViewOptions.

SheetProtection is a bit less straightforward. All the attributes should allow for null as well as boolean; this is especially important because Excel defaults to true for some of them and false for others (existing code always treated attributes missing from the XML as false). DocBlocks are updated to indicate the defaults. The test for isProtectionEnabled is changed to reflect this reality. Also, PhpSpreadsheet has been using true/false when writing these, but Excel uses 1/0. Because of these differences, this is a breaking change, but the consequences of the breaks should be minor. Two unit test results needed to change.

Remaining areas in Reader/Xlsx which still use the namespace-unaware code include conditional formatting (internal or external), auto filters, unparsed loaded data, data validation (internal or external), alternate content, and header/footer images.

* Corrections to Xls Reader and Writer

New test and changed sample to go with code changes. Also doc change.
2022-12-11 17:38:26 -08:00
Mark Baker d5587e9d22 Merge branch 'master' into Structured-References_On-Changing-a-Column-Heading 2022-12-10 15:20:47 +01:00
MarkBaker 6e4a875aea Unit Tests for changing the value of a column header in a Table 2022-12-10 15:04:54 +01:00
Mark Baker e5be169e17 Merge branch 'master' into Refactoring_Function_Tests-Database 2022-12-09 13:36:21 +01:00
MarkBaker 6f6cf60c28 Unit Tests for changing a Table name 2022-12-09 12:38:45 +01:00
MarkBaker 6fd24cad58 Refactor database tests to execute the test itself and check assertions in the main test function, not in the base class
Test both the function implementation (directly), and when the function is called in a formula from a spreadsheet
Replace error strings in expected result for providers with the value returned from the ExcelErrors class
2022-12-08 12:49:19 +01:00
oleibman 057572ee90 Change Additional Statistical Tests to Use Spreadsheet Context (#3217)
* Change Additional Statistical Tests to Use Spreadsheet Context

With an earlier change, I made all but 18 Statistical tests run in spreadsheet context. This PR changes 12 of those 18. The remaining 6 usually return array results, so it is a tougher task to handle them. I will continue to think on it.

AVERAGEIF, AVERAGEIFS, and COUNTBLANK are changed to throw an Exception when a range is specified as a literal. They previously accepted array (enclosed in braces) literals, and bumbled along till they threw an error for non-array literals. Throwing an exception appears to be analogous to how Excel operates, rather than something more friendly like a VALUE error. There may be other functions which require similar treatment.

There also remains a TODO for COUNTIFS, and possibly other functions. It appears that PhpSpreadsheet counts booleans for both integer and string compares and probably shouldn't. Again, this is a problem for another day.

* Scrutinizer

Fix one problem.

* Scrutinizer Ignores Its Own Suggested Remedy

Try another approach.
2022-12-02 14:14:43 -08:00
Adrien Crivelli f122dc62be heredoc syntax does not break indentation anymore 2022-12-02 15:33:30 +01:00
Mark Baker c2571223ff Merge branch 'master' into Issue-3214_Xlsx-Reader-Adjusts-Selected-Cell-when-Loading-CF-Ranges 2022-11-30 11:47:56 +01:00
MarkBaker 71334877c9 Store the currently selected cell when loading Conditional Format Ranges, then reset afterwards 2022-11-30 11:12:33 +01:00
oleibman 58c6e51992 Sync composer.lock/.json and Phpstan Upgrade (#3212)
* Sync composer.lock/.json and Phpstan Upgrade

For some reason, a version newly cloned from master receives a complaint from composer that the lock and json files aren't in sync. So I ran composer update. The only thing that needs special attention is, as usual, Phpstan. There are an unusually large number of new differences when Phpstan is run with Php7.4 vs Php8.1. These are handled easily enough. But Reader/Xlsx seems very fragile; a change which would have eliminated one of the new errors seems to have caused Phpstan to go into a loop, as does an annotation without a code change, and, indeed, as does just about any change to that member. This bears watching, and it's a reason I will delay installing this.

* Deleting Phpstan Cache Helps

It lets me change Reader/Xlsx as I wished. Not a great resolution, but probably good enough. I will continue to think about it for a couple of days.

* Minor DocBlock Changes

Correct some PhpDocumentor problems.
2022-11-27 07:39:24 -08:00
MarkBaker 8a670b0115 Apply Row/column limits (1048576 rows and XFD columns) in the Reference Helper when inserting new rows/columns
Conditional row/column ranges are maintained as cell ranges; and inserting a new column/row pushed these beyond Excel limits, so they aren't maintained when a file is saved
2022-11-26 15:15:53 +01:00
oleibman d2deb133bc Fix Unintential Deprecated Calls in Tests - STATISTICAL (#3181)
* Fix Unintential Deprecated Calls in Tests - STATISTICAL

I think it's best to install these before PR #3166. There are no changes to source code, only to doc-blocks and to test members which continue to inadvertently use calls to deprecated functions.

* Missed One Deprecation

Fix it now.

* Run Tests in Spreadsheet Context

This is quite a bit more difficult for Statistical than for the other Calculation categories. This is partly because of the use of multi-dimensional matrices, and also because some arguments are interpreted differently when they come from a cell rather than entered directly in a formula. This push leaves 18 out of 89 test members unchanged, except that they are marked with a TODO to show that the work isn't finished. I will not revisit them as part of this PR, but probably will take a look in a subsequent ticket.
2022-11-25 13:57:17 -08:00
oleibman 1fcfadc4b8 Fix Unintential Deprecated Calls - Everything Else (#3183)
* Fix Unintential Deprecated Calls - Everything Else

I think it's best to install these before PR #3166. This one, which I hope to be the last in this series, does have some minor changes to source code, as well as to doc-blocks and to test members which continue to inadvertently use calls to deprecated functions.

* Some Remaining Deprecations in Tests

Fix them now.

* Minor Docblock Updates

Worksheet::unprotectCellsByColumnAndRow was incorrect. Other changes are cosmetic, leading to slightly better documentation.

* Update Worksheet.php
2022-11-25 13:06:52 -08:00
MarkBaker 04be65aee8 Allow thousands separator in formatted numeric strings to be handled as numbers by the Calculation Engine 2022-11-25 20:03:48 +01:00
MarkBaker 12581cbb72 Allow thousands separator in percentage formatted strings used as numbers by the Calculation Engine 2022-11-25 19:13:20 +01:00
oleibman a884013d00 Fix Unintential Deprecated Calls in Tests - FINANCIAL (#3180)
* Fix Unintential Deprecated Calls in Tests - FINANCIAL

I think it's best to install these before PR #3166. There are no changes to source code, only to doc-blocks and to test members which continue to inadvertently use calls to deprecated functions.

* Change Tests to Run in Spreadsheet Context

Found and fixed some problems with how MIRR handles errors.
2022-11-25 07:19:19 -08:00
Mark Baker 80e4d3a4ed Merge branch 'master' into currencies_stored_as_strings 2022-11-25 14:04:15 +01:00
MarkBaker 171d7684d6 Allow currency numeric strings with thousands separator 2022-11-25 13:15:10 +01:00
Mark Baker 1152196e32 Merge branch 'master' into CalcEngine-Feature_Structured_References 2022-11-24 23:56:08 +01:00
MarkBaker 57885b916c Validate table name for uniqueness on setting name or binding to a worksheet 2022-11-24 22:01:54 +01:00
oleibman d93a303371 Fix Unintential Deprecated Calls in Tests - ENGINEERING (#3176)
* Fix Unintential Deprecated Calls in Tests - ENGINEERING

I think it's best to install these before PR #3166. There are no changes to source code, only to test members which continue to inadvertently use calls to deprecated functions.

* Fix deprecation DocBlocks

Deprecated->deprecated, adjust see and comments

* Fix Deliberate Deprecated Tests

Add annotations.

* Run Unit Tests in Spreadsheet Context

This turned up only one error, in IMSUB. The only group that still needs this is Statistical. Not sure if I will get to that quickly.
2022-11-24 07:57:41 -08:00
Mark Baker 7d2772ea2d Merge branch 'master' into CalcEngine-Feature_Structured_References 2022-11-23 17:08:29 +01:00
oleibman 3697352e28 Fix Unintential Deprecated Calls in Tests - LOGICAL (#3178)
* Fix Unintential Deprecated Calls in Tests - LOGICAL

I think it's best to install these before PR #3166. There are no changes to source code, only to doc-blocks and to test members which continue to inadvertently use calls to deprecated functions.

* Change Unit Tests to Run in Spreadsheet Context

They had been run as direct calls, which is not how most users would use them. Making this change exposed some minor coding errors - SWITCH needs to flatten its arguments, and IFERROR and IFNA were not handling a null testValue in the same manner as Excel.
2022-11-23 07:49:28 -08:00
Mark Baker b6fda7fd78 Merge branch 'master' into CalcEngine-Feature_Structured_References 2022-11-23 16:10:40 +01:00
oleibman ca1ff07fbe Fix Unintential Deprecated Calls in Tests - DATABASE (#3175)
* Fix Unintential Deprecated Calls in Tests - DATABASE

I think it's best to install these before PR #3166. There are no changes to source code, only to test members which continue to inadvertently use calls to deprecated functions.

* Fix deprecation Blocks

Deprecated->deprecated, adjust see and comments

* Fix Deliberate Deprecated Tests

Add annotations.

* Change Unit Tests to Run in Spreadsheet Context

... rather than as direct calls. The major difference is that specifying an invalid column should result in an Excel error, not null. Minor code changes were needed, including to Statistical/Conditional which sometimes calls Database.

* Correct Some DocBlocks

Null is no longer a possible output for most of these functions.

* 2 Overlooked Tests

Change to run in spreadsheet context.

* T Function Should Return Null-String, not Null

Fix it.
2022-11-23 06:54:51 -08:00
Mark Baker fa6e1791f8 Merge branch 'master' into CalcEngine-Feature_Structured_References 2022-11-23 13:33:50 +01:00
MarkBaker 717ec4f73a Eliminate redundant assignment 2022-11-23 03:38:56 +01:00
Mark Baker f4e5318bb2 Merge branch 'master' into Functionality-Prevent-Serialization 2022-11-23 02:58:33 +01:00
oleibman fe79f7b02c Fix Unintential Deprecated Calls in Tests - INFORMATION (#3177)
* Fix Unintential Deprecated Calls in Tests - INFORMATION

I think it's best to install these before PR #3166. There are no changes to source code, only to doc-blocks and to test members which continue to inadvertently use calls to deprecated functions.

* Missed Some Deprecated Calls

Fix them now.
2022-11-22 07:14:19 -08:00
oleibman c2bf9cdf9e Restore Cyclic Error Messages (#3170)
Fix #3169. Insufficient detail when calculation fails due to cyclic reference.
2022-11-22 06:32:08 -08:00
MarkBaker 0244fb4fc8 Store StructuredReference object in the stack rather than simply the Structured Reference string, so that we don't have to create the object for both lexer and parser 2022-11-22 13:31:35 +01:00
Mark Baker a16ce29e2a Merge branch 'master' into CalcEngine-Feature_Structured_References 2022-11-22 10:21:38 +01:00
oleibman 704a7b9fd1 Fix Unintential Deprecated Calls in Tests - LOOKUPREF (#3174)
* Fix Unintential Deprecated Calls in Tests - LOOKUPREF

I think it's best to install these before PR #3166. There are no changes to source code, only to test members which continue to inadvertently use calls to deprecated functions.

* Fix deprecation DocBlocks

Deprecated->deprecated, adjust see and comments

* One Intentional Deprecation

Annotate it.
2022-11-21 19:54:14 -08:00
oleibman 26e17277e1 Eliminate Some Scrutinizer 'Major' Problems Part 5 (#3161)
* Eliminate Some Scrutinizer 'Major' Problems Part 5

More of the same. 2 or 3 of these still to go after this.

Note one deprecation. Shared/Drawing has a method imagecreatefrombmp. However, that was introduced as a native PHP function with 7.2, so the method is no longer needed.

* More Silliness

Keep trying.

* If At First You Don't Succeed

Try, try again.
2022-11-21 15:31:13 -08:00
MarkBaker a7259de437 Explicitly prevent serialization of the Spreadsheet object 2022-11-22 00:12:09 +01:00
MarkBaker 9f6bbd71b6 BugFix - Support null values in TEXTJOIN() text values as well as empty strings
Allow default values for TEXTJOIN() delimiter and ignore_empty... even though the official MS documentation lists them as required arguments, they are actually optional
2022-11-21 14:35:42 +01:00
fjohnston@avatarasoftware.com 66da98ebb8 Handle Currencies Stored as Strings in Formulas
Added a function to the new `FormattedNumber` helper that will use the currency code pulled from `localeconv` by `StringHelper::getCurrencyCode()`.  The currency code is `preg_quoted` and then dropped into a regexp that is modelled on the expression developed for `convertToNumberIfPercent`.  This will allow locale independent operation.
Unfortunately `localeconv` only provides information about standard currency formats and not accounting formats.  This means that we can't say for sure whether or not a locale has an accounting format where the currency symbol shows up in a non-standard position (eg. left justified for some countries instead of appearing directly in front of the value).  The regexp should handle these cases.

The primary issue with this approach is that the regexp will incorrectly match invalid currency formats for some locals as it checks for the symbol before and after the value.

A possible improvement would be to pull `p_cs_precedes` and `n_cs_precedes` from `localeconv` and using them to determine if the currency symbol should appear before or after the value for the current locale.  Since white-space is ignored by the regexp, accounting formats should still work, as long as the accounting format doesn't involve moving the symbol to the opposite side of the value.
2022-11-18 14:54:48 -05:00
MarkBaker 3e81da48f7 Initial parsing for Structured References 2022-11-15 20:00:36 +01:00
fox34 95d929441c Test different colors for different axis 2022-11-15 11:35:07 +01:00
fox34 8714b2e728 Also verify x-axis line color 2022-11-14 17:14:17 +01:00
fox34 4e6ac96e07 Remove unused imports 2022-11-14 16:51:41 +01:00
fox34 97c1a421ff Removing whitespace at end of line 2022-11-14 16:45:05 +01:00
fox34 d9d2484341 Formatting: Indent empty lines 2022-11-14 16:41:49 +01:00