NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #147 most downloaded on Packagist
PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine
Last release 18 days ago
17 Sep 2026
Ships fairly regularly
a new release about every 6 weeks
Some releases are documented
notes for 29 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
145 releases · first in 2017
Security patches will continue to be applied to this branch until 2027-02-28. At that date, no further changes, including security patches, will be ap
Security patches will continue to be applied to this branch
until 2027-02-28. At that date, no further changes,
including security patches, will be applied.
You are encouraged to upgrade to the master branch (release 5)
before that date.
Fixed Security patches.
One column per quarter.
File::prohibitWrappers and Drawing::setPath now reject phar paths with extra leading slashes (e.g. phar:///…) that escaped the prior parse_url-based f
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Writing of cell comments to Html will now sanitize all Html tags within the comment, so the tags will be rendered as plaintext and have no other effec
All deprecated things have been removed, for details, see 816b91d0b4
toFormattedString will now always return a string. This was introduced with 1.28.0, but was not properly documented at the time. This can affect the results of toArray, namedRangeToArray, and rangeToArray. PR #3304_translateFormulaToLocale and _translateFormulaEnglish are replaced by versions without leading underscore. PR #3828xlfn. and xlws. from Formula Translations. Issue #3819 PR #3828between operator for data validation. Issue #3863 PR #3865Security patches will continue to be applied to this branch until 2027-02-28. At that date, no further changes, including security patches, will be ap
Security patches will continue to be applied to this branch
until 2027-02-28. At that date, no further changes,
including security patches, will be applied.
You are encouraged to upgrade to the master branch (release 5)
before that date.
Fixed Security patches.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Wizards for defining Number Format masks for Dates and Times, including Durations/Intervals. PR #3458
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 #3515Support for configuring a Chart Title's overlay PR #3325
toFormattedString will now always return a string. This can affect the results of toArray, namedRangeToArray, and rangeToArray. PR #3304Fix Composer --dev dependency issue with dealerdirect/phpcodesniffer-composer-installer renaming their master branch to main
master branch to mainOption to specify a range of columns/rows for the Row/Column isEmpty() methods PR #3315
isEmpty() methods PR #3315Improved Documentation for Deprecations - many PRs Issue #3162
load() and Writer save() methods_xlws prefixed functions from Office365 Issue #3245 PR #3247__destruct() calls PR #3092Composer dependency clash with ezyang/htmlpurifier
Nothing published for this version
Axis getLineProperty deprecated in favor of getLineColorProperty.
TEXTBEFORE(), TEXTAFTER() and TEXTSPLIT() Excel FunctionsARRAYTOTEXT() and VALUETOTEXT() Excel Functions$behaviour argument. Permitted values are:
Fix Encoding issue with Html reader (PHP 8.2 deprecation for mb_convert_encoding) Issue #2942 PR #2943
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 reques
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.
Added removeComment() method for Worksheet PR #2875
Add point size option for scatter charts Issue #2298 PR #2801
Basic 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
Added Worksheet visibility in Ods Writer PR #2850
Allow Csv Reader to treat string as contents of file Issue #1285 PR #2792
Allow Csv Reader to store null string rather than leave cell empty Issue #2840 PR #2842
Provide new Worksheet methods to identify if a row or column is "empty", making allowance for different definitions of "empty":
Modify rangeBoundaries(), rangeDimension() and getRangeBoundaries() Coordinate methods to work with row/column ranges as well as with cell ranges and cells PR #2926
Better enforcement of value modification to match specified datatype when using setValueExplicit()
Relax validation of merge cells to allow merge for a single cell reference Issue #2776
Memory and speed improvements, particularly for the Cell Collection, and the Writers.
See the Discussion section on github for details of performance across versions
Improved performance for removing rows/columns from a worksheet
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.
Ods Writer support for Freeze Pane Issue #2013 PR #2755
Ods Writer support for setting column width/row height (including the use of AutoSize) Issue #2346 PR #2753
Introduced CellAddress, CellRange, RowRange and ColumnRange value objects that can be used as an alternative to a string value (e.g. 'C5', 'B2:D4', '2:2' or 'B:C') in appropriate contexts.
Implementation of the FILTER(), SORT(), SORTBY() and UNIQUE() Lookup/Reference (array) functions.
Implementation of the ISREF() Information function.
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).
Gnumeric Reader now loads number formatting for cells.
Gnumeric Reader now correctly identifies selected worksheet and selected cells in a worksheet.
Some Refactoring of the Ods Reader, moving all formula and address translation from Ods to Excel into a separate class to eliminate code duplication and ensure consistency.
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.)
Allow psr/simple-cache 2.x
All Excel Function implementations in Calculation\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.
Make allowance for the AutoFilter dropdown icon in the first row of an Autofilter range when using Autosize columns. Issue #2413 PR #2754
Support for "chained" ranges (e.g. 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 #2746
Update Conditional Formatting ranges and rule conditions when inserting/deleting rows/columns Issue #2678 PR #2689
Allow INDIRECT() to accept row/column ranges as well as cell ranges PR #2687
Fix bug when deleting cells with hyperlinks, where the hyperlink was then being "inherited" by whatever cell moved to that cell address.
Fix bug in Conditional Formatting in the Xls Writer that resulted in a broken file when there were multiple conditional ranges in a worksheet.
Fix Conditional Formatting in the Xls Writer to work with rules that contain string literals, cell references and formulae.
Fix for setting Active Sheet to the first loaded worksheet when bookViews element isn't defined Issue #2666 PR #2669
Fixed behaviour of XLSX font style vertical align settings PR #2619
Resolved 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.
Fix for escaping double quotes within a formula Issue #1971 PR #2651
Change open mode for output from wb+ to wb Issue #2372 PR #2657
Use color palette if supplied Issue #2499 PR #2595
Xls reader treat drawing offsets as int rather than float PR #2648
Handle booleans in conditional styles properly PR #2654
Fix for reading files in the root directory of a ZipFile, which should not be prefixed by relative paths ("./") as dirname($filename) does by default.
Fix invalid style of cells in empty columns with columnDimensions and rows with rowDimensions in added external sheet. PR #2739
Time Interval Formatting Issue #2768 PR #2772
Namespacing phase 2 - styles. PR #2471
Namespacing 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 SEQUENCE() function PR #2536
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.
Improved support for Conditional Formatting Rules PR #2491
Provide support for a wider range of Conditional Formatting Rules for Xlsx Reader/Writer:
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.
Provision of a CellMatcher to identify if rules are matched for a cell, and which matching style will be applied.
Improved documentation and examples, covering all supported CF rule types.
Add support for one digit decimals (FORMAT_NUMBER_0, FORMAT_PERCENTAGE_0). PR #2525
Initial work enabling Excel function implementations for handling arrays as arguments when used in "array formulae" #2562
Enable most of the Date/Time functions to accept array arguments #2573
Array ready functions - Text, Math/Trig, Statistical, Engineering and Logical #2580
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 #2579Ability to add a picture to the background of the comment. Supports four image formats: png, jpeg, gif, bmp. New Comment::setSizeAsBackgroundImage() t
Comment::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 #2454Xlsx Writer Support for WMF Files #2339
PHP 8.1 will deprecate auto_detect_line_endings. As a result of this change, Csv Reader using some release after PHP8.1 will no longer be able to hand…
load() 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.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.
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 #2100Implementation of the Excel AVERAGEIFS() functions as part of a restructuring of Database functions and Conditional Statistical functions.
AVERAGEIFS() 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 c55272e
Formulae that previously crashed on sub function call returning excel error value now return said value.
The following functions are affected CUMPRINC(), CUMIPMT(), AMORLINC(),
AMORDEGRC().
Adapt some function error return value to match excel's error.
The following functions are affected 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 or int`) would fail.Nothing published for this version
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.
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.Implemented Page Order for Xlsx and Xls Readers, and provided Page Settings (Orientation, Scale, Horizontal/Vertical Centering, Page Order, Margins) s
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.WEBSERVICE is HTTP client agnostic and must be configured via Settings::setHttpClient() #1562
Your coding agent can read these notes before it upgrades. Set up the MCP server →