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.
- Support for Excel dynamic arrays is added. It is an opt-in feature, so our hope is that there will be no BC breaks, but it is a very large change. Full support is added for Xlsx. It is emulated as Ctrl-Shift-Enter arrays for Ods read and write and Excel2003 and Gnumeric read. Html/Pdf and Csv writers will populate cells on output if they are the result of array formulas. No support is added for Xls or Slk.
- Excel Dynamic Arrays. Issue #3901 Issue #3659 Issue #1834 PR #3962
- String Value Binder Allow Setting "Ignore Number Stored as Text". PR #4141
- Xlsx Reader default datatype when none is specified in Xml is changed from string to numeric, which is how Excel treats it. There is expected to be little impact because DefaultValueBinder and AdvancedValueBinder correct mis-identification as string, and StringValueBinder usually expects string. PR #4139
- Currency and Accounting Wizards are changed to act like Excel, and a new CurrencyBase Wizard is added for for non-Excel formats. Issue #4125 Issue #4124 PR #4127
- Nothing yet.
- The following items were deprecated in release 2 and are now removed.
- Writer\Xls\Style\ColorMap (no longer needed).
- Reader\Xml::trySimpleXMLLoadString (should not have been public, no public replacement).
- Calculation\Calculation::_translateFormulaToLocale (use method name translateFormulaToLocale without leading underscore).
- Calculation\Calculation::_translateFormulaToEnglish (use method name translateFormulaToEnglish without leading underscore).
- Nothing yet.
- Xls Reader Some Ranges Not Handled Properly. Issue #1570 PR #4140
- Better Handling of legacyDrawing Xml. Issue #4105 PR #4122
- Improve Xlsx Reader Speed. Issue #3917 PR #4153
- Nothing yet.
- Nothing yet.
- Nothing yet.
- Nothing yet.
- Html Reader Preserve Unicode Whitespace. Issue #1284 PR #4106
- RATE Function Floating Point Number of Periods. PR #4107
- Parameter Name Change Xlsx Writer Workbook. Issue #4108 PR #4111
- New Algorithm for TRUNC, ROUNDUP, ROUNDDOWN. Issue #4113 PR #4115
- Worksheet applyStylesFromArray Retain Active Cell (Excel 16 was having a problem with some files). Issue #4128 PR #4132
- Prevent XXE when loading files PR #4119
- Add Sheet may leave Active Sheet uninitialized. Issue #4112 PR #4114
- Reference to Defined Name Specifying Worksheet. Issue #206 PR #4096
- Xls Reader Print/Show Gridlines. Issue #912 PR #4098
- ODS Reader Allow Omission of Page Settings Tags. Issue #4099 PR #4101
- Xlsx Reader Optionally Ignore Rows With No Cells. Issue #3982 PR #4035
- Means to change style without affecting current cell/sheet. PR #4073
- Option for CSV output file to have varying numbers of columns for each row. Issue #1415 PR #4076
- On read, Xlsx Reader had been breaking up union ranges into separate individual ranges. It will now try to preserve range as it was read in. PR #4042
- Xlsx/Xls spreadsheet calculation and formatting of dates will use base date of spreadsheet even when spreadsheets with different base dates are simultaneously open. Issue #1036 Issue #1635 PR #4071
- Writer\Xls\Style\ColorMap is no longer needed.
- Nothing
- Incorrect Reader CSV with BOM. Issue #4028 PR #4029
- POWER Null/Bool Args. PR #4031
- Do Not Output Alignment and Protection for Conditional Format. Issue #4025 PR #4027
- Conditional Color Scale Improvements. Issue #4049 PR #4050
- Mpdf and Tcpdf Borders on Merged Cells. Issue #3557 PR #4047
- Xls Conditional Format Improvements. PR #4030 PR #4033
- Conditional Range Unions and Intersections Issue #4039 PR #4042
- Ods comments with newlines. Issue #4081 PR #4086
- Propagate errors in Text functions. Issue #2581 PR #4080
- Csv Reader allow use of html mimetype. Issue #4036 PR #4040
- Problem rendering line chart with missing plot label. PR #4074
- More RTL in Xlsx/Html Comments Issue #4004 PR #4065
- Empty String in sharedStrings. Issue #4063 PR #4064
- Xlsx Writer RichText and TYPE_STRING. Issue #476 PR #4094
- Ods boolean data. Issue #460 PR #4093
- Html Writer Minor Fixes. PR #4089
- Changes to INDEX function. Issue #64 PR #4088
- Ods Reader and Whitespace Text Nodes. Issue #804 PR #4087
- Ods Xml Reader and Whitespace Text Nodes. Issue #804 PR #4087
- Treat invalid formulas as strings. Issue #1310 PR #4073
- 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 effects when rendered. Styling can be achieved by using the Font property of of the TextRuns which make up the comment, as is already the cases for Xlsx. PR #3957
- Default Style Alignment Property (workaround for bug in non-Excel spreadsheet apps) Issue #3918 PR #3924
- Additional Support for Date/Time Styles PR #3939
- Nothing
- Reader/Xml trySimpleXMLLoadString should not have had public visibility, and will be removed.
- Nothing
- IF Empty Arguments. Issue #3875 Issue #2146 PR #3879
- Changes to floating point in Php8.4. Issue #3896 PR #3897
- Handling User-supplied Decimal and Thousands Separators. Issue #3900 PR #3903
- Improve Performance of CSV Writer. Issue #3904 PR #3906
- Fix issue with prepending zero in percentage Issue #3920 PR #3921
- Incorrect SUMPRODUCT Calculation Issue #3909 PR #3916
- Formula Misidentifying Text as Cell After Insertion/Deletion Issue #3907 PR #3915
- Unexpected Absolute Address in Xlsx Rels Issue #3730 PR #3923
- Unallocated Cells Affected by Column/Row Insert/Delete Issue #3933 PR #3940
- Invalid Builtin Defined Name in Xls Reader Issue #3935 PR #3942
- Hidden Rows and Columns Tcpdf/Mpdf PR #3945
- RTL Text Alignment in Xlsx Comments Issue #4004 PR #4006
- Protect Sheet But Allow Sort Issue #3951 PR #3956
- Default Value for Conditional::$text PR #3946
- Table Filter Buttons Issue #3988 PR #3992
- Improvements to Xml Reader Issue #3999 Issue #4000 Issue #4001 Issue #4002 PR #4003 PR #4007
- Html Reader non-UTF8 Issue #3995 Issue #866 Issue #1681 PR #4019
- Typing was strengthened by leveraging native typing. This should not change any behavior. However, if you implement any interfaces or inherit from any classes, you will need to adapt your typing accordingly. If you use static analysis tools such as PHPStan or Psalm, new errors might be found. If you find actual bugs because of the new typing, please open a PR that fixes it with a detailed explanation of the reason. We'll try to merge and release typing-related fixes quickly in the coming days. PR #3718
- All deprecated things have been removed, for details, see 816b91d0b4
- Split screens (Xlsx and Xml only, not 100% complete). Issue #3601 PR #3622
- Permit Meta Viewport in Html. Issue #3565 PR #3623
- Hyperlink support for Ods. Issue #3660 PR #3669
- ListWorksheetInfo/Names for Html/Csv/Slk. Issue #3706 PR #3709
- Methods to determine if cell is actually locked, or hidden on formula bar. PR #3722
- Add iterateOnlyExistingCells to Constructors. Issue #3721 PR #3727
- Support for Conditional Formatting Color Scale. PR #3738
- Support Additional Tags in Helper/Html. Issue #3751 PR #3752
- Writer ODS : Write Border Style for cells Issue #3690 PR #3693
- Sheet Background Images Issue #1649 PR #3795
- Check if Coordinate is Inside Range PR #3779
- Flipping Images Issue #731 PR #3801
- Chart Dynamic Title and Font Properties Issue #3797 PR #3800
- Chart Axis Display Units and Logarithmic Scale. Issue #3833 PR #3836
- Partial Support of Fill Handles. Discussion #3847 PR #3855
- Drop support for PHP 7.4, according to https://phpspreadsheet.readthedocs.io/en/latest/#php-version-support PR #3713
- RLM Added to NumberFormatter Currency. This happens depending on release of ICU which Php is using (it does not yet happen with any official release). PhpSpreadsheet will continue to use the value returned by Php, but a method is added to keep the result unchanged from release to release. Issue #3571 PR #3640
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 oftoArray
,namedRangeToArray
, andrangeToArray
. PR #3304- Value of constants FORMAT_CURRENCY_EUR and FORMAT_CURRENCY_USD was changed in 1.28.0, but was not properly documented at the time. Issue #3577
- Html Writer will attempt to use Chart coordinates to determine image size. Issue #3783 PR #3787
- Functions
_translateFormulaToLocale
and_translateFormulaEnglish
are replaced by versions without leading underscore. PR #3828
- Nothing
- Take advantage of mitoteam/jpgraph Extended mode to enable rendering of more graphs. PR #3603
- Column widths, especially for ODS. Issue #3609 PR #3610
- Avoid NULL in String Function call (partial solution). Issue #3613 PR #3617
- Preserve transparency in Memory Drawing. Issue #3624 PR #3627
- Customizable padding for Exact Column Width. Issue #3626 PR #3628
- Ensure ROW function returns int (problem exposed in unreleased Php). PR #3641
- Minor changes to Mpdf and Html Writers. PR #3645
- Xlsx Reader Namespacing for Tables, Autofilters. Issue #3665 PR #3668
- Read Code Page for Xls ListWorksheetInfo/Names BIFF5. Issue #3671 PR #3672
- Read Data from Table on Different Sheet. Issue #3635 PR #3659
- Html Writer Styles Using Inline Css. Issue #3678 PR #3680
- Xlsx Read Ignoring Some Comments. Issue #3654 PR #3655
- Fractional Seconds in Date/Time Values. PR #3677
- SetCalculatedValue Avoid Casting String to Numeric. Issue #3658 PR #3685
- Several Problems in a Very Complicated Spreadsheet. Issue #3679 PR #3681
- Inconsistent String Handling for Sum Functions. Issue #3652 PR #3653
- Recomputation of Relative Addresses in Defined Names. Issue #3661 PR #3673
- Writer Xls Characters Outside BMP (emojis). Issue #642 PR #3696
- Xlsx Reader Improve Handling of Row and Column Styles. Issue #3533 Issue #3534 PR #3688
- Avoid Allocating RowDimension Unneccesarily. PR #3686
- Use Column Style when Row Dimension Exists Without Style. Issue #3534 PR #3688
- Inconsistency Between Cell Data and Explicitly Declared Type. Issue #3711 PR #3715
- Unexpected Namespacing in rels File. Issue #3720 PR #3722
- Break Some Circular References. PR #3716 PR #3707
- Missing Font Index in Some Xls. PR #3734
- Load Tables even with READ_DATA_ONLY. PR #3726
- Theme File Missing but Referenced in Spreadsheet. Issue #3770 PR #3772
- Slk Shared Formulas. Issue #2267 PR #3776
- Html omitting some charts. Issue #3767 PR #3771
- Case Insensitive Comparison for Sheet Names PR #3791
- Performance improvement for Xlsx Reader. Issue #3683 PR #3810
- Prevent loop in Shared/File. Issue #3807 PR #3809
- Consistent handling of decimal/thousands separators between StringHelper and Php setlocale. Issue #3811 PR #3815
- Clone worksheet with tables or charts. Issue #3820 PR #3821
- COUNTIFS Does Not Require xlfn. Issue #3819 PR #3827
- Strip
xlfn.
andxlws.
from Formula Translations. Issue #3819 PR #3828 - Recurse directories searching for font file. Issue #2809 PR #3830
- Reduce memory consumption of Worksheet::rangeToArray() when many empty rows are read. Issue #3814 PR #3834
- Reduce time used by Worksheet::rangeToArray() when many empty rows are read. PR #3839
- Html Reader Tolerate Invalid Sheet Title. PR #3845
- Do not include unparsed drawings when new drawing added. Issue #3843 PR #3846
- Do not include unparsed drawings when new drawing added. Issue #3861 PR #3862
- Excel omits
between
operator for data validation. Issue #3863 PR #3865 - Use less space when inserting rows and columns. Issue #3687 PR #3856
- Excel inconsistent handling of MIN/MAX/MINA/MAXA. Issue #3866 PR #3868
- Wizards for defining Number Format masks for Dates and Times, including Durations/Intervals. PR #3458
- Specify data type in html tags. Issue #3444 PR #3445
- Provide option to ignore hidden rows/columns in
toArray()
methods. PR #3494 - Font/Effects/Theme support for Chart Data Labels and Axis. PR #3476
- Font Themes support. PR #3486
- Ability to Ignore Cell Errors in Excel. Issue #1141 PR #3508
- Unzipped Gnumeric file PR #3591
- Xlsx Color schemes read in will be written out (previously Excel 2007-2010 Color scheme was always written); manipulation of those schemes before write, including restoring prior behavior, is provided PR #3476
- Memory and speed optimisations for Read Filters with Xlsx Files and Shared Formulae. PR #3474
- Allow
CellRange
andCellAddress
objects for therange
argument in therangeToArray()
method. PR #3494 - Stock charts will now read and reproduce
upDownBars
and subsidiary tags; these were previously ignored on read and hard-coded on write. PR #3515
- Nothing
- Nothing
- Updates Cell formula absolute ranges/references, and Defined Name absolute ranges/references when inserting/deleting rows/columns. Issue #3368 PR #3402
- EOMONTH() and EDATE() Functions should round date value before evaluation. Issue #3436 PR #3437
- NETWORKDAYS function erroneously being converted to NETWORK_xlfn.DAYS in Xlsx Writer. Issue #3461 PR #3463
- Getting a style for a CellAddress instance fails if the worksheet is set in the CellAddress instance. Issue #3439 PR #3469
- Shared Formulae outside the filter range when reading with a filter are not always being identified. Issue #3473 PR #3474
- Xls Reader Conditional Styles. PR #3400
- Allow use of # and 0 digit placeholders in fraction masks. PR #3401
- Modify Date/Time check in the NumberFormatter for decimal/fractional times. PR #3413
- Misplaced Xml Writing Chart Label FillColor. Issue #3397 PR #3404
- TEXT function ignores Time in DateTimeStamp. Issue #3409 PR #3411
- Xlsx Column Autosize Approximate for CJK. Issue #3405 PR #3416
- Correct Xlsx Parsing of quotePrefix="0". Issue #3435 PR #3438
- More Display Options for Chart Axis and Legend. Issue #3414 PR #3434
- Apply strict type checking to Complex suffix. PR #3452
- Incorrect Font Color Read Xlsx Rich Text Indexed Color Custom Palette. Issue #3464 PR #3465
- Xlsx Writer Honor Alignment in Default Font. Issue #3443 PR #3459
- Support Border for Charts. PR #3462
- Error in "this row" structured reference calculation (cached result from first row when using a range) Issue #3504 PR #3505
- Allow colour palette index references in Number Format masks Issue #3511 PR #3512
- Xlsx Reader formula with quotePrefix Issue #3495 PR #3497
- Handle REF error as part of range Issue #3453 PR #3467
- Handle Absolute Pathnames in Rels File Issue #3553 PR #3554
- Return Page Breaks in Order Issue #3552 PR #3555
- Add position attribute for MemoryDrawing in Html [Issue #3529](PHPOffice#3529 PR #3535
- Allow Index_number as Array for VLOOKUP/HLOOKUP [Issue #3561](PHPOffice#3561 PR #3570
- Add Unsupported Options in Xml Spreadsheet [Issue #3566](PHPOffice#3566 [Issue #3568](PHPOffice#3568 [Issue #3569](PHPOffice#3569 PR #3567
- Changes to NUMBERVALUE, VALUE, DATEVALUE, TIMEVALUE [Issue #3574](PHPOffice#3574 PR #3575
- Redo calculation of color tinting Issue #3550 PR #3580
- Accommodate Slash with preg_quote PR #3582 PR #3583 PR #3584
- HyperlinkBase Property and Html Handling of Properties Issue #3573 PR #3589
- Improvements for Data Validation Issue #3592 Issue #3594 PR #3605
- Support for configuring a Chart Title's overlay PR #3325
- Wizards for defining Number Format masks for Numbers, Percentages, Scientific, Currency and Accounting PR #3334
- Support for fixed value divisor in fractional Number Format Masks PR #3339
- Allow More Fonts/Fontnames for Exact Width Calculation PR #3326 Issue #3190
- Allow override of the Value Binder when setting a Cell value PR #3361
- Improved handling for @ placeholder in Number Format Masks PR #3344
- Improved handling for ? placeholder in Number Format Masks PR #3394
- Improved support for locale settings and currency codes when matching formatted strings to numerics in the Calculation Engine PR #3373 and PR #3374
- Improved support for locale settings and matching in the Advanced Value Binder PR #3376
toFormattedString
will now always return a string. This can affect the results oftoArray
,namedRangeToArray
, andrangeToArray
. PR #3304- Value of constants FORMAT_CURRENCY_EUR and FORMAT_CURRENCY_USD is changed. Issue #3577 PR #3377
- Rationalisation of Pre-defined Currency Format Masks PR #3377
- Nothing
- Calculation Engine doesn't evaluate Defined Name when default cell A1 is quote-prefixed Issue #3335 PR #3336
- XLSX Writer - Array Formulas do not include function prefix Issue #3337 PR #3338
- Permit Max Column for Row Breaks Issue #3143 PR #3345
- AutoSize Columns should allow for dropdown icon when AutoFilter is for a Table Issue #3356 PR #3358 and for Center Alignment of Headers Issue #3395 PR #3399
- Decimal Precision for Scientific Number Format Mask Issue #3381 PR #3382
- Xls Writer Parser Handle Boolean Literals as Function Arguments Issue #3369 PR #3391
- Conditional Formatting Improvements for Xlsx Issue #3370 Issue #3202 PR #3372
- Coerce Bool to Int for Mathematical Operations on Arrays Issue #3389 Issue #3396 PR #3392
- Nothing
- Nothing
- Nothing
- Nothing
- Fix Composer --dev dependency issue with dealerdirect/phpcodesniffer-composer-installer renaming their
master
branch tomain
- Option to specify a range of columns/rows for the Row/Column
isEmpty()
methods PR #3315 - Option for Cell Iterator to return a null value or create and return a new cell when accessing a cell that doesn't exist PR #3314
- Support for Structured References in the Calculation Engine PR #3261
- Limited Support for Form Controls PR #3130 Issue #2396 Issue #1770 Issue #2388 Issue #2904 Issue #2661
- Nothing
- Nothing
- Shared/JAMA is removed. PR #3260
- Namespace-Aware Code for SheetViewOptions, SheetProtection PR #3230
- Additional Method for XIRR if Newton-Raphson Doesn't Converge Issue #689 PR #3262
- Better Handling of Composite Charts Issue #2333 PR #3265
- Update Column Reference for Columns Beginning with Y and Z Issue #3263 PR #3264
- Honor Fit to 1-Page Height Html/Pdf Issue #3266 PR #3279
- AND/OR/XOR Handling of Literal Strings PR #3287
- Xls Reader Vertical Break and Writer Page Order Issue #3305 PR #3306
- Extended flag options for the Reader
load()
and Writersave()
methods - Apply Row/Column limits (1048576 and XFD) in ReferenceHelper PR #3213
- Allow the creation of In-Memory Drawings from a string of binary image data, or from a stream. PR #3157
- Xlsx Reader support for Pivot Tables PR #2829
- Permit Date/Time Entered on Spreadsheet to be calculated as Float Issue #1416 PR #3121
- Nothing
- Direct update of Calculation::suppressFormulaErrors is replaced with setter.
- Font public static variable defaultColumnWidths replaced with constant DEFAULT_COLUMN_WIDTHS.
- ExcelError public static variable errorCodes replaced with constant ERROR_CODES.
- NumberFormat constant FORMAT_DATE_YYYYMMDD2 replaced with existing identical FORMAT_DATE_YYYYMMDD.
- Nothing
- Fixed handling for
_xlws
prefixed functions from Office365 Issue #3245 PR #3247 - Conditionals formatting rules applied to rows/columns are removed Issue #3184 PR #3213
- Treat strings containing currency or accounting values as floats in Calculation Engine operations Issue #3165 PR #3189
- Treat strings containing percentage values as floats in Calculation Engine operations Issue #3155 PR #3156 and PR #3164
- Xlsx Reader Accept Palette of Fewer than 64 Colors Issue #3093 PR #3096
- Use Locale-Independent Float Conversion for Xlsx Writer Custom Property Issue #3095 PR #3099
- Allow setting AutoFilter range on a single cell or row Issue #3102 PR #3111
- Xlsx Reader External Data Validations Flag Missing Issue #2677 PR #3078
- Reduces extra memory usage on
__destruct()
calls PR #3092 - Additional properties for Trendlines Issue #3011 PR #3028
- Calculation suppressFormulaErrors fix Issue #1531 PR #3092
- Permit Date/Time Entered on Spreadsheet to be Calculated as Float Issue #1416 PR #3121
- Incorrect Handling of Data Validation Formula Containing Ampersand Issue #3145 PR #3146
- Xlsx Namespace Handling of Drawings, RowAndColumnAttributes, MergeCells Issue #3138 PR #3136
- Generation3 Copy With Image in Footer Issue #3126 PR #3140
- MATCH Function Problems with Int/Float Compare and Wildcards Issue #3141 PR #3142
- Fix ODS Read Filter on number-columns-repeated cell Issue #3148 PR #3149
- Problems Formatting Very Small and Very Large Numbers Issue #3128 PR #3152
- XlsxWrite preserve line styles for y-axis, not just x-axis PR #3163
- Xlsx Namespace Handling of Drawings, RowAndColumnAttributes, MergeCells Issue #3138 PR #3137
- More Detail for Cyclic Error Messages Issue #3169 PR #3170
- Improved Documentation for Deprecations - many PRs Issue #3162
- Nothing
- Nothing
- Nothing
- Nothing
- Composer dependency clash with ezyang/htmlpurifier
- Implementation of the new
TEXTBEFORE()
,TEXTAFTER()
andTEXTSPLIT()
Excel Functions - Implementation of the
ARRAYTOTEXT()
andVALUETOTEXT()
Excel Functions - Support for mitoteam/jpgraph implementation of JpGraph library to render charts added.
- Charts: Add Gradients, Transparency, Hidden Axes, Rounded Corners, Trendlines, Date Axes.
- Allow variant behaviour when merging cells Issue #3065
- Merge methods now allow an additional
$behaviour
argument. Permitted values are:- Worksheet::MERGE_CELL_CONTENT_EMPTY - Empty the content of the hidden cells (the default behaviour)
- Worksheet::MERGE_CELL_CONTENT_HIDE - Keep the content of the hidden cells
- Worksheet::MERGE_CELL_CONTENT_MERGE - Move the content of the hidden cells into the first cell
- Merge methods now allow an additional
- Axis getLineProperty deprecated in favor of getLineColorProperty.
- Moved majorGridlines and minorGridlines from Chart to Axis. Setting either in Chart constructor or through Chart methods, or getting either using Chart methods is deprecated.
- Chart::EXCEL_COLOR_TYPE_* copied from Properties to ChartColor; use in Properties is deprecated.
- ChartColor::EXCEL_COLOR_TYPE_ARGB deprecated in favor of EXCEL_COLOR_TYPE_RGB ("A" component was never allowed).
- Misspelled Properties::LINE_STYLE_DASH_SQUERE_DOT deprecated in favor of LINE_STYLE_DASH_SQUARE_DOT.
- Clone not permitted for Spreadsheet. Spreadsheet->copy() can be used instead.
- Nothing
- Fix update to defined names when inserting/deleting rows/columns Issue #3076 PR #3077
- Fix DataValidation sqRef when inserting/deleting rows/columns Issue #3056 PR #3074
- Named ranges not usable as anchors in OFFSET function Issue #3013
- Fully flatten an array Issue #2955 PR #2956
- cellExists() and getCell() methods should support UTF-8 named cells Issue #2987 PR #2988
- Spreadsheet copy fixed, clone disabled. PR #2951
- Fix PDF problems with text rotation and paper size. Issue #1747 Issue #1713 PR #2960
- Limited support for chart titles as formulas Issue #2965 Issue #749 PR #2971
- Add Gradients, Transparency, and Hidden Axes to Chart Issue #2257 Issue #2229 Issue #2935 PR #2950
- Chart Support for Rounded Corners and Trendlines Issue #2968 Issue #2815 PR #2976
- Add setName Method for Chart Issue #2991 PR #3001
- Eliminate partial dependency on php-intl in StringHelper Issue #2982 PR #2994
- Minor changes for Pdf Issue #2999 PR #3002 PR #3006
- Html/Pdf Do net set background color for cells using (default) nofill PR #3016
- Add support for Date Axis to Chart Issue #2967 PR #3018
- Reconcile Differences Between Css and Excel for Cell Alignment PR #3048
- R1C1 Format Internationalization and Better Support for Relative Offsets Issue #1704 PR #3052
- Minor Fix for Percentage Formatting Issue #1929 PR #3053
- Support for SimpleCache Interface versions 1.0, 2.0 and 3.0
- Add Chart Axis Option textRotation Issue #2705 PR #2940
- Nothing
- Nothing
- Nothing
- Fix Encoding issue with Html reader (PHP 8.2 deprecation for mb_convert_encoding) Issue #2942 PR #2943
- Additional Chart fixes
- Pie chart with part separated unwantedly Issue #2506 PR #2928
- Chart styling is lost on simple load / save process Issue #1797 Issue #2077 PR #2930
- Can't create contour chart (surface 2d) Issue #2931 PR #2933
- VLOOKUP Breaks When Array Contains Null Cells Issue #2934 PR #2939
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":
- Treat rows/columns containing no cell records as empty (default)
- Treat cells containing a null value as empty
- Treat cells containing an empty string as empty
-
Modify
rangeBoundaries()
,rangeDimension()
andgetRangeBoundaries()
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
- Nothing
- Nothing
- Xls Reader resolving absolute named ranges to relative ranges Issue #2826 PR #2827
- Null value handling in the Excel Math/Trig PRODUCT() function Issue #2833 PR #2834
- Invalid Print Area defined in Xlsx corrupts internal storage of print area Issue #2848 PR #2849
- Time interval formatting Issue #2768 PR #2772
- Copy from Xls(x) to Html/Pdf loses drawings PR #2788
- Html Reader converting cell containing 0 to null string Issue #2810 PR #2813
- Many fixes for Charts, especially, but not limited to, Scatter, Bubble, and Surface charts. Issue #2762 Issue #2299 Issue #2700 Issue #2817 Issue #2763 Issue #2219 Issue #2863 PR #2828 PR #2841 PR #2846 PR #2852 PR #2856 PR #2865 PR #2872 PR #2879 PR #2898 PR #2906 PR #2922 PR #2923
- Adjust both coordinates for two-cell anchors when rows/columns are added/deleted. Issue #2908 PR #2909
- Keep calculated string results below 32K. PR #2921
- Filter out illegal Unicode char values FFFE/FFFF. Issue #2897 PR #2910
- Better handling of REF errors and propagation of all errors in Calculation engine. PR #2902
- Calculating Engine regexp for Column/Row references when there are multiple quoted worksheet references in the formula Issue #2874 PR #2899
-
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 thecastFormattedNumberToNumeric()
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 booleantrue
if the Locale is set tofr
.) -
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 than5, 3
).These functions now accept either a cell address string (
'E3')
or an array with columnId and rowId ([5, 3]
) or a newCellAddress
object as theircellAddress
/coordinate
argument. This includes the methods:setCellValueByColumnAndRow()
use the equivalentsetCellValue()
setCellValueExplicitByColumnAndRow()
use the equivalentsetCellValueExplicit()
getCellByColumnAndRow()
use the equivalentgetCell()
cellExistsByColumnAndRow()
use the equivalentcellExists()
getStyleByColumnAndRow()
use the equivalentgetStyle()
setBreakByColumnAndRow()
use the equivalentsetBreak()
mergeCellsByColumnAndRow()
use the equivalentmergeCells()
unmergeCellsByColumnAndRow()
use the equivalentunmergeCells()
protectCellsByColumnAndRow()
use the equivalentprotectCells()
unprotectCellsByColumnAndRow()
use the equivalentunprotectCells()
setAutoFilterByColumnAndRow()
use the equivalentsetAutoFilter()
freezePaneByColumnAndRow()
use the equivalentfreezePane()
getCommentByColumnAndRow()
use the equivalentgetComment()
setSelectedCellByColumnAndRow()
use the equivalentsetSelectedCells()
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.
- Nothing
-
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+
towb
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
-
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:
- Cells Containing (cellIs)
- Specific Text (containing, notContaining, beginsWith, endsWith)
- Dates Occurring (all supported timePeriods)
- Blanks/NoBlanks
- Errors/NoErrors
- Duplicates/Unique
- Expression
-
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
-
- Additional Russian translations for Excel Functions (courtesy of aleks-samurai).
- Improved code coverage for NumberFormat. PR #2556
- Extract some methods from the Calculation Engine into dedicated classes #2537
- Eliminate calls to
flattenSingleValue()
that are no longer required when we're checking for array values as arguments #2590
- Nothing
- Nothing
- Fixed
ReferenceHelper@insertNewBefore
behavior when removing column before last column with null value PR #2541 - Fix bug with
DOLLARDE()
andDOLLARFR()
functions when the dollar value is negative Issue #2578 PR #2579 - Fix partial function name matching when translating formulae from Russian to English Issue #2533 PR #2534
- Various bugs related to Conditional Formatting Rules, and errors in the Xlsx Writer for Conditional Formatting PR #2491
- Xlsx Reader merge range fixes. Issue #2501 PR #2504
- Handle explicit "date" type for Cell in Xlsx Reader. Issue #2373 PR #2485
- Recalibrate Row/Column Dimensions after removeRow/Column. Issue #2442 PR #2486
- Refinement for XIRR. Issue #2469 PR #2487
- Xlsx Reader handle cell with non-null explicit type but null value. Issue #2488 PR #2489
- Xlsx Reader fix height and width for oneCellAnchorDrawings. PR #2492
- Fix rounding error in NumberFormat::NUMBER_PERCENTAGE, NumberFormat::NUMBER_PERCENTAGE_00. PR #2555
- Don't treat thumbnail file as xml. Issue #2516 PR #2517
- Eliminating Xlsx Reader warning when no sz tag for RichText. Issue #2542 PR #2550
- Fix Xlsx/Xls Writer handling of inline strings. Issue #353 PR #2569
- Richtext colors were not being read correctly after namespace change #2458
- Fix discrepancy between the way markdown tables are rendered in ReadTheDocs and in PHPStorm #2520
- Update Russian Functions Text File #2557
- Fix documentation, instantiation example #2564
- Ability to add a picture to the background of the comment. Supports four image formats: png, jpeg, gif, bmp. New
Comment::setSizeAsBackgroundImage()
to change the size of a comment to the size of a background image. Issue #1547 PR #2422 - Ability to set default paper size and orientation PR #2410
- Ability to extend AutoFilter to Maximum Row PR #2414
- Xlsx Writer will evaluate AutoFilter only if it is as yet unevaluated, or has changed since it was last evaluated PR #2414
- Nothing
- Nothing
- Rounding in
NumberFormatter
Issue #2385 PR #2399 - Support for themes Issue #2075 Issue #2387 PR #2403
- Read spreadsheet with
#
in name Issue #2405 PR #2409 - Improve PDF support for page size and orientation Issue #1691 PR #2410
- Wildcard handling issues in text match Issue #2430 PR #2431
- Respect DataType in
insertNewBefore
PR #2433 - Handle rows explicitly hidden after AutoFilter Issue #1641 PR #2414
- Special characters in image file name Issue #1470 Issue #2415 PR #2416
- Mpdf with very many styles Issue #2432 PR #2434
- Name clashes between parsed and unparsed drawings Issue #1767 Issue #2396 PR #2423
- Fill pattern start and end colors Issue #2441 PR #2444
- General style specified in wrong case Issue #2450 PR #2451
- Null passed to
AutoFilter::setRange()
Issue #2281 PR #2454 - Another undefined index in Xls reader (#2470) Issue #2463 PR #2470
- Allow single-cell checks on conditional styles, even when the style is configured for a range of cells (#) PR #2483
- Xlsx Writer Support for WMF Files #2339
- Use standard temporary file for internal use of HTMLPurifier #2383
- Drop support for PHP 7.2, according to https://phpspreadsheet.readthedocs.io/en/latest/#php-version-support
- Use native typing for objects that were already documented as such
- Nothing
- Nothing
- Fixed null conversation for strToUpper #2292
- Fixed Trying to access array offset on value of type null (Xls Reader) #2315
- Don't corrupt XLSX files containing data validation #2377
- Non-fixed cells were not updated if shared formula has a fixed cell #2354
- Declare key of generic ArrayObject
- CSV reader better support for boolean values #2374
- Some ZIP file could not be read #2376
- Fix regression were hyperlinks could not be read #2391
- AutoFilter Improvements #2393
- Don't corrupt file when using chart with fill color #589
- Restore imperfect array formula values in xlsx writer #2343
- Restore explicit list of changes to PHPExcel migration document #1546
- Ability to set style on named range, and validate input to setSelectedCells Issue #2279 PR #2280
- Process comments in Sylk file Issue #2276 PR #2277
- Addition of Custom Properties to Ods Writer, and 32-bit-safe timestamps for Document Properties PR #2113
- Added callback to CSV reader to set user-specified defaults for various properties (especially for escape which has a poor PHP-inherited default of backslash which does not correspond with Excel) PR #2103
- Phase 1 of better namespace handling for Xlsx, resolving many open issues PR #2173 PR #2204 PR #2303
- Add ability to extract images if source is a URL Issue #1997 PR #2072
- Support for passing flags in the Reader
load()
and Writersave()
methods, and through the IOFactory, to set behaviours PR #2136- See documentation for details
- More flexibility in the StringValueBinder to determine what datatypes should be treated as strings PR #2138
- Helper class for conversion between css size Units of measure (
px
,pt
,pc
,in
,cm
,mm
) PR #2152 - Allow Row height and Column Width to be set using different units of measure (
px
,pt
,pc
,in
,cm
,mm
), rather than only in points or MS Excel column width units PR #2152 - Ability to stream to an Amazon S3 bucket Issue #2249
- Provided a Size Helper class to validate size values (pt, px, em) PR #1694
- Nothing.
- 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 handle a Csv with Mac line endings.
- Nothing.
- Unexpected format in Xlsx Timestamp Issue #2331 PR #2332
- Corrections for HLOOKUP Issue #2123 PR #2330
- Corrections for Xlsx Read Comments Issue #2316 PR #2329
- Lowercase Calibri font names Issue #2273 PR #2325
- isFormula Referencing Sheet with Space in Title Issue #2304 PR #2306
- Xls Reader Fatal Error due to Undefined Offset Issue #1114 PR #2308
- Permit Csv Reader delimiter to be set to null Issue #2287 PR #2288
- Csv Reader did not handle booleans correctly PR #2232
- Problems when deleting sheet with local defined name Issue #2266 PR #2284
- Worksheet passwords were not always handled correctly Issue #1897 PR #2197
- Gnumeric Reader will now distinguish between Created and Modified timestamp PR #2133
- Xls Reader will now handle MACCENTRALEUROPE with or without hyphen Issue #549 PR #2213
- Tweaks to input file validation Issue #1718 PR #2217
- Html Reader did not handle comments correctly Issue #2234 PR #2235
- Apache OpenOffice Uses Unexpected Case for General format Issue #2239 PR #2242
- Problems with fraction formatting Issue #2253 PR #2254
- Xlsx Reader had problems reading file with no styles.xml or empty styles.xml Issue #2246 PR #2247
- Xlsx Reader did not read Data Validation flags correctly Issue #2224 PR #2225
- Better handling of empty arguments in Calculation engine PR #2143
- Many fixes for Autofilter Issue #2216 PR #2141 PR #2162 PR #2218
- Locale generator will now use Unix line endings even on Windows Issue #2172 PR #2174
- Support differences in implementation of Text functions between Excel/Ods/Gnumeric PR #2151
- Fixes to places where PHP8.1 enforces new or previously unenforced restrictions PR #2137 PR #2191 PR #2231
- Clone for HashTable was incorrect PR #2130
- Xlsx Reader was not evaluating Document Security Lock correctly PR #2128
- Error in COUPNCD handling end of month Issue #2116 PR #2119
- Xls Writer Parser did not handle concatenation operator correctly PR #2080
- Xlsx Writer did not handle boolean false correctly Issue #2082 PR #2087
- SUM needs to treat invalid strings differently depending on whether they come from a cell or are used as literals Issue #2042 PR #2045
- Html reader could have set illegal coordinates when dealing with embedded tables Issue #2029 PR #2032
- Documentation for printing gridlines was wrong PR #2188
- Return Value Error - DatabaseAbstruct::buildQuery() return null but must be string Issue #2158 PR #2160
- Xlsx reader not recognize data validations that references another sheet Issue #1432 Issue #2149 PR #2150 PR #2265
- Don't calculate cell width for autosize columns if a cell contains a null or empty string value Issue #2165 PR #2167
- Allow negative interest rate values in a number of the Financial functions (
PPMT()
,PMT()
,FV()
,PV()
,NPER()
, etc) Issue #2163 PR #2164 - Xls Reader changing grey background to black in Excel template Issue #2147 PR #2156
- Column width and Row height styles in the Html Reader when the value includes a unit of measure Issue #2145.
- Data Validation flags not set correctly when reading XLSX files Issue #2224 PR #2225
- Reading XLSX files without styles.xml throws an exception Issue #2246
- Improved performance of
Style::applyFromArray()
when applied to several cells PR #1785. - Improve XLSX parsing speed if no readFilter is applied (again) - #772
- Enhancements to CSV Reader, allowing options to be set when using
IOFactory::load()
with a callback to set delimiter, enclosure, charset etc PR #2103 - See documentation for details. - Implemented basic AutoFiltering for Ods Reader and Writer PR #2053
- Implemented basic AutoFiltering for Gnumeric Reader PR #2055
- Improved support for Row and Column ranges in formulae Issue #1755 PR #2028
- Implemented URLENCODE() Web Function
- Implemented the CHITEST(), CHISQ.DIST() and CHISQ.INV() and equivalent Statistical functions, for both left- and right-tailed distributions.
- Support for ActiveSheet and SelectedCells in the ODS Reader and Writer PR #1908
- Support for notContainsText Conditional Style in xlsx Issue #984
- Use of
nb
rather thanno
as the locale code for Norsk Bokmål.
- All Excel Function implementations in
Calculation\Database
,Calculation\DateTime
,Calculation\Engineering
,Calculation\Financial
,Calculation\Logical
,Calculation\LookupRef
,Calculation\MathTrig
,Calculation\Statistical
,Calculation\TextData
andCalculation\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.
- Use of
nb
rather thanno
as the locale language code for Norsk Bokmål.
- Fixed error in COUPNCD() calculation for end of month Issue #2116 - PR #2119
- Resolve default values when a null argument is passed for HLOOKUP(), VLOOKUP() and ADDRESS() functions Issue #2120 - PR #2121
- Fixed incorrect R1C1 to A1 subtraction formula conversion (
R[-2]C-R[2]C
) Issue #2076 PR #2086 - Correctly handle absolute A1 references when converting to R1C1 format PR #2060
- Correct default fill style for conditional without a pattern defined Issue #2035 PR #2050
- Fixed issue where array key check for existince before accessing arrays in Xlsx.php PR #1970
- Fixed issue with quoted strings in number format mask rendered with toFormattedString() Issue 1972# PR #1978
- Fixed issue with percentage formats in number format mask rendered with toFormattedString() Issue 1929# PR #1928
- Fixed issue with _ spacing character in number format mask corrupting output from toFormattedString() Issue 1924# PR #1927
- Fix for Issue #1887 - Lose Track of Selected Cells After Save
- Fixed issue with Xlsx@listWorksheetInfo not returning any data
- Fixed invalid arguments triggering mb_substr() error in LEFT(), MID() and RIGHT() text functions Issue #640
- Fix for Issue #1916 - Invalid signature check for XML files
- Fix change in
Font::setSize()
behavior for PHP8 PR #2100
- Implementation of the Excel
AVERAGEIFS()
functions as part of a restructuring of Database functions and Conditional Statistical functions. - Support for date values and percentages in query parameters for Database functions, and the IF expressions in functions like COUNTIF() and AVERAGEIF(). #1875
- Support for booleans, and for wildcard text search in query parameters for Database functions, and the IF expressions in functions like COUNTIF() and AVERAGEIF(). #1876
- Implemented DataBar for conditional formatting in Xlsx, providing read/write and creation of (type, value, direction, fills, border, axis position, color settings) as DataBar options in Excel. #1754
- Alignment for ODS Writer #1796
- Basic implementation of the PERMUTATIONA() Statistical Function
-
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
andWeb
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.
- Nothing.
- Avoid Duplicate Titles When Reading Multiple HTML Files.Issue #1823 PR #1829
- Fixed issue with Worksheet's
getCell()
method when trying to get a cell by defined name. #1858 - Fix possible endless loop in NumberFormat Masks #1792
- Fix problem resulting from literal dot inside quotes in number format masks PR #1830
- Resolve Google Sheets Xlsx charts issue. Google Sheets uses oneCellAnchor positioning and does not include *Cache values in the exported Xlsx PR #1761
- Fix for Xlsx Chart axis titles mapping to correct X or Y axis label when only one is present PR #1760
- Fix For Null Exception on ODS Read of Page Settings. #1772
- Fix Xlsx reader overriding manually set number format with builtin number format PR #1805
- Fix Xlsx reader cell alignment PR #1710
- Fix for not yet implemented data-types in Open Document writer Issue #1674
- Fix XLSX reader when having a corrupt numeric cell data type PR #1664
- Fix on
CUMPRINC()
,CUMIPMT()
,AMORLINC()
,AMORDEGRC()
usage. When those functions called one ofYEARFRAC()
,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.
- CSV Reader - Best Guess for Encoding, and Handle Null-string Escape #1647
- Updated the CONVERT() function to support all current MS Excel categories and Units of Measure.
- All Excel Function implementations in
Calculation\Database
,Calculation\DateTime
,Calculation\Engineering
,Calculation\Financial
,Calculation\Logical
,Calculation\LookupRef
,Calculation\MathTrig
,Calculation\Statistical
,Calculation\TextData
andCalculation\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.
- Nothing.
- Fixed issue with absolute path in worksheets' Target PR #1769
- Fix for Xls Reader when SST has a bad length #1592
- Resolve Xlsx loader issue whe hyperlinks don't have a destination
- Resolve issues when printer settings resources IDs clash with drawing IDs
- Resolve issue with SLK long filenames #1612
- ROUNDUP and ROUNDDOWN return incorrect results for values of 0 #1627
- Apply Column and Row Styles to Existing Cells #1712 PR #1721
- Resolve issues with defined names where worksheet doesn't exist (#1686)[PHPOffice#1686] and #1723 - PR #1742
- Fix for issue #1735 Incorrect activeSheetIndex after RemoveSheetByIndex - PR #1743
- Ensure that the list of shared formulae is maintained when an xlsx file is chunked with readFilterIssue #169.
- Fix for notice during accessing "cached magnification factor" offset #1354
- Fix compatibility with ext-gd on php 8
- Prevent XSS through cell comments in the HTML Writer.
- Implemented Page Order for Xlsx and Xls Readers, and provided Page Settings (Orientation, Scale, Horizontal/Vertical Centering, Page Order, Margins) support for Ods, Gnumeric and Xls Readers #1559
- Implementation of the Excel
LOGNORM.DIST()
,NORM.S.DIST()
,GAMMA()
andGAUSS()
functions. #1588 - Named formula implementation, and improved handling of Defined Names generally #1535
- Defined Names are now case-insensitive
- 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
- fix resolution of relative named range values in the calculation engine; previously all named range values had been treated as absolute.
- Calculation support for named formulae
- Support for nested ranges and formulae (named ranges and formulae that reference other named ranges/formulae) in calculations
- Introduction of a helper to convert address formats between R1C1 and A1 (and the reverse)
- Proper support for both named ranges and named formulae in all appropriate Readers
- Xlsx (Previously only simple named ranges were supported)
- Xls (Previously only simple named ranges were supported)
- Gnumeric (Previously neither named ranges nor formulae were supported)
- Ods (Previously neither named ranges nor formulae were supported)
- Xml (Previously neither named ranges nor formulae were supported)
- Proper support for named ranges and named formulae in all appropriate Writers
- Xlsx (Previously only simple named ranges were supported)
- Xls (Previously neither named ranges nor formulae were supported) - Still not supported, but some parser issues resolved that previously failed to differentiate between a defined name and a function name
- Ods (Previously neither named ranges nor formulae were supported)
- Support for PHP 8.0
- Improve Coverage for ODS Reader #1545
- Named formula implementation, and improved handling of Defined Names generally #1535
- fix resolution of relative named range values in the calculation engine; previously all named range values had been treated as absolute.
- Drop $this->spreadSheet null check from Xlsx Writer #1646
- Improving Coverage for Excel2003 XML Reader #1557
- IMPORTANT NOTE: This Introduces a BC break in the handling of named ranges. Previously, a named range cell reference of
B2
would be treated identically to a named range cell reference of$B2
orB$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.
- Nothing.
- PrintArea causes exception #1544
- Calculation/DateTime Failure With PHP8 #1661
- Reader/Gnumeric Failure with PHP8 #1662
- ReverseSort bug, exposed but not caused by PHP8 #1660
- Bug setting Superscript/Subscript to false #1567
- nothing
- WEBSERVICE is HTTP client agnostic and must be configured via
Settings::setHttpClient()
#1562 - Borders were not complete on rowspanned columns using HTML reader #1473
- Add support for IFS() logical function #1442
- Add Cell Address Helper to provide conversions between the R1C1 and A1 address formats #1558
- Add ability to edit Html/Pdf before saving #1499
- Add ability to set codepage explicitly for BIFF5 #1018
- Added support for the WEBSERVICE function #1409
- Resolve evaluation of utf-8 named ranges in calculation engine #1522
- Fix HLOOKUP on single row #1512
- Fix MATCH when comparing different numeric types #1521
- Fix exact MATCH on ranges with empty cells #1520
- Fix for Issue #1516 (Cloning worksheet makes corrupted Xlsx) #1530
- Fix For Issue #1509 (Can not set empty enclosure for CSV) #1518
- Fix for Issue #1505 (TypeError : Argument 4 passed to PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet::writeAttributeIf() must be of the type string) #1525
- Fix for Issue #1495 (Sheet index being changed when multiple sheets are used in formula) #1500
- Fix for Issue #1533 (A reference to a cell containing a string starting with "#" leads to errors in the generated xlsx.) #1534
- Xls Writer - Correct Timestamp Bug #1493
- Don't ouput row and columns without any cells in HTML writer #1235
- Support writing to streams in all writers #1292
- Support CSV files with data wrapping a lot of lines #1468
- Support protection of worksheet by a specific hash algorithm #1485
- Fix Chart samples by updating chart parameter from 0 to DataSeries::EMPTY_AS_GAP #1448
- Fix return type in docblock for the Cells::get() #1398
- Fix RATE, PRICE, XIRR, and XNPV Functions #1456
- Save Excel 2010+ functions properly in XLSX #1461
- Several improvements in HTML writer #1464
- Fix incorrect behaviour when saving XLSX file with drawings #1462,
- Fix Crash while trying setting a cell the value "123456\n" #1476
- Improved DATEDIF() function and reduced errors for Y and YM units #1466
- Stricter typing for mergeCells #1494
- Drop support for PHP 7.1, according to https://phpspreadsheet.readthedocs.io/en/latest/#php-version-support
- Drop partial migration tool in favor of complete migration via RectorPHP #1445
- Limit composer package to
src/
#1424
- Improved the ARABIC function to also handle short-hand roman numerals
- Added support for the FLOOR.MATH and FLOOR.PRECISE functions #1351
- Fix ROUNDUP and ROUNDDOWN for floating-point rounding error #1404
- Fix ROUNDUP and ROUNDDOWN for negative number #1417
- Fix loading styles from vmlDrawings when containing whitespace #1347
- Fix incorrect behavior when removing last row #1365
- MATCH with a static array should return the position of the found value based on the values submitted #1332
- Fix Xlsx Reader's handling of undefined fill color #1353
- Added support for the BASE function
- Added support for the ARABIC function
- Conditionals - Extend Support for (NOT)CONTAINSBLANKS #1278
- Handle Error in Formula Processing Better for Xls #1267
- Handle ConditionalStyle NumberFormat When Reading Xlsx File #1296
- Fix Xlsx Writer's handling of decimal commas #1282
- Fix for issue by removing test code mistakenly left in #1328
- Fix for Xls writer wrong selected cells and active sheet #1256
- Fix active cell when freeze pane is used #1323
- Fix XLSX file loading with autofilter containing '$' #1326
- PHPDoc - Use
@return $this
for fluent methods #1362
- PHP 7.4 compatibility
- FLOOR() function accept negative number and negative significance #1245
- Correct column style even when using rowspan #1249
- Do not confuse defined names and cell refs #1263
- XLSX reader/writer keep decimal for floats with a zero decimal part #1262
- ODS writer prevent invalid numeric value if locale decimal separator is comma #1268
- Xlsx writer actually writes plotVisOnly and dispBlanksAs from chart properties #1266
- Change license from LGPL 2.1 to MIT #140
- Implementation of IFNA() logical function
- Support "showZeros" worksheet option to change how Excel shows and handles "null" values returned from a calculation
- Allow HTML Reader to accept HTML as a string into an existing spreadsheet #1212
- IF implementation properly handles the value
#N/A
#1165 - Formula Parser: Wrong line count for stuff like "MyOtherSheet!A:D" #1215
- Call garbage collector after removing a column to prevent stale cached values
- Trying to remove a column that doesn't exist deletes the latest column
- Keep big integer as integer instead of lossely casting to float #874
- Fix branch pruning handling of non boolean conditions #1167
- Fix ODS Reader when no DC namespace are defined #1182
- Fixed Functions->ifCondition for allowing <> and empty condition #1206
- Validate XIRR inputs and return correct error values #1120
- Allow to read xlsx files with exotic workbook names like "workbook2.xml" #1183
- Drop support for PHP 5.6 and 7.0, according to https://phpspreadsheet.readthedocs.io/en/latest/#php-version-support
- When <br> appears in a table cell, set the cell to wrap #1071 and #1070
- Add MAXIFS, MINIFS, COUNTIFS and Remove MINIF, MAXIF #1056
- HLookup needs an ordered list even if range_lookup is set to false #1055 and #1076
- Improve performance of IF function calls via ranch pruning to avoid resolution of every branches #844
- MATCH function supports
*?~
Excel functionality, when match_type=0 #1116 - Allow HTML Reader to accept HTML as a string #1136
- Fix to AVERAGEIF() function when called with a third argument
- Eliminate duplicate fill none style entries #1066
- Fix number format masks containing literal (non-decimal point) dots #1079
- Fix number format masks containing named colours that were being misinterpreted as date formats; and add support for masks that fully replace the value with a full text string #1009
- Stricter-typed comparison testing in COUNTIF() and COUNTIFS() evaluation #1046
- COUPNUM should not return zero when settlement is in the last period #1020 and #1021
- Fix handling of named ranges referencing sheets with spaces or "!" in their title
- Cover
getSheetByName()
with tests for name with quote and spaces #739 - Best effort to support invalid colspan values in HTML reader - #878
- Fixes incorrect rows deletion #868
- MATCH function fix (value search by type, stop search when match_type=-1 and unordered element encountered) #1116
- Fix
getCalculatedValue()
error with more than two INDIRECT #1115 - Writer\Html did not hide columns #985
- Uncaught error when opening ods file and properties aren't defined #1047
- Xlsx Reader Cell datavalidations bug #1052
- Allow nullable theme for Xlsx Style Reader class #1043
-
Detect double-encoded xml in the Security scanner, and reject as suspicious.
-
This change also broadens the scope of the
libxml_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()
-
Provide an option to disable the libxml_disable_entity_loader call through settings. This is not recommended as it reduces the security of the XML-based readers, and should only be used if you understand the consequences and have no other choice.
- Whitelist
tsv
extension when opening CSV files #429 - Fix a SUMIF warning with some versions of PHP when having different length of arrays provided as input #873
- Fix incorrectly handled backslash-escaped space characters in number format
- Added support for inline styles in Html reader (borders, alignment, width, height)
- QuotedText cells no longer treated as formulae if the content begins with a
=
- Clean handling for DDE in formulae
- Fix handling for escaped enclosures and new lines in CSV Separator Inference
- Fix MATCH an error was appearing when comparing strings against 0 (always true)
- Fix wrong calculation of highest column with specified row #700
- Fix VLOOKUP
- Fix return type hint
- Refactored Matrix Functions to use external Matrix library
- Possibility to specify custom colors of values for pie and donut charts #768
- Improve XLSX parsing speed if no readFilter is applied #772
- Fix column names if read filter calls in XLSX reader skip columns #777
- XLSX reader can now ignore blank cells, using the setReadEmptyCells(false) method. #810
- Fix LOOKUP function which was breaking on edge cases #796
- Fix VLOOKUP with exact matches #809
- Support COUNTIFS multiple arguments #830
- Change
libxml_disable_entity_loader()
as shortly as possible #819 - Improved memory usage and performance when loading large spreadsheets #822
- Improved performance when loading large spreadsheets #825
- Improved performance when loading large spreadsheets #824
- Fix color from CSS when reading from HTML #831
- Fix infinite loop when reading invalid ODS files #832
- Fix time format for duration is incorrect #666
- Fix iconv unsupported
//IGNORE//TRANSLIT
on IBM i #791
master
is the new default branch,develop
does not exist anymore
- Improvements to the design of the XML Security Scanner #771
- Fix and improve XXE security scanning for XML-based and HTML Readers #771
- Support page margin in mPDF #750
- Support numeric condition in SUMIF, SUMIFS, AVERAGEIF, COUNTIF, MAXIF and MINIF #683
- SUMIFS containing multiple conditions #704
- Csv reader avoid notice when the file is empty #743
- Fix print area parser for XLSX reader #734
- Support overriding
DefaultValueBinder::dataTypeForValue()
without overridingDefaultValueBinder::bindValue()
#735 - Mpdf export can exceed pcre.backtrack_limit #637
- Fix index overflow on data values array #748
- PHP 7.3 support
- Add the DAYS() function #594
- Sheet title can contain exclamation mark #325
- Xls file cause the exception during open by Xls reader #402
- Skip non numeric value in SUMIF #618
- OFFSET should allow omitted height and width #561
- Correctly determine delimiter when CSV contains line breaks inside enclosures #716
- Remove locale from formatting string #644
- Allow iterators to go out of bounds with prev #587
- Fix warning when reading xlsx without styles #631
- Fix broken sample links on windows due to $baseDir having backslash #653
- Add excel function EXACT(value1, value2) support #595
- Support workbook view attributes for Xlsx format #523
- Read and write hyperlink for drawing image #490
- Added calculation engine support for the new bitwise functions that were added in MS Excel 2013
- BITAND() Returns a Bitwise 'And' of two numbers
- BITOR() Returns a Bitwise 'Or' of two number
- BITXOR() Returns a Bitwise 'Exclusive Or' of two numbers
- BITLSHIFT() Returns a number shifted left by a specified number of bits
- BITRSHIFT() Returns a number shifted right by a specified number of bits
- Added calculation engine support for other new functions that were added in MS Excel 2013 and MS Excel 2016
- Text Functions
- CONCAT() Synonym for CONCATENATE()
- NUMBERVALUE() Converts text to a number, in a locale-independent way
- UNICHAR() Synonym for CHAR() in PHPSpreadsheet, which has always used UTF-8 internally
- UNIORD() Synonym for ORD() in PHPSpreadsheet, which has always used UTF-8 internally
- TEXTJOIN() Joins together two or more text strings, separated by a delimiter
- Logical Functions
- XOR() Returns a logical Exclusive Or of all arguments
- Date/Time Functions
- ISOWEEKNUM() Returns the ISO 8601 week number of the year for a given date
- Lookup and Reference Functions
- FORMULATEXT() Returns a formula as a string
- Financial Functions
- PDURATION() Calculates the number of periods required for an investment to reach a specified value
- RRI() Calculates the interest rate required for an investment to grow to a specified future value
- Engineering Functions
- ERF.PRECISE() Returns the error function integrated between 0 and a supplied limit
- ERFC.PRECISE() Synonym for ERFC
- Math and Trig Functions
- SEC() Returns the secant of an angle
- SECH() Returns the hyperbolic secant of an angle
- CSC() Returns the cosecant of an angle
- CSCH() Returns the hyperbolic cosecant of an angle
- COT() Returns the cotangent of an angle
- COTH() Returns the hyperbolic cotangent of an angle
- ACOT() Returns the cotangent of an angle
- ACOTH() Returns the hyperbolic cotangent of an angle
- Text Functions
- Refactored Complex Engineering Functions to use external complex number library
- Added calculation engine support for the new complex number functions that were added in MS Excel 2013
- IMCOSH() Returns the hyperbolic cosine of a complex number
- IMCOT() Returns the cotangent of a complex number
- IMCSC() Returns the cosecant of a complex number
- IMCSCH() Returns the hyperbolic cosecant of a complex number
- IMSEC() Returns the secant of a complex number
- IMSECH() Returns the hyperbolic secant of a complex number
- IMSINH() Returns the hyperbolic sine of a complex number
- IMTAN() Returns the tangent of a complex number
- Fix ISFORMULA() function to work with a cell reference to another worksheet
- Xlsx reader crashed when reading a file with workbook protection #553
- Cell formats with escaped spaces were causing incorrect date formatting #557
- Could not open CSV file containing HTML fragment #564
- Exclude the vendor folder in migration #481
- Chained operations on cell ranges involving borders operated on last cell only #428
- Avoid memory exhaustion when cloning worksheet with a drawing #437
- Migration tool keep variables containing $PHPExcel untouched #598
- Rowspans/colspans were incorrect when adding worksheet using loadIntoExisting #619
- Ranges across Z and AA columns incorrectly threw an exception #545
- Support to read Xlsm templates with form elements, macros, printer settings, protected elements and back compatibility drawing, and save result without losing important elements of document #435
- Expose sheet title maximum length as
Worksheet::SHEET_TITLE_MAXIMUM_LENGTH
#482 - Allow escape character to be set in CSV reader #492
- Subtotal 9 in a group that has other subtotals 9 exclude the totals of the other subtotals in the range #332
Helper\Html
support UTF-8 HTML input #444- Xlsx loaded an extra empty comment for each real comment #375
- Xlsx reader do not read rows and columns filtered out in readFilter at all #370
- Make newer Excel versions properly recalculate formulas on document open #456
Coordinate::extractAllCellReferencesInRange()
throws an exception for an invalid range #519- Fixed parsing of conditionals in COUNTIF functions #526
- Corruption errors for saved Xlsx docs with frozen panes #532
- Plain text and richtext mixed in same cell can be read #442
- HTML writer creates a generator meta tag #312
- Support invalid zoom value in XLSX format #350
- Support for
_xlfn.
prefixed functions andISFORMULA
,MODE.SNGL
,STDEV.S
,STDEV.P
#390
- Avoid potentially unsupported PSR-16 cache keys #354
- Check for MIME type to know if CSV reader can read a file #167
- Use proper € symbol for currency format #379
- Read printing area correctly when skipping some sheets #371
- Avoid incorrectly overwriting calculated value type #394
- Select correct cell when calling freezePane #389
setStrikethrough()
did not set the font #403
- Support for PHP 7.2
- Support cell comments in HTML writer and reader #308
- Option to stop at a conditional styling, if it matches (only XLSX format) #292
- Support for line width for data series when rendering Xlsx #329
- Better auto-detection of CSV separators #305
- Support for shape style ending with
;
#304 - Freeze Panes takes wrong coordinates for XLSX #322
COLUMNS
andROWS
functions crashed in some cases #336- Support XML file without styles #331
- Cell coordinates which are already a range cause an exception #319
- Support to write merged cells in ODS format #287
- Able to set the
topLeftCell
in freeze panes #261 - Support
DateTimeImmutable
as cell value - Support migration of prefixed classes
- Can read very small HTML files #194
- Written DataValidation was corrupted #290
- Date format compatible with both LibreOffice and Excel #298
- Constant
TYPE_DOUGHTNUTCHART
is nowTYPE_DOUGHNUTCHART
.
- Support for chart fill color - @CrazyBite #158
- Support for read Hyperlink for xml - @GreatHumorist #223
- Support for cell value validation according to data validation rules - @SailorMax #257
- Support for custom implementation, or configuration, of PDF libraries - @SailorMax #266
- Merge data-validations to reduce written worksheet size - @billblume #131
- Throws exception if a XML file is invalid - @GreatHumorist #222
- Upgrade to mPDF 7.0+ #144
- Control characters in cell values are automatically escaped #212
- Prevent color changing when copy/pasting xls files written by PhpSpreadsheet to another file - @al-lala #218
- Add cell reference automatic when there is no cell reference('r' attribute) in Xlsx file. - @GreatHumorist #225 Refer to #201
Reader\Xlsx::getFromZipArchive()
function return false if the zip entry could not be located. - @anton-harvey #268
- Extracted coordinate method to dedicate class migration guide.
- Column indexes are based on 1, see the migration guide.
- Standardization of array keys used for style, see the migration guide.
- Easier usage of PDF writers, and other custom readers and writers, see the migration guide.
- Easier usage of chart renderers, see the migration guide.
- Rename a few more classes to keep them in their related namespaces:
CalcEngine
=>Calculation\Engine
PhpSpreadsheet\Calculation
=>PhpSpreadsheet\Calculation\Calculation
PhpSpreadsheet\Cell
=>PhpSpreadsheet\Cell\Cell
PhpSpreadsheet\Chart
=>PhpSpreadsheet\Chart\Chart
PhpSpreadsheet\RichText
=>PhpSpreadsheet\RichText\RichText
PhpSpreadsheet\Style
=>PhpSpreadsheet\Style\Style
PhpSpreadsheet\Worksheet
=>PhpSpreadsheet\Worksheet\Worksheet
- Initial implementation of SUMIFS() function
- Additional codepages
- MemoryDrawing not working in HTML writer #808
- CSV Reader can auto-detect the separator used in file #141
- HTML Reader supports some basic inline styles #180
- Start following SemVer properly.
- Fix to getCell() method when cell reference includes a worksheet reference - @MarkBaker
- Ignore inlineStr type if formula element exists - @ncrypthic #570
- Excel 2007 Reader freezes because of conditional formatting - @rentalhost #575
- Readers will now parse files containing worksheet titles over 31 characters #176
- Fixed PHP8 deprecation warning for libxml_disable_entity_loader() #1625
- Whitespace after toRichTextObject() - @MarkBaker #554
- Optimize vlookup() sort - @umpirsky #548
- c:max and c:min elements shall NOT be inside c:orientation elements - @vitalyrepin #869
- Implement actual timezone adjustment into PHPExcel_Shared_Date::PHPToExcel - @sim642 #489
- Introduction of namespaces for all classes, eg:
PHPExcel_Calculation_Functions
becomesPhpOffice\PhpSpreadsheet\Calculation\Functions
- Some classes were renamed for clarity and/or consistency:
For a comprehensive list of all class changes, and a semi-automated migration path, read the migration guide.
- Dropped
PHPExcel_Calculation_Functions::VERSION()
. Composer or git should be used to know the version. - Dropped
PHPExcel_Settings::setPdfRenderer()
andPHPExcel_Settings::setPdfRenderer()
. Composer should be used to autoload PDF libs. - Dropped support for HHVM
The changelog for the project when it was called PHPExcel is still available.
- Replace ezyang/htmlpurifier (LGPL2.1) with voku/anti-xss (MIT)