Skip to content
CAI
Software that uses CAICheck a score

PHPOffice/PhpSpreadsheet

68.2

Adequate · 26 September 2026

138.6k

lines of production code

PHP

primary language

3

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is PhpSpreadsheet, a PHP library for reading, writing, and manipulating spreadsheet files in formats such as XLSX, XLS, ODS, CSV, and HTML. It provides a comprehensive calculation engine that supports Excel-compatible functions across mathematical, financial, statistical, and engineering domains, including modern array formula handling. The library also features robust tools for generating charts, pivot tables, and PDF exports, along with utilities for conditional formatting, data validation, and secure file processing.

How it got here

2010–2015 — migration to PhpSpreadsheet

49 changes.

This period marks the comprehensive migration from the legacy PHPExcel library to the new PhpSpreadsheet project, involving the removal of all deprecated classes and build infrastructure. The work focused on refactoring the codebase into a modern, modular architecture with strict typing, while introducing new features such as named formulas, advanced chart styling, and improved cell iteration. It also established Composer-based dependency management and a robust test suite to support the transition to PHP 8.2.

2016–2021 — Calculation engine and reader refactoring

54 changes.

This period focused on decomposing monolithic codebases into modular, maintainable components, particularly within the calculation engine, readers, and writers. The work introduced native array argument support across mathematical, statistical, and financial functions while enhancing type safety and security through dedicated helper classes and XML scanning. Concurrently, the project expanded its sample applications and added support for modern PDF generation and improved file format fidelity.

2022–2026 — Wizard APIs and sample expansion

28 changes.

This period focused on introducing fluent wizard APIs for conditional formatting, number formatting, and pivot tables to simplify complex spreadsheet configurations. The calculation engine was extended with new information, engineering, and financial functions, alongside support for Excel table structured references and Agile XLSX encryption. A massive expansion of sample scripts was added to demonstrate these new features across various file formats, charting options, and data handling scenarios.

Features

Add CUMIPMT, CUMPRINC, IPMT, ISPMT, PMT, PPMT, and RATE financial functions

This change introduces a new set of Excel-compatible financial calculation functions to PhpSpreadsheet. Users can now calculate cumulative interest (CUMIPMT) and principal (CUMPRINC) over a specified range of periods, individual interest (IPMT) and principal (PPMT) payments for specific periods, interest payments based on a constant payment schedule (ISPMT), constant annuity payments (PMT), and the interest rate per period for an annuity (RATE). These functions are implemented in the \src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic\ directory and include input validation and error handling consistent with Excel's behavior.

src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic · high confidence

Add SpgrContainer class for Excel shape group handling

The new SpgrContainer class in the Escher DgContainer namespace provides the structure for managing shape group containers within Excel files. It allows users to set and retrieve parent containers, add child shape or shape-group containers, and recursively retrieve all nested spContainers, enabling more robust parsing and manipulation of complex Excel drawing structures.

src/PhpSpreadsheet/Shared/Escher/DgContainer · high confidence

Added calculation locale data for multiple languages

Added new locale configuration and function translation files for Bulgarian, Czech, Danish, German, English (UK), Spanish, Finnish, French, Hungarian, Italian, Norwegian Bokmål, Dutch, Polish, and Brazilian Portuguese. These files provide localized argument separators, error messages, and function names, enabling users to work with spreadsheets using their native language settings in the calculation engine.

src/PhpSpreadsheet/Calculation/locale · high confidence

Added sample scripts for PhpSpreadsheet financial functions

New demonstration scripts have been added to the samples/Financial1 and samples/Financial3 directories to showcase various financial calculation capabilities. These include examples for accrued interest (ACCRINT, ACCRINTM), depreciation (AMORDEGRC, AMORLINC), coupon date calculations (COUPDAYBS, COUPDAYS, COUPDAYSNC, COUPNCD, COUPNUM, COUPPCD), cumulative loan metrics (CUMIPMT, CUMPRINC), investment returns (INTRATE, IRR, MIRR, NPV), interest payments (IPMT, ISPMT), and rate/period conversions (NOMINAL, NPER).

samples/Financial1, samples/Financial3 · high confidence

Automated documentation and locale generation tools moved to infrastructure

The DocumentGenerator and LocaleGenerator classes have been added to the infra directory to automate the creation of function reference documentation and locale configuration files. DocumentGenerator now produces Markdown tables listing Excel functions by category and name, while LocaleGenerator reads translation spreadsheets to build locale-specific configuration files (handling argument separators, currency symbols, and error codes) and function name translation files. These tools are now part of the infrastructure layer, ensuring they are excluded from non-development composer downloads.

infra · high confidence

CSV reader now automatically infers the delimiter character

The CSV reader now includes a new Delimiter class that automatically detects the separator used in a CSV file by analyzing the first 1,000 lines. It counts occurrences of potential delimiters (comma, semicolon, tab, pipe, colon, space, tilde) and selects the one with the lowest mean square deviation, improving usability for files where the delimiter is not explicitly specified.

src/PhpSpreadsheet/Reader/Csv · high confidence

Calculation engine refactored with new array, branch, and formatting support

The Calculation Engine has been refactored to introduce several new capabilities and internal structures. A new ArrayArgumentHelper and ArrayArgumentProcessor have been added to enable Excel function implementations to handle arrays as arguments in array formulas, supporting vector and matrix operations. The engine now includes a BranchPruner to optimize performance by pruning unused branches in IF statements. Additionally, a new FormattedNumber class improves the handling of locale-specific formatted numeric strings, allowing thousands separators in percentages and currency values to be correctly processed as numbers. Internal engine components like the Logger and CyclicReferenceStack have also been introduced to support debug logging and circular reference detection.

src/PhpSpreadsheet/Calculation/Engine · high confidence

Chart rendering now supports the maintained mitoteam/jpgraph package

The chart rendering subsystem in src/PhpSpreadsheet/Chart/Renderer has been updated to support the actively maintained mitoteam/jpgraph package alongside the legacy jpgraph/jpgraph. A new MtJpGraphRenderer class is introduced to handle initialization and module loading for the mitoteam variant, while the existing JpGraph renderer remains for the abandoned package. This change allows users to render charts using a supported library version, addressing compatibility and maintenance concerns with the previous default.

src/PhpSpreadsheet/Chart/Renderer · high confidence

Document properties and security configuration classes introduced

The \src/PhpSpreadsheet/Document\ directory now contains \Properties.php\ and \Security.php\, providing the core classes for managing spreadsheet metadata and protection settings. The \Properties\ class allows users to set and retrieve document attributes such as creator, title, description, and timestamps, while also supporting custom properties and a hyperlink base. The \Security\ class enables configuration of workbook and revision locking, and handles password protection with support for both legacy and advanced hashing algorithms (including algorithm name, salt, and spin count configuration) via the \PasswordHasher\ utility.

src/PhpSpreadsheet/Document · high confidence

Engineering functions now support array arguments

The Engineering calculation functions (including Bessel, Bitwise, Complex, and Base Conversion functions) now accept array inputs for their arguments. When an array is passed, the functions will evaluate the operation for each element in the array and return an array of results, enabling array-based formulas in spreadsheets.

src/PhpSpreadsheet/Calculation/Engineering · high confidence

Expanded PDF sample demonstrations for advanced rendering features

The samples/Pdf directory has been reorganized and expanded with new examples demonstrating advanced PDF generation capabilities. Users can now explore dedicated samples for each supported PDF engine (Dompdf, mPDF, TCPDF), including specific tests for landscape orientation, grid line visibility, and fitting content to page height. The collection also introduces samples for custom HTML editing callbacks to modify output styles, RTL (right-to-left) sheet direction support, and embedding drawings. Additionally, new examples illustrate how to implement custom page headers and footers for each engine, either by injecting HTML/CSS or by extending the writer classes to override header/footer methods.

samples/Pdf · high confidence

Expanded Reader2 sample library with new CSV, XLS, and XLSX usage examples

The samples/Reader2 directory has been reorganized and significantly expanded with new demonstration scripts and test data. New samples cover reading multiple CSV files into separate worksheets, processing large CSV files in chunks using a custom read filter, handling tab-separated values with the Advanced Value Binder, and managing loader exceptions via try-catch blocks. Additional examples demonstrate listing worksheet names and metadata without loading full file content, handling worksheet hyperlinks and images, preserving long integers in CSVs using a String Value Binder, and loading files with forms and comments. A new sample also illustrates efficient row iteration using rangeToArrayYieldRows(). Supporting sample data files (CSV, TSV, XLS, XLSX) have been added to enable these examples.

samples/Reader2 · high confidence

Expanded chart sample library with advanced formatting and theme support

The samples/Chart33a directory has been reorganized and significantly expanded with new examples demonstrating advanced charting capabilities. Users can now find samples for area, bar, bubble, column, and line charts, including specific demonstrations of custom data series colors, data table integration, and the ability to omit chart borders. The samples also showcase support for current Office themes (2013+ schemes), detailed line styling (such as smooth lines, arrows, and custom markers), and composite charts that combine multiple plot types like columns, lines, and areas in a single view.

samples/Chart33a · high confidence

Expanded chart styling and axis configuration capabilities

Users can now apply advanced visual effects to charts, including shadows, glows, and soft edges, and configure custom colors using standard, scheme, or RGB types via the new ChartColor class. Axis control has been significantly improved with support for text rotation, display units, logarithmic scales, and date-based axes, while gridlines have been moved from the chart level to individual axes. Additionally, data labels and titles now support richer formatting with custom fonts, effects, and overlay options, and scatter charts allow for configurable point sizes.

