Commit Graph

17 Commits

Author SHA1 Message Date
oleibman d38b5cd332 Merge branch 'master' into odspage 2024-12-15 10:32:04 -08:00
oleibman 3dfec28516 Merge branch 'master' into odsrepeat 2024-12-15 10:21:48 -08:00
oleibman e2ec705ee8 Ods Writer Master Page Name
PR #2850 and PR #2851 added support for Worksheet Visibility to ODS. They work well when LibreOffice is used to open the spreadsheet. However, when Excel tries to open it, it reports corruption. Strictly speaking, this is not a PhpSpreadsheet problem, but, if we can fix it, we should.

It took a while to figure out what's bothering Excel. I'm not sure that all of what follows is necessary, but it works. It appears that it wants the content.xml `style:automatic-styles` definition for the `table` (i.e. worksheet) to include a `style:master-page-name` attribute. That attribute requires a corresponding definition in the `office:master-styles` section in styles.xml, and that attribute likewise requires a definition in `office:automatic-styles`.

The new entries in styles.xml can be used to specify things like header and footer. However, the ways that these are specified is distinctly different from what Excel (and therefore PhpSpreadsheet) does. Implementing that will be a good future project. However, for now, they will remain unsupported for Ods.
2024-12-07 00:26:40 -08:00
oleibman 8654e805f4 Ods Writer Eliminate Padding at End of Row
Ods Writer currently will write something like `<table:table-cell table:number-columns-repeated="1023" />` at the end of each row. This is not necessary. In eliminating that, I have made the code a bit more efficient and (hopefully) more readable.
2024-12-05 20:14:12 -08:00
oleibman eb450c489e Ods Writer Horizontal Alignment
Fix #4261. Ods does nothing with the `indent` property of Alignment. The fix is easy, but not as easy as it should be. Excel treats indent as an int in some unspecified unit. Ods, on the other hand, specifies it as a float with unit (inches, ems, etc.). Since MS does not reveal what an indent unit is, I resorted to some experimentation. It appears that 1 unit is equal to  0.1043 inches. That is not a guaranteed relationship - the conversion might be non-linear, or it might be affected by external factors like font size. I think multiplying by 0.1043 is adequate for now, and unquestionably better than what we're currently doing (ignoring the property). If it breaks down at some point, we'll look at it again. BTW, Shared\Drawing uses some conversion values of 9525, which, reciprocating and sliding the decimal point along yields a value of 0.10498..., which is close but not close enough for me to use.

