All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning. This is always true of the master branch. Some earlier branches, including the branch from which you are reading this file, remain supported and security fixes are applied to them; if the security fix represents a breaking change, it may have to be applied as a minor or patch version.
$reader->setAllowExternalImages(true). We do not believe that loading of external images is a widely used feature. This is a necessary change for security purposes. It unfortunately breaks Semantic Versioning for reasons described above; there is no way to start a new major version for this branch.composer/pcre.toArray() methods. PR #3494CellRange and CellAddress objects for the range argument in the rangeToArray() method. PR #3494upDownBars and subsidiary tags; these were previously ignored on read and hard-coded on write. PR #3515master branch to mainisEmpty() methods PR #3315toFormattedString will now always return a string. This can affect the results of toArray, namedRangeToArray, and rangeToArray. PR #3304load() and Writer save() methods_xlws prefixed functions from Office365 Issue #3245 PR #3247__destruct() calls PR #3092TEXTBEFORE(), TEXTAFTER() and TEXTSPLIT() Excel FunctionsARRAYTOTEXT() and VALUETOTEXT() Excel Functions$behaviour argument. Permitted values are:
Note that this will be the last 1.x branch release before the 2.x release. We will maintain both branches in parallel for a time; but users are requested to update to version 2.0 once that is fully available.
removeComment() method for Worksheet PR #2875Basic support for Xlsx reading/writing Chart Sheets PR #2830
Note that a ChartSheet is still only written as a normal Worksheet containing a single chart, not as an actual ChartSheet.
Added Worksheet visibility in Ods Reader PR #2851 and Gnumeric Reader PR #2853
rangeBoundaries(), rangeDimension() and getRangeBoundaries() Coordinate methods to work with row/column ranges as well as with cell ranges and cells PR #2926setValueExplicit()Memory and speed improvements, particularly for the Cell Collection, and the Writers.
See the Discussion section on github for details of performance across versions
'C5', 'B2:D4', '2:2' or 'B:C') in appropriate contexts.Added support for reading “formatted” numeric values from Csv files; although default behaviour of reading these values as strings is preserved.
(i.e a value of “12,345.67” can be read as numeric 12345.67, not simply as a string "12,345.67", if the castFormattedNumberToNumeric() setting is enabled.
This functionality is locale-aware, using the server’s locale settings to identify the thousands and decimal separators.
Limited support for Xls Reader to handle Conditional Formatting:
Ranges and Rules are read, but style is currently limited to font size, weight and color; and to fill style and color.
Add ability to suppress Mac line ending check for CSV #2623
Initial support for creating and writing Tables (Xlsx Writer only) PR #2671
See /samples/Table for examples of use.
Note that PreCalculateFormulas needs to be disabled when saving spreadsheets containing tables with formulae (totals or column formulae).
Make Boolean Conversion in Csv Reader locale-aware when using the String Value Binder.
This is determined by the Calculation Engine locale setting.
(i.e. "Vrai" wil be converted to a boolean true if the Locale is set to fr.)
psr/simple-cache 2.xCalculation\Functions (including the Error functions) have been moved to dedicated classes for groups of related functions. See the docblocks against all the deprecated methods for details of the new methods to call instead. At some point, these old classes will be deleted.Worksheet methods that reference cells “byColumnandRow”. All such methods have an equivalent that references the cell by its address (e.g. ‘E3' rather than 5, 3).
These functions now accept either a cell address string ('E3') or an array with columnId and rowId ([5, 3]) or a new CellAddress object as their cellAddress/coordinate argument.
This includes the methods:
setCellValueByColumnAndRow() use the equivalent setCellValue()setCellValueExplicitByColumnAndRow() use the equivalent setCellValueExplicit()getCellByColumnAndRow() use the equivalent getCell()cellExistsByColumnAndRow() use the equivalent cellExists()getStyleByColumnAndRow() use the equivalent getStyle()setBreakByColumnAndRow() use the equivalent setBreak()mergeCellsByColumnAndRow() use the equivalent mergeCells()unmergeCellsByColumnAndRow() use the equivalent unmergeCells()protectCellsByColumnAndRow() use the equivalent protectCells()unprotectCellsByColumnAndRow() use the equivalent unprotectCells()setAutoFilterByColumnAndRow() use the equivalent setAutoFilter()freezePaneByColumnAndRow() use the equivalent freezePane()getCommentByColumnAndRow() use the equivalent getComment()setSelectedCellByColumnAndRow() use the equivalent setSelectedCells()This change provides more consistency in the methods (not every “by cell address” method has an equivalent “byColumnAndRow” method); and the “by cell address” methods often provide more flexibility, such as allowing a range of cells, or referencing them by passing the defined name of a named range as the argument.
A5:C10:C20:F1) in the Calculation Engine; and also support for using named ranges with the Range operator (e.g. NamedRange1:NamedRange2) Issue #2730 PR #2746INDIRECT() to accept row/column ranges as well as cell ranges PR #2687Resolved formula translations to handle separators (row and column) for array functions as well as for function argument separators; and cleanly handle nesting levels.
Note that this method is used when translating Excel functions between en_us and other locale languages, as well as when converting formulae between different spreadsheet formats (e.g. Ods to Excel).
Nor is this a perfect solution, as there may still be issues when function calls have array arguments that themselves contain function calls; but it’s still better than the current logic.
wb+ to wb Issue #2372 PR #2657Namespacing phase 2 - styles. PR #2471
Improved support for passing of array arguments to Excel function implementations to return array results (where appropriate). Issue #2551
This is the first stage in an ongoing process of adding array support to all appropriate function implementations,
Support for the Excel365 Math/Trig RANDARRAY() function PR #2540
Note that the Spill Operator is not yet supported in the Calculation Engine; but this can still be useful for defining array constants.
Provision of CF Wizards (for all the above listed rule types) to help create/modify CF Rules without having to manage all the combinations of types/operators, and the complexities of formula expressions, or the text/timePeriod attributes.
See documentation for details
Full support of the above CF Rules for the Xlsx Reader and Writer; even when the file being loaded has CF rules listed in the <extLst><ext><ConditionalFormattings> element for the worksheet rather than the <ConditionalFormatting> element.
flattenSingleValue() that are no longer required when we’re checking for array values as arguments #2590ReferenceHelper@insertNewBefore behavior when removing column before last column with null value PR #2541DOLLARDE() and DOLLARFR() functions when the dollar value is negative Issue #2578 PR #2579Comment::setSizeAsBackgroundImage() to change the size of a comment to the size of a background image. Issue #1547 PR #2422NumberFormatter Issue #2385 PR #2399# in name Issue #2405 PR #2409insertNewBefore PR #2433AutoFilter::setRange() Issue #2281 PR #2454load() and Writer save()methods, and through the IOFactory, to set behaviours PR #2136
px, pt, pc, in, cm, mm) PR #2152px, pt, pc, in, cm, mm), rather than only in points or MS Excel column width units PR #2152PPMT(), PMT(), FV(), PV(), NPER(), etc) Issue #2163 PR #2164Style::applyFromArray() when applied to several cells PR #1785.IOFactory::load() with a callback to set delimiter, enclosure, charset etc PR #2103 - See documentation for details.nb rather than no as the locale code for Norsk Bokmål.Calculation\Database, Calculation\DateTime, Calculation\Engineering, Calculation\Financial, Calculation\Logical, Calculation\LookupRef, Calculation\MathTrig, Calculation\Statistical, Calculation\TextData and Calculation\Web have been moved to dedicated classes for individual functions or groups of related functions. See the docblocks against all the deprecated methods for details of the new methods to call instead. At some point, these old classes will be deleted.nb rather than no as the locale language code for Norsk Bokmål.R[-2]C-R[2]C) Issue #2076 PR #2086Font::setSize() behavior for PHP8 PR #2100AVERAGEIFS() functions as part of a restructuring of Database functions and Conditional Statistical functions.Formula functions that previously called PHP functions directly are now processed through the Excel Functions classes; resolving issues with PHP8 stricter typing. #1789
The following MathTrig functions are affected:
ABS(), ACOS(), ACOSH(), ASIN(), ASINH(), ATAN(), ATANH(),
COS(), COSH(), DEGREES() (rad2deg), EXP(), LN() (log), LOG10(),
RADIANS() (deg2rad), SIN(), SINH(), SQRT(), TAN(), TANH().
One TextData function is also affected: REPT() (str_repeat).
formatAsDate correctly matches language metadata, reverting c55272eCUMPRINC(), CUMIPMT(), AMORLINC(),
AMORDEGRC().PPMT(), IPMT().Calling many of the Excel formula functions directly rather than through the Calculation Engine.
The logic for these Functions is now being moved out of the categorised Database, DateTime, Engineering, Financial, Logical, LookupRef, MathTrig, Statistical, TextData and Web classes into small, dedicated classes for individual functions or related groups of functions.
This makes the logic in these classes easier to maintain; and will reduce the memory footprint required to execute formulae when calling these functions.
getCell() method when trying to get a cell by defined name. #1858CUMPRINC(), CUMIPMT(), AMORLINC(), AMORDEGRC() usage. When those functions called one of YEARFRAC(), PPMT(), IPMT() and they would get back an error value (represented as a string), trying to use numeral operands (+, /, -, *) on said return value and a number (float orint`) would fail.Calculation\Database, Calculation\DateTime, Calculation\Engineering, Calculation\Financial, Calculation\Logical, Calculation\LookupRef, Calculation\MathTrig, Calculation\Statistical, Calculation\TextData and Calculation\Web have been moved to dedicated classes for individual functions or groups of related functions. See the docblocks against all the deprecated methods for details of the new methods to call instead. At some point, these old classes will be deleted.LOGNORM.DIST(), NORM.S.DIST(), GAMMA() and GAUSS() functions. #1588B2 would be treated identically to a named range cell reference of $B2 or B$2 or $B$2 because the calculation engine treated then all as absolute references. These changes “fix” that, so the calculation engine now handles relative references in named ranges correctly.
This change that resolves previously incorrect behaviour in the calculation may affect users who have dynamically defined named ranges using relative references when they should have used absolute references.Settings::setHttpClient() #1562src/ #1424@return $this for fluent methods #1362#N/A #1165*?~ Excel functionality, when match_type=0 #1116getSheetByName() with tests for name with quote and spaces #739getCalculatedValue() error with more than two INDIRECT #1115libxml_disable_entity_loader setting when reading XML-based formats, so that it is enabled while the xml is being parsed and not simply while it is loaded.
On some versions of PHP, this can cause problems because it is not thread-safe, and can affect other PHP scripts running on the same server. This flag is set to true when instantiating a loader, and back to its original setting when the Reader is no longer in scope, or manually unset.Provide a check to identify whether libxml_disable_entity_loader is thread-safe or not.
XmlScanner::threadSafeLibxmlDisableEntityLoaderAvailability()
tsv extension when opening CSV files #429=libxml_disable_entity_loader() as shortly as possible #819//IGNORE//TRANSLIT on IBM i #791master is the new default branch, develop does not exist anymoreDefaultValueBinder::dataTypeForValue() without overriding DefaultValueBinder::bindValue() #735Worksheet::SHEET_TITLE_MAXIMUM_LENGTH #482Helper\Html support UTF-8 HTML input #444Coordinate::extractAllCellReferencesInRange() throws an exception for an invalid range #519_xlfn. prefixed functions and ISFORMULA, MODE.SNGL, STDEV.S, STDEV.P #390setStrikethrough() did not set the font #403; #304COLUMNS and ROWS functions crashed in some cases #336topLeftCell in freeze panes #261DateTimeImmutable as cell valueTYPE_DOUGHTNUTCHART is now TYPE_DOUGHNUTCHART.Reader\Xlsx::getFromZipArchive() function return false if the zip entry could not be located. - @anton-harvey #268CalcEngine => Calculation\EnginePhpSpreadsheet\Calculation => PhpSpreadsheet\Calculation\CalculationPhpSpreadsheet\Cell => PhpSpreadsheet\Cell\CellPhpSpreadsheet\Chart => PhpSpreadsheet\Chart\ChartPhpSpreadsheet\RichText => PhpSpreadsheet\RichText\RichTextPhpSpreadsheet\Style => PhpSpreadsheet\Style\StylePhpSpreadsheet\Worksheet => PhpSpreadsheet\Worksheet\WorksheetPHPExcel_Calculation_Functions becomes PhpOffice\PhpSpreadsheet\Calculation\FunctionsFor a comprehensive list of all class changes, and a semi-automated migration path, read the migration guide.
PHPExcel_Calculation_Functions::VERSION(). Composer or git should be used to know the version.PHPExcel_Settings::setPdfRenderer() and PHPExcel_Settings::setPdfRenderer(). Composer should be used to autoload PDF libs.The changelog for the project when it was called PHPExcel is still available.