src/PhpSpreadsheet/Chart · high confidence

Expanded charting samples with advanced scatter, pie, and radar examples

The samples/Chart33b directory has been reorganized and expanded with new demonstration scripts for creating various chart types. These include multiple charts in a single sheet, pie and donut charts (with custom color support), radar charts, and a comprehensive suite of scatter charts. The scatter chart samples specifically demonstrate advanced features such as date-based X-axes, custom marker styles and line properties, gradient fills, trendlines, value-based X-axes, and handling of blank data points.

samples/Chart33b · high confidence

Expanded sample library in Basic4

The Basic4 sample directory has been significantly expanded with new demonstration scripts covering duplicate style application, workbook password protection, rich text generation from HTML and RTF, merging workbooks, worksheet metadata inspection, quadratic equation solving via web form, HTML file reading, XLS/XLSX fill handling, image anchoring and sizing within cells, and comprehensive cell alignment options.

samples/Basic4 · high confidence

Expanded sample library with new file format, styling, and image demos

The Basic2 sample directory has been reorganized and significantly expanded with new demonstration scripts. Users can now explore reading and writing for Excel 2003 XML, Gnumeric, SYLK, and XLS formats, alongside existing ODS support. New examples illustrate advanced styling techniques using shared styles and heavy formatting, as well as performance optimization via read filters for large spreadsheets. The update also introduces in-memory image generation (JPEG, GIF, PNG) and demonstrates exporting to PDF and HTML with image support, providing a broader set of practical use cases for the library.

samples/Basic2 · high confidence

Introduced SpContainer class for managing individual shape properties

Added the SpContainer class within the Escher shape group container hierarchy to manage properties for individual shapes, including parent references, shape type, flags, indices, and coordinate offsets. This new component provides the necessary data structure to handle specific shape details within a group, supporting the parsing and generation of complex Excel drawing elements.

src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer · high confidence

Introduction of the Cells collection class and factory

The \src/PhpSpreadsheet/Collection\ directory now contains the \Cells\ class, which manages the in-memory and cached storage of individual cells within a worksheet, and the \CellsFactory\ class, which provides a static entry point to instantiate a \Cells\ collection using the global cache settings. This change introduces the core data structure for cell management, including methods for adding, updating, deleting, and retrieving cell coordinates, while integrating with the PSR-16 cache interface for persistent storage.

src/PhpSpreadsheet/Collection · high confidence

New AutoFilter Column Rule class for defining filter criteria

The library introduces a new \Rule\ class within the \PhpOffice\\PhpSpreadsheet\\Worksheet\\AutoFilter\\Column\ namespace to define specific filtering criteria for auto-filter columns. This class exposes constants for various rule types (such as filter, date group, custom, dynamic, and top/bottom ten filters), dynamic date ranges (like today, yesterday, next week), and comparison operators (equal, greater than, etc.). It also includes private arrays to validate these rule types, operators, and dynamic filters, ensuring that only supported configurations are applied when setting up auto-filters on spreadsheet columns.

src/PhpSpreadsheet/Worksheet/AutoFilter/Column · high confidence

New Engineering sample scripts for Bessel, conversion, and special functions

Added new sample scripts in the Engineering directory demonstrating the usage of BESSELI, BESSELJ, BESSELK, and BESSELY functions, as well as DELTA, ERF, ERFC, and GESTEP. The CONVERT sample now includes a web-based interactive form (Convert-Online.php) for unit conversions, supplementing the existing command-line example.

samples/Engineering · high confidence

New HTML export samples for conditional and table formatting

Added six new sample scripts in the samples/Html directory demonstrating how to export spreadsheets to HTML with specific formatting options. These samples show how to enable conditional formatting (html\_01, html\_02, html\_03), table formats (html\_04, html\_05), and custom HTML callbacks for table cellspacing and border styling (html\_06).

samples/Html · high confidence

New LookupRef sample scripts for array sorting and cell reference functions

Added a set of new sample scripts in the samples/LookupRef directory that demonstrate various lookup and reference functions. These include ADDRESS, COLUMN, COLUMNS, INDEX, INDIRECT, OFFSET, ROW, ROWS, and VLOOKUP, showing how to use these functions in spreadsheets. Additionally, new samples SortExcelArray and SortExcelCols demonstrate array sorting capabilities, including support for LibreOffice semantics.

samples/LookupRef · high confidence

New Number Format Wizards for Currency, Accounting, Date, Time, Duration, and more

A new set of wizard classes has been added to the NumberFormat namespace to help users generate Excel-compatible format masks programmatically. This includes dedicated wizards for Currency and Accounting formats (with support for locale-specific formatting via the Intl extension, negative number styles, and decimal precision), as well as wizards for Date, Time, DateTime, Duration, Number, Percentage, and Scientific formats. These classes allow users to construct complex format strings by specifying options like separators, decimal places, and symbol positioning, rather than writing mask codes manually.

src/PhpSpreadsheet/Style/NumberFormat/Wizard · high confidence

New OLE stream and PPS classes for reading OLE containers

Added ChainedBlockStream and PPS classes to the Shared/OLE component. ChainedBlockStream implements a PHP stream wrapper for reading OLE file data, supporting both big and small block chains, while PPS provides the structure for OLE Property Pointer Sets including name, type, timestamps, and data size. These classes enable reading OLE containers (used in older Excel formats) by exposing file data through standard PHP stream functions.

src/PhpSpreadsheet/Shared/OLE · high confidence

New PDF writers for Dompdf, Mpdf, and Tcpdf

PhpSpreadsheet now includes dedicated writer classes for Dompdf, Mpdf, and Tcpdf, allowing users to generate PDFs using these specific libraries. The new Dompdf writer respects page orientation and paper size settings. The Mpdf writer supports custom configurations, handles page margins, and includes a temporary workaround for PHP 8.6 deprecation warnings. The Tcpdf writer supports headers, footers, and RTL alignment. Additionally, a TcpdfNoDie variant is provided to ensure Tcpdf throws exceptions instead of terminating the script, improving error handling for applications that rely on exception-based control flow.

src/PhpSpreadsheet/Writer/Pdf · high confidence

New PhpSpreadsheet sample scripts for security, protection, and validation

The Basic1 sample directory now includes new demonstration scripts for document and cell security (11\_Documentsecurity.php, 12\_CellProtection.php), data validation (15\_Datavalidation.php), and CSV/HTML export variations (16\_Csv.php, 17\_Html.php, 17a\_Html.php, 17b\_Html.php). These samples illustrate how to lock workbook structures, protect specific cells, enforce input rules, and configure HTML output with embedded images or custom styling.

samples/Basic1 · high confidence

New PivotTable sample scripts for PhpSpreadsheet

Added four new sample scripts in the samples/PivotTable directory that demonstrate how to create and read pivot tables using the PhpSpreadsheet library. The samples cover basic pivot table creation with row, column, and data fields; adding page (report) filters; grouping numeric and date fields; and reading existing pivot table structures from Xlsx files.

samples/PivotTable · high confidence

New WEBSERVICE and URLENCODE calculation functions

Added support for the WEBSERVICE and URLENCODE Excel functions. The WEBSERVICE function fetches data from HTTP or HTTPS URLs, enforcing a 2048-character limit on the URL, requiring an explicit domain whitelist for security, and using TLS 1.3 for HTTPS connections. The URLENCODE function returns a URL-encoded string, replacing spaces with %20.

src/PhpSpreadsheet/Calculation/Web · high confidence

New XmlScanner class to prevent XXE/XEE attacks during file loading

A new XmlScanner class has been introduced in the Reader/Security namespace to actively scan XML content for dangerous ENTITY declarations, thereby preventing XML External Entity (XXE) and XML Entity Expansion (XEE) attacks. The scanner enforces strict encoding rules by rejecting UTF-7 and EBCDIC, ensures UTF-8 consistency, and allows for additional custom validation callbacks. This component serves as a critical security layer for readers processing XML-based spreadsheet formats.

src/PhpSpreadsheet/Reader/Security · high confidence

New autofilter sample scripts demonstrating dynamic and custom filtering

Added five new sample scripts in the Autofilter directory that demonstrate advanced filtering capabilities. These include examples for applying dynamic date filters (such as year-to-date, last month, or specific weeks), custom text filters with wildcards, numeric range filters, and date group filters. The samples also show how to execute filter rules within the library using showHideRows to display filtered results directly in the output.

samples/Autofilter · high confidence

New basic sample scripts for spreadsheet creation and download

The samples/Basic directory now includes a comprehensive set of new example scripts demonstrating core PhpSpreadsheet capabilities. These samples cover creating spreadsheets with various data types (strings, numbers, dates, rich text, hyperlinks), applying formulas, configuring print settings (headers, footers, page breaks), and using conditional formatting. Additionally, new download examples allow users to generate and stream XLSX, XLS, ODS, and PDF files directly to a web browser, while a dedicated sparkline sample demonstrates adding line, column, and win/loss sparklines to worksheets.

samples/Basic · high confidence

New cell address and range objects with R1C1 conversion helper

The library now introduces dedicated value objects for cell addressing: CellAddress represents a single cell (with optional worksheet context and navigation methods like nextRow/nextColumn), CellRange represents a rectangular block of cells, and ColumnRange represents a full-column span. These objects implement the AddressRange interface and provide type-safe alternatives to string-based coordinates. Additionally, a new AddressHelper class provides static methods to convert between R1C1 and A1 cell reference formats, including support for converting R1C1-style references within formulas to A1 style, and handles locale-specific R/C character variations.