The other property used in conjunction with indent is `text-align`, and here we have not been doing the right thing. If that property has the default value (`General`), it is treated as `start` (i.e. `left` on LTR docs and presumably `right` on RTL). This will align numbers as if they were text, which does no harm (they're still usable as numbers), but is not how LibreOffice handles them by default. Ods writer is changed to omit `text-align` when it is set to `General`, and let LibreOffice choose the appropriate alignment.

These changes are for Writer only. Ods Reader support for styles remains severely lacking.
2024-12-05 20:10:42 -08:00
oleibman 312cd5a6a0 Merge branch 'master' into atsign 2024-07-23 06:25:08 -07:00
oleibman 18e3c00e40 Performance Improvements for Csv Reader
Fix #460. Another in the "better late than never" series, closed as stale in June 2018. Ods Writer and Ods Reader handle booleans differently; what is worse, neither of them do it correctly. They will now match the behavior of LibreOffice. Reporter said that part of the xml would vary depending on locale; I believe that part is never actually used, but I do emulate that behavior.
2024-07-11 19:48:12 -07:00
oleibman d7700125fa Spills
Implement SPILL for dynamic arrays. Calculating a dynamic array function will result in a SPILL error if it attempts to overlay a non-null cell which was not part of its previous calculation. Furthermore, it will set to null all cells which were part of its previous calculation but which are not part of the current one (i.e. one or both of the dimensions of the calculation is smaller than it had been); this should also apply for spills (whose result is reduced to 1*1).

Excel will stop you from changing the value in any cell in a dynamic array except the formula cell itself. I have not built this particular aspect into PhpSpreadsheet.

As usual, MS has taken some unusual steps here. If the result of a dynamic array calculation is #SPILL!, it will nevertheless be written to the xml as #VALUE!. It recognizes this situation by adding a new `vm` attribute to the cell, and expanding metadata.xml to recognize this.

A new optional parameter `$reduceArrays` is added to `toArray` and related functions. This will reduce a dynamic array to its first cell, which seems more useful than outputing it as an array (default).
2024-06-17 14:22:52 -07:00
oleibman ad2194d737 CONCATENATE Changes, and Csv/Html/Ods Support
The CONCATENATE function has been treated as equivalent to CONCAT. This is not how it is treated in Excel; it is closer to (and probably identical to) the ampersand concatenate operator. The difference manifests itself when any of the arguments is an array (typically a cell range). Code is added to support this difference.

Support for array results is added to Csv Writer, Html Writer, and Ods Reader and Writer. I have not figured out how to get it to work with Xls.
2024-06-14 08:30:18 -07:00
MarkBaker 2e5ebea110 Add support for writing Worksheet Visibility for Ods 2022-05-23 13:38:08 +02:00
MarkBaker 7a2f5c4ccc Ods Writer support for setting column width/row height (including Autosizing) 2022-04-17 11:34:39 +02:00
Mark Baker 5f761b6274 Cell alignment for ods Writer (#1819)
* Cell alignment for ods Writer
2021-01-31 23:39:37 +01:00
Alexander Gunkel fdc8e8d17a Fix/1674 (#1688)
* Treat inline strings like strings in Open Document because it has no specific inline-string format

* implement data-type error

Co-authored-by: Mark Baker <mark@lange.demon.co.uk>
2021-01-31 18:26:50 +01:00
Mark Baker 8b0aaf7ecf Named formula implementation, and improved handling of Defined Names generally (#1535)
* Initial work modifying the way named ranges are stored, and handled by the calculation engine
This should provide better support for:
  - both union and intersection operators in composite named range values
  - MS Excel implementation of the union operator duplicating values
  - named formulae
  - named ranges and formulae that reference other named ranges and formulae
  - ranges and formulae that reference multiple ranges across multiple worksheets

* Initial work on handling defined names (named ranges and named formulae) correctly
 - UTF-8 names (already extracted as a separate PR and merged)
 - distinction between named ranges and named formulae
 - correct handling of union and intersection operators in named ranges
 - correct evaluation of named range operators in calculations
 - calculation support for named formulae
 - support for nested ranges and formulae (named ranges and formulae that reference other named ranges/formulae) in calculations

* Minor tweaks before resolving merge conflicts

* Fix extractSheetTitle() method to work on the last ! in a cell reference rather than the first

* Throw exception if a the reference to a defined name in a formula doesn't exist as a defined name

* Properly assess scope for defined names in calculation engine

* Elimination of some redundant code

* Minor tweaks to simplify entries o the stack where we need to check type

* Ensure correct scoping rules are applied when evaluating named ranges and formulae

* Adjustments to Gnumeric Reader for new defined names structure

* Initial work modifying the Ods Reader to handle named ranges, they weren't actually supported previously... this is still ongoing work

* Handle Ranges formatted as 3-d ranges, as long as the references are both to the same worksheet

* Additional testing for Named Ranges formatted as 3-d ranges, as long as the references are both to the same worksheet

* Skip composite named range tests for the moment

* Clean handling for `undefined name` exception when thrown in the calculation engine. Catch and replace with `#NAME?`

* Adjust method we use to determine whether a defined name is a range or a formula

* PHPCS Recommendations

* PHP doesn't support `mixed` yet, at least not at the minium version that we're working with

* More phpcs fixes

* More phpcs appeasements

* Final phpcs fixes for the moment
Still have a lot of echo and var_dump() statements in the code that scrutinizer will hate, but they stay for the moment while this is still WIP

* Please let this be the last of the phpcs fixes

* Unit tests to determine whether a defined name value is a range value or a formula

* phpcs appeasement

* Named tests from provider

* Initial steps for named ranges and formulae in the Ods Reader

* Reading pseudo-3d range addresses in Ods; treat second sheet reference as being identical to the first, which is the majority of cases where this will occur

* Initial work on Gnumeric reader for named ranges and formulae

* Suppress debug logging again

* Remove more debugging displays

* Last minor tweaks before phase two

* Minor refinements

* And all for the want of a space

* A little tidying up

* More tidying up

* phpcs fix

* Modify defined names in rebindParent()

* Renaming variables

* Resolve an issue with locally scoped defined names that don't contain any worksheet reference

* Keep phpcs happy

* Fix quote handling in regexp

* Fix a couple of scrutinizer issues

* Fix a couple of scrutinizer issues

* Update Xlsx Writer to work with the new defined name internal definition
Additional validation checks

* When adding new defined names through the readers, worksheet may not exist if we're only loading selected sheets rather than the full spreadsheet

* If the only thing that phpcs can pickup on is strings in double quotes instead of single quotes, then I know I'm getting close to ready

* Refactor Defined Names logic for Xlsx Writer into its own class

* phpcs keeping me on my toes

* Restore a couple of files that I managed to change without intending to

* Initial work on Ods Write to provide support for saving named ranges and formulae

* Resolve commas to semi-colons s argument separator when writing named formulae for Ods

* Extract Named Expression Writer for Ods into its own class

* Keep phpcs happy

* Refactoring of formula conversion when reading SpreadsheetML; preparation for reading named ranges because they will also need to use the same conversion method

* First pass at reading Named Ranges/Formulae from SpreadsheetML format xml files

* Remove unused namespace reference

* Defined names being written correctly for Xls; but not yet writing cell formulae that reference those defined names... that's the next big step
And I anticipate that defined names that reference other defined names will also be a problem

* Just to keep phpcs happy
... and yes, I know that there are still diagnostic echo statements in the code

* I had to miss some of the phpcs issues didn't I

* Work on the Xls Writer's Parser Tree to identify named range tokens in a formula, and to distinguish them from function tokens

* Still working on packing that d*** defined name reference in the writer

* Throw an exception in the Parser for saving Xls output if we encounter a defined name in a formula... writer will simply write the calculated cell value, and not the formula as at present
Strip out diagnostic output

* Some phpcs appeasement

* Fix a couple of Scrutinizer issues

* Additional verifications to differentiate a formula from a range value
Add explicit getters/setters for named ranges, named formulae and defined names
Additional unit tests

* Styling for closures

* Remove redundant docblocks

* Spaces

* Gah! Namespace use complaints

* Consistency of making calls to DefinedName rather than NamedRange; NamedRange should now be used only for Named Ranges, and should exclude Named Formulae

* Styling

* spurious newline

* No need to test for variable === null when we're typing it in the function argument definition

* Additional unit tests for local/global scoped named ranges and formulae; and a fix to getNamedFormula()

* Fix silly typo that led to breaking test

* Void return signature for unit tests

* Why weren't these picked up in the last pass?

* Refactoring of getNamedRange()/getNamedFormula()

* Eliminate unused constants, and defaults for private method parameters when always called with a value

* Use strict comparisons when comparing object hash codes

* Initial update to documentation for working with named formulae

* Fix for calculation of relative cell references in named ranges/formulae

* Fix current named range tests, because we should be using absolute references; tests for relative named ranges to be added later

* Fix for calculation of relative cell references in named ranges/formulae

* Updates to changelog and documentation for handling of absolute/relative references in named ranges

* Fix last remaining unit test with a named range reference

* Refactor formula conversion for Ods into a separate class; I hadn't realised that it previously wrote formulae as the MS Excel syntax without any conversion to Ods format

* Fix Ods Writer test xml to reflect Ods-native format for formula

* Docblocks

* Drop dollar prefix from Ods formulae and ranges unless it's necessary

* Set the formula convertor in the content writer constructor

* Documentation update

* Minor updates

* Remove var_dumps from file

* Fix the spurious single quote that was breaking named expressions in the Ods Writer... big sigh of relief that I finally spotted it

* Starting work on documentation for Defined Names, and some examples of using Named Ranges and Formulae

* Starting work on documentation for Defined Names, and some examples of using Named Ranges and Formulae

* Example of a relative named range for the documentation

* Mustn't have phpcs problems in sample code either

* More updates to the documentation

* That should conclude the documentation for Named Ranges, now time to move on to documenting Named Formulae

* That should conclude the documentation for Named Ranges, now time to move on to documenting Named Formulae

* PHPCS appeasement in sample code

* Initial documentation on Named Formulae

* PHPCS appeasements

* Additional comments in the documentation, and modify the named range name validation to support a \ as the first character in a name

* Fix breaking build

* Make defined names case-insensitive

* Fix case-insensitivity

* Improved documentation, and additional unit tests

* Additional unit tests, and a fix for removing a globally scoped defined name even if a worksheet is specified in the method call

* Fix unit test for removing named formulae

* Use assertCount instead of assertSame

* Forgotten voids

* Fix arguments for assertCount

* Unit tests for removing defined names, and a fix for removing locally scoped names

* Unit tests for absolute and relative named ranges in calculation engine, and fix an issue with worksheet name in the offset adjustments for relative references

* PHPCS Appeasement

* Additional unit tests, more documentation, and a fix to the calculation engine when no worksheet reference is provided with a named formula

* PHPCS appeasements

* Additional documentation and examples of using Named Formulae

* Additional examples to go with documentation

* A few minor phpcs appeasements

* Minor refactor of updateFormulaReferencesAnyWorksheet() method

* Discard an unused method argument

* Additional unit tests

* Additional unit tests

* Remove unused argument

* Stricter typing

* Fix return typehinting from remove named range/formula; should return the Spreadsheet object

* Use return typehint of self rather than explicit object type

* Redundant code just to keep scrutinizer happy

* Minor change to handle merge conflict

* phpcs fixes after merge

* Namespace usage ordering

* Please let this be the last phpcs fix needed

Co-authored-by: Adrien Crivelli <adrien.crivelli@gmail.com>
2020-07-26 12:00:06 +02:00
Paolo Agostinetto 219e4e6258 Writer\Ods\Content: Set "CompatibilityMode" before and after running the tests in
order to avoid conflicts with other tests
2017-03-04 17:18:18 +01:00
Paolo Agostinetto 4efda2a512 Ods\Writer\Content: added support for xr styles (bold, italic, font family, font size, underline, bg color) 2017-03-04 17:18:18 +01:00
Paolo Agostinetto 5620510991 Writer\Ods\Content: basic unit tests 2017-03-04 17:18:18 +01:00