yectep/phpspreadsheet-bundle
A Symfony bundle that integrates PhpSpreadsheet into your app, providing service-container access for reading, writing, and exporting Excel/CSV spreadsheets with minimal setup and PhpSpreadsheet’s full API.
Architecture fit
The package is a Symfony bundle, not a Laravel package. That distinction is the single most important finding: its value is Symfony-specific plumbing — a Bundle subclass, a DI extension, a configuration tree, and pre-wired service definitions for PhpSpreadsheet readers/writers. Laravel's container does not autoload Symfony bundles, does not read ExtensionInterface config trees, and does not use service tags the same way. In a Laravel codebase the bundle contributes essentially nothing that composer require phpoffice/phpspreadsheet plus a small service provider wouldn't. The real dependency of value here is upstream phpoffice/phpspreadsheet, which is mature, widely adopted, and actively maintained. Adopt the library; treat the bundle as optional sugar for Symfony-hosted services only.
Integration feasibility Low effort either way. Direct library adoption is a one-line Composer change plus a thin wrapper class; there is no migration, no schema, no external service. The bundle adds a few minutes of config but also adds a layer between our code and the library's own configuration surface (cell caching, reader options, temp-file handling), which we would likely need to reach around for non-trivial workloads.
Technical risk
Moderate-to-high on the wrapper specifically, low on the underlying library. Signals: 56 stars, zero dependents, effectively a single-maintainer project, and a composite score of ~18/100. Zero dependents is the sharpest signal — no downstream project is exercising this against real Symfony upgrades, so breakage would surface in our environment first. The 2026-08-01 last-release date is a metadata anomaly worth verifying before we treat cadence as healthy; a future-dated release usually means a CI timezone quirk, a mistagged build, or scraped data we shouldn't trust. MIT license is clean and poses no legal review burden. Bus-factor risk is the headline: if the maintainer stops, we own a fork of a file that mostly registers services — recoverable, but avoidable.
Key questions
phpoffice/phpspreadsheet major is pinned, and does the constraint allow us to take upstream security patches without a fork?Stack fit
If the target is Laravel: do not adopt the bundle. Use phpoffice/phpspreadsheet directly and register a singleton through a Laravel service provider, exposing our own SpreadsheetService interface. If we have a Symfony component (internal admin tool, legacy back office) that needs Excel I/O, the bundle is a reasonable convenience there — but it should not be the reason we introduce Symfony conventions into a Laravel codebase.
Migration path
Greenfield: no existing usage to unwind, so the choice is purely forward-looking. The durable decision is the abstraction boundary, not the package. Define SpreadsheetReader / SpreadsheetWriter contracts in our domain layer and let the concrete implementation be either the library or the bundle. That keeps a later swap to a different engine (e.g., a streaming writer for large exports) to a single binding change.
Compatibility
Verify the constraint matrix explicitly before committing: PHP 8.2/8.3, framework major we actually run, and phpoffice/phpspreadsheet 1.x vs 2.x vs 3.x+. PhpSpreadsheet has shipped breaking changes across majors (deprecated APIs, dropped PHP versions), and a thin wrapper is exactly the kind of package that lags a major behind. Confirm the bundle's test matrix runs against the framework version we deploy — not just the one it was written on.
Sequencing
Maintenance
The wrapper is thin, so its own maintenance load is small — but that is misleading. The real maintenance is upstream PhpSpreadsheet, which is large and version-active. The risk is drift: our wrapper lags upstream, so we end up either pinned to an old library (missing security and format fixes) or forking. Budget for the possibility of vendoring/forking the bundle as a known cost, not a surprise.
Support Community-only. No vendor SLA, no security disclosure process we can point to, no commercial backing. For a package whose failure mode is "imports stop working," that's acceptable for internal tooling and questionable for anything customer-facing or revenue-adjacent. Escalation path is: open an issue, then patch our fork.
Scaling
The bundle does not help scaling, and it may hinder it by hiding the knobs that matter. PhpSpreadsheet loads whole workbooks into memory by default; large XLSX imports will hit memory_limit and worker timeouts well before CPU. Scaling plan: run imports/exports as queued jobs with explicit memory_limit and timeout, use chunked/read-only readers and a PSR cache adapter for cell caching, cap upload size at the edge, and prefer streaming writers for large exports. None of that is solved by the bundle; all of it must be designed regardless.
Failure modes
composer update.Ramp-up
Low for anyone who knows the framework's DI; the bundle is a handful of service definitions. The actual learning curve is PhpSpreadsheet's API and its memory characteristics — a few days for a mid-level engineer to be productive, longer to be safe with large files. Ramp-up cost is therefore roughly identical whether or not we take the bundle, which further weakens the case for the extra dependency. Net: proceed with the library, decline the bundle unless a Symfony host appears.
How can I help you explore Laravel packages today?