src/PhpSpreadsheet/Cell · high confidence

New conditional formatting sample files for Xlsx

Added a suite of sample scripts in samples/ConditionalFormatting that demonstrate how to apply conditional formatting rules using the PhpSpreadsheet Wizard API (including basic, text, blank, error, date, duplicate, and expression comparisons) and how to configure Color Scales and Icon Sets for Xlsx files.

samples/ConditionalFormatting · high confidence

New database sample scripts for statistical and aggregation functions

Added sample scripts in the Database category demonstrating the DAVERAGE, DCOUNT, DCOUNTA, DGET, DMAX, DMIN, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DVAR, and DVARP functions, providing examples of querying and calculating statistics on structured data sets using criteria.

samples/Database · high confidence

New financial functions for constant periodic cash flows

The library now includes the FV (Future Value), PV (Present Value), and NPER (Number of Periods) financial functions, implemented in the new \Periodic\ class under \src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant\. These functions allow users to calculate annuity metrics for cash flows with constant payments and interest rates, supporting options for payment timing (beginning or end of period) and validating inputs such as rates, periods, and values to return appropriate error codes for invalid arguments.

src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant · high confidence

New financial sample scripts for depreciation, discount, and interest calculations

The samples/Financial2 directory now includes new PHP demonstration scripts for various financial functions. These samples illustrate how to calculate asset depreciation using the Fixed Declining Balance (DB) and Double Declining Balance (DDB) methods, determine security discount rates (DISC), convert between fractional and decimal dollar values (DOLLARDE, DOLLARFR), compute effective annual interest rates (EFFECT), and calculate future values for investments with constant payments (FV) or variable interest schedules (FVSCHEDULE).

samples/Financial2 · high confidence

New fluent wizards for conditional formatting rules

This change introduces a new set of wizard classes in the \src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard\ directory to provide a fluent, object-oriented API for creating and reading conditional formatting rules. The new \Blanks\, \CellValue\, \DateValue\, \Duplicates\, \Errors\, \Expression\, and \TextValue\ wizards allow users to define conditions (such as cell values, text patterns, dates, blanks, errors, and duplicates) using method chaining, while the \WizardAbstract\ base class and \WizardInterface\ handle the underlying logic for generating Excel formulas and mapping back from existing \Conditional\ objects via \fromConditional\.

src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard · high confidence

New helper classes for dimensions, HTML, and sample execution

The \src/PhpSpreadsheet/Helper\ directory now includes several new utility classes: \Dimension\ for parsing and converting measurement units (e.g., cm, px, pt) to internal pixel values; \Size\ for validating size strings with regex; \Html\ for converting HTML content to RichText objects with color mapping; \Downloader\ for handling file downloads in web-based sample execution; \Sample\ for managing sample code execution, logging, and temporary file generation; and \TextGrid\ for rendering tabular data in CLI or HTML formats. These helpers support improved dimension handling, HTML import capabilities, and better sample code infrastructure.

src/PhpSpreadsheet/Helper · high confidence

New information and error-checking functions for spreadsheets

This change introduces a new set of Excel-compatible information functions within the calculation engine, allowing users to inspect cell values and environment details. The update adds support for type-checking functions including ISBLANK, ISERR, ISERROR, ISNA, ISREF, ISEVEN, ISODD, ISNUMBER, ISLOGICAL, ISTEXT, and ISNONTEXT, which now correctly handle array inputs and return appropriate boolean results or error codes. Additionally, the INFO function is implemented to return details about the current operating environment (such as OS version and memory usage) when enabled, and the ERROR\_TYPE function is added to identify specific error codes like \#DIV/0!, \#REF!, \#SPILL!, and \#CALC!. These functions are grouped into new dedicated classes (ErrorValue, ExcelError, Info, Value) to centralize error handling and information retrieval logic.

src/PhpSpreadsheet/Calculation/Information · high confidence

New interactive NumberFormat Wizard samples for Currency, Accounting, and standard number formats

The samples/Wizards directory now includes interactive web-based examples for the new NumberFormat Wizard classes. Users can explore and generate format masks for standard numbers, percentages, and scientific notation, as well as specialized Currency and Accounting formats. The Currency and Accounting wizards specifically allow users to configure currency symbols, decimal places, thousands separators, symbol position, and negative number styles (such as red minus signs or parentheses), demonstrating how to use the new Wizard\\Currency and Wizard\\Accounting classes to build complex number formats programmatically.

samples/Wizards · high confidence

New modular ODS cell writer components for comments and styles

The ODS writer now includes dedicated classes in the \src/PhpSpreadsheet/Writer/Ods/Cell\ directory to handle specific cell aspects. The new \Comment\ class correctly writes cell comments, including support for newlines within comment text. The \Style\ class manages cell styling, mapping alignment (horizontal/vertical), fills, borders (including diagonal and width/style mapping), and protection settings to the ODS format.

src/PhpSpreadsheet/Writer/Ods/Cell · high confidence

New pre-commit hook and code quality scripts

A new pre-commit git hook has been added to automatically validate code style using php-cs-fixer, check PHP syntax, and enforce the use of native PHP types over PHPDoc types. Additionally, new scripts have been introduced to generate documentation for the function list (by category, name, and compact name) and to generate locale translation files.

bin · high confidence

New read-only pivot table inspection and fluent builder for creating new pivot tables

Users can now inspect existing pivot tables in loaded spreadsheets via a new read-only object model (PivotTable, PivotField, PivotCacheDefinition) that exposes metadata such as field axes, aggregation functions, and cache sources without modifying the underlying file. Additionally, a new PivotTableBuilder allows creating new pivot tables from source data ranges using a fluent API to define row, column, and filter fields, specify data aggregations, and apply numeric or date grouping; the resulting pivot tables are generated with refresh-on-load so values are computed by the spreadsheet application.

src/PhpSpreadsheet/Worksheet/PivotTable · high confidence

New sample scripts for Engineering and Date/Time functions

Added new sample scripts in the samples directory demonstrating usage of Engineering functions (BITAND, BITLSHIFT, BITOR, BITRSHIFT, BITXOR, COMPLEX, IMABS, IMAGINARY, IMARGUMENT, IMCONJUGATE, IMREAL, IMCOS, IMCOSH, IMCOT, IMCSC, IMCSCH, IMDIV, IMEXP, IMLN, IMLOG10, IMLOG2, IMPOWER, IMPRODUCT, IMSEC, IMSECH, IMSIN, IMSINH, IMSQRT, IMSUB, IMSUM, IMTAN) and Date/Time functions (DATE, DATEDIF, DATEVALUE, DAY, DAYS, DAYS360). These samples provide executable examples for users to understand how to use these specific spreadsheet functions within PhpSpreadsheet.

(repo-wide) · high confidence

New sample scripts for base-conversion functions

Added demonstration scripts in the HexEtcConversions sample directory for all binary, decimal, hexadecimal, and octal conversion functions (BIN2DEC, BIN2HEX, BIN2OCT, DEC2BIN, DEC2HEX, DEC2OCT, HEX2BIN, HEX2DEC, HEX2OCT, OCT2BIN, OCT2DEC, and OCT2HEX). These samples show how to use the Engineering category functions to convert numbers between different bases within PhpSpreadsheet.

samples/HexEtcConversions · high confidence

New sample scripts for spreadsheet features

Added new sample scripts in the Basic5 directory demonstrating reading XLS vertical breaks, applying sheet and cell-level protection with sort restrictions, configuring currency and accounting number formats using wizards, setting image opacity, inserting in-cell versus floating images, and applying defined number styles to ODS files.

samples/Basic5 · high confidence

New sample scripts for templates, properties, and data validation

Added new sample scripts in the Basic3 directory that demonstrate loading and modifying XLS/XLSX templates, writing and verifying document properties for both XLS and XLSX formats, configuring page layout views, cloning worksheets, and implementing dependent dropdown lists using named ranges and data validation. Included supporting data files listing countries by continent to enable the dropdown sample.

samples/Basic3 · high confidence

New sample templates for HTML reading, PDF font configuration, and data sorting

The samples/templates directory has been expanded with several new demonstration files. A new HTML template (46readHtml.html) provides a styled table for testing HTML-to-spreadsheet reading with inline colors. A new PHP class (Mpdf2.php) demonstrates how to extend the Mpdf writer to include custom fonts (ShadowsIntoLight) via a bundled license file (ShadowsIntoLight.OFL.txt). Additionally, new samples include a PHP class (SortExcel.php) for custom array sorting logic, a SYLK test file (SylkTest.slk) for format coverage, and new Excel 2003 XML templates (excel2003.xml, excel2003.short.bad.xml) for reader testing.

samples/templates · high confidence

New samples for NamedFormula and NamedRange usage

Added ten new sample scripts in the DefinedNames directory demonstrating the use of the NamedFormula and NamedRange classes. These examples cover absolute and relative named ranges, scoped named ranges (both global and worksheet-specific), and named formulas, including cross-worksheet references and dynamic range calculations using OFFSET.

samples/DefinedNames · high confidence

New samples for reading workbook metadata and structure

Added four new sample scripts in the Reading\_workbook\_data directory that demonstrate how to inspect workbook metadata and structure. Custom\_properties.php and Custom\_property\_names.php show how to retrieve and display custom document properties, including handling various data types like integers, floats, strings, dates, and booleans. Properties.php demonstrates reading standard document properties such as creator, creation/modification dates, title, description, and company information. Worksheet\_count\_and\_names.php illustrates how to get the count of worksheets and list their names within a workbook.

_samples/Reading\_workbook\data · high confidence

New table column formula and style configuration capabilities

This change introduces new capabilities for Excel table formatting within PhpSpreadsheet. Users can now set and retrieve a specific formula for an entire table column via the new \Column\ class methods (\getColumnFormula\/\setColumnFormula\), allowing for calculated columns. Additionally, the \TableStyle\ and \TableDxfsStyle\ classes provide granular control over table appearance, including support for Light, Medium, and Dark theme styles, row/column striping, and first/last column highlighting, along with the ability to apply custom styles to header and stripe rows.

src/PhpSpreadsheet/Worksheet/Table · high confidence

New table sample scripts demonstrating autofilters, totals, and column formulas

The samples/Table directory now includes four new example scripts (01\_Table.php, 02\_Table\_Total.php, 03\_Column\_Formula.php, and 04\_Column\_Formula\_with\_Totals.php) that demonstrate advanced table features. These samples show how to configure table styles, apply custom autofilter rules, enable totals rows with structured reference formulas, and set column-specific formulas within Excel tables.

samples/Table · high confidence

Ods reader now supports AutoFilters, Named Ranges, and Page Settings

The Ods reader now extracts AutoFilters, Named Ranges (both cell ranges and formula expressions), and detailed Page Settings (including orientation, margins, and sheet visibility) from ODS files. This is achieved by introducing new dedicated loader classes (AutoFilter, DefinedNames, PageSettings) that parse the relevant XML structures and apply them to the resulting spreadsheet, significantly improving fidelity when opening complex ODS documents.

src/PhpSpreadsheet/Reader/Ods · high confidence

Refactored DateTime functions to support array arguments

The DateTime calculation functions (such as DATE, DAY, MONTH, YEAR, EDATE, EOMONTH, NETWORKDAYS, and DAYS) have been restructured to support array arguments, allowing them to process multiple values at once in array formulas. This change introduces the \ArrayEnabled\ trait to the implementation classes and updates the function signatures to accept and evaluate arrays, enabling batch processing of date inputs without requiring manual iteration by the user.

src/PhpSpreadsheet/Calculation/DateTimeExcel · high confidence

Refactored statistical distribution functions into dedicated classes with array support

The statistical distribution functions (Beta, Binomial, ChiSquared, Exponential, F, Fisher, Gamma, HyperGeometric, LogNormal, Normal, Poisson, Student-T, and Weibull) have been extracted from the main Statistical class into their own dedicated classes within the Distributions namespace. This refactoring introduces native array argument handling for all distribution functions, allowing users to pass arrays of values directly to functions like BETADIST, BINOMDIST, and CHIDIST without needing array formulas. The change also includes a new DistributionValidations helper class for consistent input validation and a NewtonRaphson solver class for inverse distribution calculations.

src/PhpSpreadsheet/Calculation/Statistical/Distributions · high confidence

Support for Agile XLSX file encryption

PhpSpreadsheet now supports reading and writing XLSX files encrypted with the ECMA-376 Agile Encryption profile (AES-256/SHA-512). This new capability allows users to open password-protected spreadsheets that use this modern encryption standard, which was previously unsupported, and to save new files with this level of security.

src/PhpSpreadsheet/Shared/Xlsx · high confidence

Support for Excel Table Structured References in formulas

The calculation engine now recognizes and resolves Excel Table Structured References (e.g., \[Column1\], \[\#This Row\]) within formulas. This change introduces a new \StructuredReference\ operand class that parses these references, identifies the associated table (including tables on different sheets), and converts them into standard cell ranges for calculation. It also handles specific item specifiers like \\#Headers\, \\#Data\, and \\#Totals\, ensuring that formulas referencing table structures evaluate correctly.

src/PhpSpreadsheet/Calculation/Engine/Operands · high confidence

Removals

Removal of Escher BLIP store container classes

The \BstoreContainer\, \BSE\, and \Blip\ classes within the \Classes/PHPExcel/Shared/Escher/DggContainer\ directory have been removed. These classes previously managed the collection of BLIP (Big Large Image or Picture) store entries and their associated raw image data; their deletion eliminates the internal support for handling these specific Escher image structures.

Classes/PHPExcel/Shared/Escher/DggContainer · high confidence

Removal of Escher shape container classes

The \SpgrContainer\ and \SpContainer\ classes within the \Classes/PHPExcel/Shared/Escher/DgContainer\ directory have been removed. These classes previously managed the hierarchy and properties of shape group containers and individual shapes in Excel files; their deletion means this specific internal structure for handling Escher drawing objects is no longer available in the library.

Classes/PHPExcel/Shared/Escher/DgContainer · high confidence

Removal of Excel2007 Writer component files

The Excel2007 Writer implementation files in the \Classes/PHPExcel/Writer/Excel2007\ directory have been removed. This includes the core writer parts responsible for generating the XML structure of .xlsx files, such as \Comments.php\, \ContentTypes.php\, \DocProps.php\, \Drawing.php\, \Rels.php\, \StringTable.php\, \Style.php\, \Theme.php\, and \Workbook.php\. Consequently, the library can no longer generate Excel 2007+ (\.xlsx\) workbooks.

Classes/PHPExcel/Writer/Excel2007 · high confidence

Removal of Excel5 Escher parser class

The \Classes/PHPExcel/Reader/Excel5/Escher.php\ file has been deleted from the codebase. This removes the dedicated Escher stream parser class that was previously responsible for parsing binary Escher data (including drawing group containers, blip stores, and shape records) within the Excel5 reader. Users relying on this specific internal component for Excel 97-2003 file parsing will no longer have access to this standalone class.

Classes/PHPExcel/Reader/Excel5 · high confidence

Removal of JAMA linear algebra library

The JAMA (Java Matrix) library, previously included in the shared utilities, has been completely removed from the codebase. This deletion eliminates the legacy PHP port of the JAMA package, including the core Matrix class and its associated decomposition algorithms (Cholesky, Eigenvalue, LU, QR, and Singular Value Decomposition), along with their utility files. Users relying on these specific matrix operations for spreadsheet calculations will no longer have access to this implementation.

Classes/PHPExcel/Shared/JAMA · high confidence

Removal of PHPExcel Style component classes

The style component classes in the \Classes/PHPExcel/Style\ directory have been deleted. This includes \Alignment\, \Border\, \Borders\, \Color\, \Conditional\, \Fill\, \Font\, \NumberFormat\, and \Protection\. These classes previously handled cell formatting, including alignment, borders, colors, conditional formatting rules, fills, fonts, number/date formatting, and cell protection. Their removal means that direct access to these style components via the PHPExcel API is no longer possible in this location.

Classes/PHPExcel/Style · high confidence

Removal of PHPExcel.php root class file

The main PHPExcel.php class file has been deleted from the Classes directory. This file previously served as the root entry point, handling autoloader registration, zip stream wrapper setup, and the initialization of the core PHPExcel object including its worksheet collection, document properties, and style managers. Its removal indicates a structural change to how the library is bootstrapped or organized, likely requiring users to adjust their import or initialization logic to use the new entry mechanism.

Classes · high confidence

Removal of legacy CSV, Excel2007, Excel5, HTML, PDF, and Serialized writers

The \Classes/PHPExcel/Writer\ directory has been completely emptied as the legacy writer classes (CSV, Excel2007, Excel5, HTML, PDF, and Serialized) and the \IWriter\ interface have been deleted. This change removes the ability to export spreadsheets to these formats using the previous implementation, requiring users to migrate to the new writer architecture.

Classes/PHPExcel/Writer · high confidence

Removal of legacy Cell component classes

The \AdvancedValueBinder\, \DataType\, \DataValidation\, \DefaultValueBinder\, \Hyperlink\, and \IValueBinder\ classes in the \Classes/PHPExcel/Cell\ directory have been removed. This eliminates the legacy value binding infrastructure and cell data type definitions, meaning users can no longer rely on these specific classes for automatic cell value detection, formatting, or hyperlink management.

Classes/PHPExcel/Cell · high confidence

Removal of legacy Excel5 (BIFF) writer components

The Excel5 (BIFF) writer implementation has been removed from the library. This change deletes the core writer classes located in Classes/PHPExcel/Writer/Excel5/, including BIFFwriter, Escher, Font, Parser, Workbook, Worksheet, and Xf. Users relying on the Excel5 format for generating legacy .xls files will no longer be able to use this writer.

Classes/PHPExcel/Writer/Excel5 · high confidence

Removal of legacy OLE stream and PPS classes

The \ChainedBlockStream\ and \PPS\ classes within the OLE shared library have been removed. These classes previously handled low-level OLE stream reading and property storage structures; their removal indicates a shift in how the library manages OLE file internals, likely relying on a different underlying implementation for stream handling and property management.

Classes/PHPExcel/Shared/OLE · high confidence

Removal of legacy PHPExcel Shared classes

The \Classes/PHPExcel/Shared\ directory has been completely removed, deleting legacy helper classes including \CodePage\, \Date\, \Drawing\, \Escher\ (and its containers), \Excel5\, \File\, \Font\, \OLE\, \OLERead\, and \PasswordHasher\. This change eliminates the underlying infrastructure used for code page mapping, date/time conversion, image dimension handling, OLE/BIFF5 file parsing, and password hashing, meaning any code relying on these shared utilities will no longer function.

Classes/PHPExcel/RichText, Classes/PHPExcel/Shared · high confidence

Removal of legacy PHPExcel core classes

The \Classes/PHPExcel\ directory has been completely removed, eliminating the legacy PHPExcel library and its core components (including the autoloader, calculation engine, cell handling, and I/O factories). This change removes the deprecated PHPExcel implementation from the codebase, requiring users to migrate to the supported successor library.

Classes/PHPExcel · high confidence

Removal of legacy PHPExcel locale translation files

The locale configuration and function translation files for Czech, Danish, German, Ukrainian, and Spanish have been removed from the library. These files, which mapped Excel function names and error codes to local languages, are no longer included in this distribution.

Classes/PHPExcel/locale · high confidence

Removal of legacy Phing-based build system

The automated build infrastructure for PHPExcel has been removed. This change deletes the \build.xml\ configuration and the associated Windows batch scripts (\build-release-documentation.bat\, \build-release-pear.bat\, \build-release-standard.bat\) that previously handled tasks such as generating API documentation, creating PEAR packages, and assembling standard release ZIP archives. Users relying on these scripts for local builds or CI pipelines will no longer have access to this legacy automation.

Build · high confidence

Removal of legacy Worksheet classes and iterators

The \Classes/PHPExcel/Worksheet\ directory has been completely removed, deleting legacy classes such as \BaseDrawing\, \CellIterator\, \RowIterator\, \ColumnDimension\, \RowDimension\, \PageSetup\, \Protection\, and \SheetView\. This change eliminates the older worksheet implementation and its associated row/cell iteration mechanisms from the library.

Classes/PHPExcel/Worksheet · high confidence

Removal of legacy cell caching backends

The APC, Memcache, Wincache, DiscISAM, MemoryGZip, MemorySerialized, PHPTemp, CacheBase, and Icache storage classes have been removed from the CachedObjectStorage directory. This eliminates support for these specific caching mechanisms, meaning users relying on these storage backends for cell data persistence will no longer be able to use them.

Classes/PHPExcel/CachedObjectStorage · high confidence

Removal of legacy file readers and filter interfaces

The CSV, Excel2003XML, Excel2007, Excel5, OOCalc, SYLK, and Serialized readers, along with the DefaultReadFilter and IReadFilter interface, have been removed from the library. This eliminates the ability to import these specific spreadsheet formats and use cell-level read filtering, significantly reducing the supported file types and requiring users to migrate to alternative import methods or libraries.

Classes/PHPExcel/Reader · high confidence

Removal of legacy trend regression classes

The trend analysis classes in \Classes/PHPExcel/Shared/trend\ (including \bestFitClass\, \linearBestFitClass\, \exponentialBestFitClass\, \logarithmicBestFitClass\, \polynomialBestFitClass\, \powerBestFitClass\, and \trendClass\) have been deleted. This removes the underlying implementation for linear, logarithmic, exponential, power, and polynomial regression calculations, meaning any code relying on these specific classes for trend line fitting will no longer function.

Classes/PHPExcel/Shared/trend · high confidence

Removed JAMA example scripts

The example scripts in the JAMA linear algebra library (Classes/PHPExcel/Shared/JAMA/examples) have been removed. This includes demonstration files for matrix operations such as MagicSquareExample, benchmarking tools, polynomial fitting (polyfit), and statistical calculations (Stats), as well as specific algorithm examples like LevenbergMarquardt and LagrangeInterpolation. These files are no longer part of the distribution.

Classes/PHPExcel/Shared/JAMA/examples · high confidence

Removed embedded TCPDF library from PHPExcel

The embedded TCPDF PDF rendering engine (version 4.8.009) and its associated assets (barcodes, fonts, language files, and configuration) have been removed from the \Classes/PHPExcel/Shared/PDF\ directory. TCPDF is no longer bundled with the library and must now be installed separately as an optional dependency if PDF export functionality is required.

Classes/PHPExcel/Shared/PDF · high confidence

Removed legacy PHPExcel build scripts and PEAR packaging configuration

The legacy build infrastructure located in the Build/old directory has been removed. This includes the build.bat and build.php scripts that previously automated the creation of ZIP archives and PEAR packages for PHPExcel, as well as the package.xml manifest defining the PEAR package structure. Users relying on these specific legacy build artifacts will no longer have access to them, as the project has migrated away from this off-site Subversion-based build process.

Build/old · high confidence

Removed obsolete documentation assets and function lists

The documentation area has been cleaned up by deleting the legacy text-based function reference files (FunctionListByCategory.txt and FunctionListByName.txt) and the Visual Studio class diagram assets (Architecture.cd, ReaderWriter.cd, and associated C\# stubs and project files). This removes outdated static listings of Excel functions and obsolete architectural diagrams from the documentation bundle.

Documentation · high confidence

Architecture

Calculation engine refactored into modular classes with array-enabled functions

The Calculation engine has been restructured from a single monolithic class into a modular architecture. The core engine is now split into CalculationBase (function registry), CalculationLocale (locale settings), and Calculation (formula parsing and execution), with a dedicated CalculationParserOnly singleton for parsing to avoid state conflicts. A new ArrayEnabled trait provides helper methods for processing array arguments in functions, enabling array formula support. Binary comparisons are now handled by a dedicated BinaryComparison class. Additionally, the legacy FormulaParser and FormulaToken classes are deprecated.

src/PhpSpreadsheet/Calculation · high confidence

Extract Gnumeric sub-readers for styles, properties, and page setup

The Gnumeric reader has been refactored to extract specific parsing responsibilities into dedicated classes: \Styles.php\ handles cell formatting and border mappings, \Properties.php\ manages document metadata (including legacy and DC namespaces), and \PageSetup.php\ processes print settings, margins, and orientation. This structural change improves code maintainability by isolating these distinct parsing logic blocks from the main reader class.

src/PhpSpreadsheet/Reader/Gnumeric · high confidence

Reader architecture refactored with new base class and interfaces

The reader subsystem has been restructured to improve extensibility and type safety. A new abstract BaseReader class now centralizes common configuration properties (such as readDataOnly, readEmptyCells, and loadSheetsOnly) and provides a unified constructor and security scanning setup for all format-specific readers. A new IReader2 interface extends the existing IReader interface to standardize the listWorksheetInfo and listWorksheetNames methods across all readers. Additionally, a CsvNoEscape reader class has been introduced to provide a strict CSV parsing mode that disables escape character handling and auto-detection, addressing upcoming PHP 9 compatibility concerns.

src/PhpSpreadsheet/Reader · high confidence

Refactor Shared utilities into modern PHP classes

The \src/PhpSpreadsheet/Shared\ directory has been restructured into a set of dedicated, strongly-typed classes (CodePage, Date, Drawing, Escher, File, Font, IntOrFloat, OLE, OLERead, PasswordHasher, StringHelper, TimeZone, XMLWriter). This change replaces the previous monolithic or loosely-organized implementation with a modular architecture that improves type safety, code organization, and maintainability for internal date, encoding, file handling, and styling operations.

src/PhpSpreadsheet/Shared · high confidence

Refactored Lookup and Reference functions into dedicated classes

The Lookup and Reference calculation functions have been reorganized from a monolithic structure into individual, dedicated classes (such as Address, ChooseRowsEtc, ExcelMatch, Filter, HLookup, Indirect, Offset, and others) within the src/PhpSpreadsheet/Calculation/LookupRef directory. This refactoring improves code maintainability and type safety by isolating the logic for each function, while preserving the existing Excel-compatible behavior for users.

src/PhpSpreadsheet/Calculation/LookupRef · high confidence

Refactored Statistical functions into dedicated classes

The monolithic Statistical calculation class has been decomposed into a set of specialized classes (such as Conditional, Confidence, Deviations, Maximum, Minimum, Percentiles, Permutations, Size, StandardDeviations, Standardize, Trends, and Variances) to improve code organization and maintainability. This structural change introduces new base classes for handling validation and data-type adjustments, and updates conditional functions like AVERAGEIF, COUNTIF, and SUMIF to use the new database query logic, ensuring consistent behavior across the statistical calculation engine.

src/PhpSpreadsheet/Calculation/Statistical · high confidence

Refactored XML Reader into dedicated loader classes

The XML reader's monolithic structure has been split into separate, dedicated classes to handle specific aspects of the spreadsheet: DataValidations, PageSettings, Properties, and Style. This refactoring extracts the logic for parsing data validation rules, page setup and print settings, document properties (including custom properties and hyperlink bases), and cell styles into their own files, improving code organization and maintainability without changing the external API.

src/PhpSpreadsheet/Reader/Xml · high confidence

XLS writer refactored into modular components

The XLS writer implementation has been restructured from a monolithic class into a set of specialized, modular classes to improve maintainability and code organization. The core binary stream handling is now in BIFFwriter, while Workbook and Worksheet logic have been separated into their own classes. New dedicated classes handle specific concerns: CellDataValidation maps validation types and styles, ConditionalHelper processes conditional formatting rules, ErrorCode maps error codes, Escher handles drawing and image data, Font manages font record generation, Parser handles formula tokenization, and Xf manages cell and style formatting records. This refactoring isolates responsibilities, making the XLS export logic easier to understand, test, and extend without altering the final output format.

(repo-wide) · high confidence

Behavioural changes

3 commits (0 fixes) modifying samples/Reader/sampleData

A change to existing behaviour in samples/Reader/sampleData — 3 commits, 3 files.

samples/Reader/sampleData · medium confidence · unverified

Added separate SimpleCache implementations for PSR-16 v1 and v3 compatibility

The in-memory cell collection now supports both PSR-16 SimpleCache interface versions 1.0 and 3.0 by introducing two distinct implementations: SimpleCache1 and SimpleCache3. SimpleCache1 provides compatibility with older PSR-16 v1 signatures, while SimpleCache3 implements the updated v3 interface with stricter type hints (e.g., string keys, mixed values, and DateInterval/int TTL support). This allows users to choose the appropriate implementation based on their PSR-16 library version, ensuring broader compatibility without breaking existing behavior.

src/PhpSpreadsheet/Collection/Memory · high confidence

Chart samples updated to use MtJpGraph renderer and new output formats

The chart sample scripts in samples/Chart have been updated to switch the chart rendering engine from the legacy JpGraph to the maintained mitoteam/jpgraph (MtJpGraphRenderer) library. This change enables new sample workflows, including dedicated scripts for reading and writing charts in PDF and HTML formats, and demonstrates dynamic chart title updates. Existing rendering samples now utilize the new renderer, and the samples include logic to handle specific file compatibility issues with the updated library.

samples/Chart · high confidence

Escher container classes now use strict PHP types and throw exceptions for null access

The \DgContainer\ and \DggContainer\ classes in \src/PhpSpreadsheet/Shared/Escher\ have been updated to use strict PHP type declarations for their properties and method parameters, replacing loose typing with specific types like \int\, \array\, and specific container classes. Additionally, new methods (\getSpgrContainerOrThrow\ and \getBstoreContainerOrThrow\) have been introduced to explicitly throw a \SpreadsheetException\ when accessing these nested containers if they are unexpectedly null, changing the behavior from silently returning null to failing fast with a clear error message.

src/PhpSpreadsheet/Shared/Escher · high confidence

Introduced PHP 8 typed classes for Escher BLIP image storage

The library now includes new, strictly typed PHP classes (\BstoreContainer\, \BSE\, and \Blip\) within the \PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer\ namespace to manage BLIP (image) data. These classes replace previous implementations with native PHP 8 property and parameter types, ensuring that image data is handled as strings and parent relationships are strictly enforced, which improves reliability when reading or writing Excel files containing embedded images.

src/PhpSpreadsheet/Shared/Escher/DggContainer · high confidence

Introduction of dedicated AutoFilter Column class

The AutoFilter functionality now uses a dedicated \Column\ class within the \PhpOffice\\PhpSpreadsheet\\Worksheet\\AutoFilter\ namespace to manage individual column filter settings. This change introduces strict typing for column indices and filter types, enforces validation for custom filter rule counts (limiting to two rules), and supports specific filter modes such as filters, custom filters, dynamic filters, and top-10 filters. Users interacting with the library will benefit from more robust handling of autofilter configurations and clearer error reporting when invalid filter types or rule limits are exceeded.

src/PhpSpreadsheet/Worksheet/AutoFilter · high confidence

Logical functions now support array arguments

The logical calculation functions (IF, IFERROR, IFNA, IFS, AND, OR, XOR, NOT, TRUE, FALSE, SWITCH) have been refactored into dedicated classes within the Logical namespace and now natively support array arguments. Users can pass ranges or arrays of values to these functions, and the results will be evaluated element-wise, returning arrays of results that match the input dimensions, rather than requiring manual array formula entry or single-value evaluation.

src/PhpSpreadsheet/Calculation/Logical · high confidence

MathTrig functions refactored into dedicated classes with array formula support

The MathTrig calculation functions have been reorganized from a single monolithic class into a set of dedicated classes (e.g., Absolute, Angle, Ceiling, Floor, MatrixFunctions) within the \src/PhpSpreadsheet/Calculation/MathTrig\ directory. This refactoring introduces native support for array formulas across these functions, allowing them to process arrays of values directly and return results in matching dimensions. The change also includes specific implementation updates for functions like CEILING, FLOOR, and matrix operations (MDETERM, MINVERSE, MMULT) to align with this new structure.

src/PhpSpreadsheet/Calculation/MathTrig · high confidence

Migrate OLE PPS classes to modern PHP and new namespace

The OLE PPS classes (Root and File) have been moved from the legacy PHPExcel structure into the PhpSpreadsheet namespace (PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\PPS). This update modernizes the codebase by adding strict type declarations to constructor and method parameters, enforcing return types, and replacing fully qualified class names with explicit use statements. For users, this ensures better compatibility with modern PHP versions and stricter static analysis, while maintaining the existing OLE container writing functionality.

src/PhpSpreadsheet/Shared/OLE/PPS · high confidence

New internal calculation helpers for array handling and wildcard matching

This change introduces three new internal classes to support calculation logic: \ExcelArrayPseudoFunctions\ provides methods to extract single values from cell references and handle array formula results; \WildcardMatch\ implements Excel-style wildcard pattern matching (supporting \\*\ and \?\) for use in database and statistical functions; and \MakeMatrix\ offers a simple utility to convert arguments into an array. These components form the foundation for upcoming features like spill operators and enhanced database function support.

src/PhpSpreadsheet/Calculation/Internal · high confidence

Reader samples now display loaded worksheet grids in the web view

The Reader sample scripts have been updated to use the helper's displayGrid method, which renders the loaded worksheet data as a visual grid in the web-rendered output. This change improves the usability of the examples by allowing users to see the actual spreadsheet content directly in the browser rather than just seeing log messages.

samples/Reader · high confidence

Refactor statistical functions and introduce enums for formatting and sparklines

The library refactors the Calculation component by extracting statistical functions into dedicated classes (Averages, Counts) to improve code organization. It introduces new enums to strengthen type safety and clarity: IconSetValues for conditional formatting icons, CurrencyNegative for negative currency number formats, TextGridRightAlign for text grid alignment, and SparklineType for sparkline groups. These changes provide a more structured API for users configuring cell styles and calculations.

phpoffice/phpspreadsheet · high confidence

Refactored Excel Database functions into dedicated classes with wildcard support

The Excel Database functions (DAVERAGE, DCOUNT, DCOUNTA, DGET, DMAX, DMIN, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DVAR, DVARP) have been refactored into individual classes extending DatabaseAbstract, delegating calculations to dedicated Statistical and MathTrig components. This change introduces support for wildcard text searches in criteria (e.g., using \* or ?) and improves type safety by removing mixed return types where possible. Users will see more consistent behavior in conditional database operations, with better handling of field extraction and criteria matching.

src/PhpSpreadsheet/Calculation/Database · high confidence

Refactored Financial functions into dedicated classes with improved validation

The financial calculation engine has been reorganized to improve code quality and maintainability. Excel financial functions (such as AMORDEGRC, COUPDAYBS, DB, DOLLARDE, EFFECT, and TBILLEQ) are now implemented in dedicated, domain-specific classes (e.g., Amortization, Coupons, Depreciation, Dollar, InterestRate, TreasuryBill) rather than a single monolithic file. This change introduces a centralized validation layer (FinancialValidations) that standardizes input checking across all financial functions, ensuring consistent error handling and type safety. Additionally, shared logic for day-counting and date handling has been extracted into a new Helpers class, and common constants (like basis and frequency values) are now defined in a dedicated Constants class.

src/PhpSpreadsheet/Calculation/Financial · high confidence

Refactored Writer Architecture with BaseWriter and Unified File Handling

The Writer classes have been restructured to introduce a new \BaseWriter\ abstract class that centralizes common functionality, including file handle management, disk caching configuration, and flag processing for chart inclusion and formula pre-calculation. All specific writers (CSV, HTML, ODS, PDF, XLS, XLSX) now extend this base, inheriting a standardized \openFileHandle\ method that supports both local files and S3 streams, as well as a \maybeCloseFileHandle\ mechanism to ensure resources are properly released. This change also standardizes the \IWriter\ interface and introduces \ZipStream\ compatibility wrappers to support different versions of the underlying ZIP library.

src/PhpSpreadsheet/Writer · high confidence

Refactored XLS style parsing into dedicated helper classes

The XLS reader's style parsing logic has been reorganized into specific helper classes (Border, CellAlignment, CellFont, FillPattern) within the Reader\\Xls\\Style namespace. This change extracts the mapping of BIFF8 style codes to PhpSpreadsheet's internal style objects from the main reader, making the parsing of borders, alignments, fonts, and fill patterns more modular and maintainable without altering the final output for users.

src/PhpSpreadsheet/Reader/Xls/Style · high confidence

Refactored cell reference updates and introduced named formulas

The library now uses a dedicated CellReferenceHelper class to manage the updating of cell references when rows or columns are inserted or deleted, which improves the accuracy of absolute and relative reference adjustments. Additionally, support for Named Formulas has been added, allowing users to define and manage custom formulas within the spreadsheet alongside existing named ranges.

src/PhpSpreadsheet · high confidence

Refactored conditional formatting engine with new internal classes

The conditional formatting logic has been restructured into a set of dedicated classes within the \src/PhpSpreadsheet/Style/ConditionalFormatting\ namespace to improve maintainability and support advanced formatting types. This change introduces \CellMatcher\ to handle the evaluation of conditional rules (including cell comparisons, text conditions, duplicates, and expressions) and \CellStyleAssessor\ to manage the application of matching styles. A new \StyleMerger\ class is used to combine base cell styles with conditional formatting rules, ensuring that font, fill, and border properties are correctly merged. Additionally, new model classes have been added to support specific conditional formatting features: \ConditionalColorScale\ for gradient-based coloring, \ConditionalDataBar\ and \ConditionalDataBarExtension\ for data bar visualizations, \ConditionalIconSet\ for icon-based rules, and \ConditionalFormatValueObject\ to represent threshold values. A \MergedCellStyle\ class now orchestrates the combination of conditional, table, and built-in table styles for a given cell coordinate, while a \Wizard\ class provides a simplified interface for creating common conditional formatting rules.

src/PhpSpreadsheet/Style/ConditionalFormatting · high confidence

Refactored financial cash flow calculations into dedicated classes

The internal implementation of financial cash flow functions has been reorganized to improve code structure and maintainability. The \NonPeriodic\ class now handles non-periodic cash flow calculations, including the XIRR (Internal Rate of Return) and XNPV (Net Present Value) functions, featuring robust root-finding algorithms with fallback to bisection if Newton-Raphson fails to converge. The \Periodic\ class manages periodic cash flows, implementing IRR, MIRR (Modified Internal Rate of Return), and NPV functions. This refactoring isolates the mathematical logic for periodic and non-periodic scenarios, ensuring consistent error handling and precise numerical results for users relying on these financial metrics.

src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable · high confidence

Refactored financial cash flow functions into new class structure

The financial cash flow calculation logic has been reorganized into a new modular structure. A new \CashFlowValidations\ class has been introduced to centralize input validation for rates, periods, and values, ensuring consistent error handling across functions. Additionally, the \Single\ class now encapsulates single-payment financial calculations, specifically implementing the FVSCHEDULE, PDURATION, and RRI functions with improved type safety and validation. This refactoring improves code maintainability and clarity for users relying on these specific financial tools.

src/PhpSpreadsheet/Calculation/Financial/CashFlow · high confidence

Refactored financial security functions into dedicated classes

The financial security calculation functions (ACCRINT, ACCRINTM, PRICE, PRICEDISC, PRICEMAT, DISC, INTRATE, YIELDDISC, YIELDMAT) have been reorganized from a monolithic structure into specific classes (AccruedInterest, Price, Rates, Yields) with a new SecurityValidations helper. This refactoring improves code maintainability and input validation for these Excel-compatible financial formulas without changing their external behavior.

src/PhpSpreadsheet/Calculation/Financial/Securities · high confidence

Refactored number formatting into dedicated formatter classes

The monolithic number formatting logic has been split into specialized classes (DateFormatter, NumberFormatter, PercentageFormatter, FractionFormatter) that extend a new BaseFormatter. This refactoring introduces support for new formatting capabilities, including fraction masks with \# and 0 placeholders, fixed-value divisors for fractions, and explicit handling of user-supplied decimal and thousands separators. It also improves the robustness of date/time formatting (including fractional seconds and interval masks like \[hh\]:mm) and ensures consistent locale-aware output across all number types.

src/PhpSpreadsheet/Style/NumberFormat · high confidence

Refactored text calculation functions into dedicated classes with array support

The text calculation functions (such as CONCATENATE, TEXTJOIN, LEFT, RIGHT, MID, FIND, SEARCH, REPLACE, SUBSTITUTE, LEN, EXACT, LOWER, UPPER, PROPER, CHAR, CODE, CLEAN, TRIM, TEXT, VALUE, FIXED, DOLLAR, TEXTSPLIT, TEXTBEFORE, TEXTAFTER, and BAHTTEXT) have been reorganized into specific classes within the \src/PhpSpreadsheet/Calculation/TextData\ directory. This refactoring introduces native array argument support for these functions, allowing them to process arrays of values directly and return results with matching dimensions, rather than requiring manual flattening or handling of single values. A shared \Helpers\ class was also introduced to standardize argument extraction and validation across these text functions.

src/PhpSpreadsheet/Calculation/TextData · high confidence

Removal of legacy Calculation engine components

The Calculation engine has been restructured by removing several legacy classes and files, including \PHPExcel\_Calculation\_Exception\, \PHPExcel\_Calculation\_ExceptionHandler\, \PHPExcel\_Calculation\_FormulaParser\, \PHPExcel\_Calculation\_FormulaToken\, \PHPExcel\_Calculation\_Function\, and the monolithic \PHPExcel\_Calculation\_Functions\ class. This change eliminates the old formula parsing and tokenization logic, as well as the centralized function registry and compatibility settings, in favor of a new modular architecture.

Classes/PHPExcel/Calculation · high confidence

Reorganized sample application with new bootstrap and navigation

The samples directory has been restructured into a cohesive web application. A new Bootstrap.php file centralizes autoloader detection, while Header.php provides a unified navigation bar linking to documentation and GitHub. The index.php page now displays a requirement check for PHP 8.1 and necessary extensions. A new XlsReaderBenchmark.php script allows users to benchmark XLS reader performance, and a download.php helper enables downloading server-generated files via the web interface.

samples · high confidence

Revert Scrutinizer fix in Xlsx Reader listWorksheetInfo

The previous fix applied to the \listWorksheetInfo\ method in the Xlsx Reader has been reverted, restoring the original behavior for this specific reader function.

(repo-wide) · high confidence

Rich text components now implement the ITextElement interface

The RichText, Run, and TextElement classes in the RichText namespace now explicitly implement the ITextElement interface. This change standardizes the contract for rich text components, ensuring consistent method signatures for retrieving text, setting text, and accessing font information, which improves type safety and interoperability within the library's rich text handling.

src/PhpSpreadsheet/RichText · high confidence

Style classes migrated to PhpOffice namespace with expanded conditional formatting and theme support

The cell styling components in src/PhpSpreadsheet/Style (Alignment, Border, Borders, Color, Conditional, Fill, Font, NumberFormat, Protection, RgbTint) have been moved to the PhpOffice namespace and refactored to support modern spreadsheet features. Users can now apply conditional formatting rules such as IconSets, ColorScales, DataBars, and NOTCONTAINS operators, and styles can be driven by the current Office theme for dynamic appearance. The Color class now supports RGB tinting via RgbTint, and Font styling includes chart-specific color support and theme font application.

src/PhpSpreadsheet/Style · high confidence

Trend analysis classes now use native PHP 8+ type declarations

The \src/PhpSpreadsheet/Shared/Trend\ classes (including \BestFit\, \LinearBestFit\, \ExponentialBestFit\, \LogarithmicBestFit\, \PolynomialBestFit\, \PowerBestFit\, and \Trend\) have been refactored to use native PHP 8+ type declarations for properties and method parameters. This change enforces stricter type safety for regression calculations (linear, logarithmic, exponential, power, and polynomial) and improves compatibility with modern static analysis tools like PHPStan, though it requires a PHP version that supports these native types.

src/PhpSpreadsheet/Shared/Trend · high confidence

Trigonometric functions now support array arguments in array formulas

The trigonometric calculation classes (Sine, Cosine, Tangent, Secant, Cosecant, and Cotangent) have been refactored to include the ArrayEnabled trait. This allows functions such as SIN, COS, TAN, SEC, CSC, and their hyperbolic and inverse variants to accept arrays as arguments, enabling them to process multiple values at once when used in array formulas rather than requiring scalar inputs.

src/PhpSpreadsheet/Calculation/MathTrig/Trig · high confidence

Worksheet refactoring introduces dedicated iterator and dimension classes

The Worksheet component has been restructured to improve type safety and iteration control. New dedicated classes have been introduced: CellIterator, ColumnCellIterator, and ColumnIterator manage cell and column traversal with explicit support for iterating only existing cells and handling non-existent cells via null or creation. The Column and Row abstractions are now represented by the Column and Row classes, which expose the bounded worksheet and provide isEmpty() methods with configurable definitions of 'empty' (e.g., treating null or empty strings as empty). Dimension management is handled by new Dimension, ColumnDimension, and RowDimension classes, standardizing properties like visibility, outline level, and width/height. Additionally, AutoFilter logic has been extracted into its own AutoFilter class, and a new AutoFit class handles indent range calculations for autofilter headers. Drawing capabilities are split into BaseDrawing (shared logic), Drawing (file/URL-based), and MemoryDrawing (in-memory GD images), with improved handling of image transparency, opacity, and hyperlinking.

src/PhpSpreadsheet/Worksheet · high confidence

XLS reader refactored into modular helper classes

The monolithic XLS reader has been decomposed into a set of dedicated helper classes (Biff5, Biff8, Color, ConditionalFormatting, DataValidationHelper, ErrorCode, Escher, ListFunctions, LoadSpreadsheet, MD5, Mappings, etc.) to improve maintainability and performance. This structural change introduces specific capabilities such as reading conditional formatting and data validation rules, supporting BIFF5 and BIFF8 cell range address parsing, and providing optimized worksheet listing and dimension detection functions.

src/PhpSpreadsheet/Reader/Xls · high confidence

XLS writer style mapping refactored into dedicated helper classes

The XLS writer's handling of cell styles has been restructured by introducing three new helper classes—CellAlignment, CellBorder, and CellFill—within the \src/PhpSpreadsheet/Writer/Xls/Style\ directory. These classes centralize the mapping of internal style constants (such as horizontal/vertical alignment, border types, and fill patterns) to their corresponding BIFF8 binary codes, ensuring that alignment, borders, and fills are correctly translated when saving files in the legacy XLS format.

src/PhpSpreadsheet/Writer/Xls/Style · high confidence

XML style parsing refactored into dedicated reader classes

The XML Reader's style parsing logic has been extracted from the main reader into dedicated classes (Alignment, Border, Fill, Font, NumberFormat, and StyleBase). This change improves how XML spreadsheets are interpreted by adding support for specific style attributes such as text indentation, reading order (Left-to-Right/Right-to-Left), and more granular border styles, ensuring that cell formatting is preserved more accurately when opening XML files.

src/PhpSpreadsheet/Reader/Xml/Style · high confidence

Fixes

Corrected BIFF5 and BIFF8 color mappings in XLS reader

The XLS reader now uses dedicated color lookup classes (BIFF5, BIFF8, and BuiltIn) to map Excel's internal color indices to RGB values. This change fixes incorrect color mappings for BIFF5 and BIFF8 formats, ensuring that colors in older .xls files are rendered accurately instead of appearing with wrong hues or defaulting to black.

src/PhpSpreadsheet/Reader/Xls/Color · high confidence

Fix for writing OLE containers to variables

Resolves a bug where writing OLE containers (such as Excel files) to a variable or string failed because the temporary directory path was missing. The Root PPS class now correctly initializes the temporary directory, ensuring that in-memory file generation works as expected.

Classes/PHPExcel/Shared/OLE/PPS · high confidence

Test coverage

1 commit adding/updating tests in tests/data/Features/AutoFilter; Added tests for AutoFilter loading in Xlsx files; Extensive test suite expansion and refactoring; Removed legacy JAMA matrix unit tests.

Dependencies

Bootstrap sample updated to v3.4.1

The Bootstrap CSS assets in the samples/bootstrap directory have been updated to version 3.4.1, bringing the sample application's styling and components in line with the latest release of the Bootstrap framework.

samples/bootstrap · high confidence

Initial Composer dependency management and PHP 8.2 baseline

The project now uses Composer for dependency management, establishing a minimum PHP version of 8.2 and requiring specific extensions (ctype, dom, fileinfo, filter, gd, iconv, libxml, mbstring, simplexml, xml, xmlreader, xmlwriter, zip, zlib). Core runtime dependencies include composer/pcre, maennchen/zipstream-php, markbaker/complex, markbaker/matrix, and psr/simple-cache. Development tooling is configured with phpstan, phpunit, php-cs-fixer, and php codesniffer, while optional PDF and chart rendering libraries (dompdf, mpdf, tcpdf, jpgraph) are listed as suggestions. This change also removes the legacy .NET ClassDiagrams project file.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 41 → 68 (+27.4)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 79 → 77 (-1.8)
  • Architecture 96 → 100 (+4.0)
  • Maturity 58 → 56 (-1.6)
  • Readiness 30 → 78 (+48.3)
  • Security 30 → 77 (+46.5)

Resolved (110)

  • Coverage not measured — test suite did not build
  • Dimension evaluation failed
  • Duplicated block (10 lines × 2) (src/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php)
  • Duplicated block (10 lines × 2) (src/PhpSpreadsheet/Reader/Xlsx.php)
  • Duplicated block (10 lines × 2) (src/PhpSpreadsheet/Style/Style.php)
  • Duplicated block (10 lines × 2) (src/PhpSpreadsheet/Writer/Ods/Cell/Style.php)
  • Duplicated block (10 lines × 2) (src/PhpSpreadsheet/Writer/Xlsx/Chart.php)
  • Duplicated block (10 lines × 2) (src/PhpSpreadsheet/Writer/Xlsx/Drawing.php)
  • Duplicated block (10 lines × 6) (src/PhpSpreadsheet/Style/NumberFormat.php)
  • Duplicated block (11 lines × 2) (src/PhpSpreadsheet/Calculation/Calculation.php)
  • Duplicated block (11 lines × 2) (src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php)
  • Duplicated block (11 lines × 2) (src/PhpSpreadsheet/ReferenceHelper.php)
  • Duplicated block (11 lines × 2) (src/PhpSpreadsheet/Style/Style.php)
  • Duplicated block (11 lines × 2) (src/PhpSpreadsheet/Writer/Xlsx/Drawing.php)
  • Duplicated block (11 lines × 2) (src/PhpSpreadsheet/Writer/Xlsx/Theme.php)
  • Duplicated block (11 lines × 5) (src/PhpSpreadsheet/Reader/Xls.php)
  • Duplicated block (12 lines × 2) (src/PhpSpreadsheet/Reader/Xlsx.php)
  • Duplicated block (12 lines × 2) (src/PhpSpreadsheet/Reader/Xlsx/Chart.php)
  • Duplicated block (12 lines × 2) (src/PhpSpreadsheet/Writer/Xls.php)
  • Duplicated block (12 lines × 2) (src/PhpSpreadsheet/Writer/Xls/Escher.php)
  • …and 90 more

New (1121)

  • AdvancedValueBinder.bindValue (cognitive 23) (src/PhpSpreadsheet/Cell/AdvancedValueBinder.php)
  • AdvancedValueBinder.bindValue (cyclomatic 16) (src/PhpSpreadsheet/Cell/AdvancedValueBinder.php)
  • AgileEncryption.parse (cognitive 39) (src/PhpSpreadsheet/Shared/Xlsx/AgileEncryption.php)
  • AgileEncryption.parse (cyclomatic 40) (src/PhpSpreadsheet/Shared/Xlsx/AgileEncryption.php)
  • AgileEncryption.writeEcma376Container (cognitive 30) (src/PhpSpreadsheet/Shared/Xlsx/AgileEncryption.php)
  • AgileEncryption.writeEcma376Container (cyclomatic 22) (src/PhpSpreadsheet/Shared/Xlsx/AgileEncryption.php)
  • Alignment.applyFromArray (cognitive 18) (src/PhpSpreadsheet/Style/Alignment.php)
  • ArrayArgumentProcessor.evaluateVectorMatrixPair (cognitive 17) (src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php)
  • AutoFilter.filterTestInCustomDataSet (cognitive 31) (src/PhpSpreadsheet/Worksheet/AutoFilter.php)
  • AutoFilter.filterTestInCustomDataSet (cyclomatic 32) (src/PhpSpreadsheet/Worksheet/AutoFilter.php)
  • AutoFilter.showHideRows (cognitive 131) (src/PhpSpreadsheet/Worksheet/AutoFilter.php)
  • AutoFilter.showHideRows (cyclomatic 50) (src/PhpSpreadsheet/Worksheet/AutoFilter.php)
  • AutoFilter.writeAutoFilterColumnRule (cognitive 29) (src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php)
  • AutoFilter.writeAutoFilterColumnRule (cyclomatic 16) (src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php)
  • Averages.modeCalc (cognitive 18) (src/PhpSpreadsheet/Calculation/Statistical/Averages.php)
  • BaseDrawing.setWorksheet (cognitive 27) (src/PhpSpreadsheet/Worksheet/BaseDrawing.php)
  • BestFit.calculateGoodnessOfFit (cognitive 21) (src/PhpSpreadsheet/Shared/Trend/BestFit.php)
  • Biff8.readBIFF8CellRangeAddressB (cognitive 20) (src/PhpSpreadsheet/Reader/Xls/Biff8.php)
  • Borders.applyFromArray (cognitive 16) (src/PhpSpreadsheet/Style/Borders.php)
  • Calculation.calculateCellValue (cognitive 29) (src/PhpSpreadsheet/Calculation/Calculation.php)
  • …and 1101 more

Changes since last survey

  • 136 commits — 121 feature/other, 15 fixes

By area

  • (repo) — 44 commits
  • (root) — 29 commits
  • src/PhpSpreadsheet — 22 commits
  • tests/PhpSpreadsheetTests — 21 commits
  • docs/extra — 6 commits
  • tests/data — 4 commits
  • samples/Basic2 — 3 commits
  • docs/index.md — 2 commits
  • docs/topics — 2 commits
  • .github/PULL_REQUEST_TEMPLATE.md — 1 commit
  • docs/faq.md — 1 commit
  • samples/Wizards — 1 commit

Notable commits

  • fix: Fix Agile encryption CFB directory ordering
  • fix: Fix Agile encryption fixture stream size
  • fix: Fix CFB v3 OLE writer header and DIFAT boundaries
  • fix: Fix Problem with Multiple Images on Multiple Sheets
  • fix: Fix VALUE() treating product text as a date
  • fix: Fix VLOOKUP #N/A with whole-column ranges when end column has no data
  • fix: Fix encrypted XLSX reader review findings
  • fix: Fix quote-prefix numeric test to cover clearing behavior
  • fix: Merge branch 'master' into fix-betainv-underflow-false-convergence
  • fix: Merge pull request #4953 from gaoflow/fix-gamma-large-shape
  • fix: Merge pull request #4954 from gaoflow/fix-betainv-underflow-false-convergence
  • fix: Merge pull request #4962 from saifulferoz/fix/issue-4454-ods-strings
  • fix: Merge pull request #4967 from DIReports/fix/vlookup-column-range-empty-end-column
  • fix: Merge pull request #4983 from n3crosis/fix/ole-cfb-root-conformance
  • fix: Merge pull request #4997 from gechuanpan/fix-value-product-description-4996
  • change: 2.2.7 Reported Internal Error on Win11 - Upgrade to 2.2.8
  • change: A Bit Of Coverage
  • change: Add Agile XLSX file encryption support
  • change: Add Memory Drawing Sample
  • change: Add Some Blank Lines
  • …and 116 more

Architecture

  • Containers 0 added · 0 removed · contexts 1 added · 0 removed · edges 0 added · 0 removed

Added bounded contexts (1)

  • phpoffice/phpspreadsheet

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

PHPOffice/PhpSpreadsheet was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 26 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit be40c66829d91f7276c8f29339163f0808e33e1f — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-a15879f6f801.