mnurhad / spreedcore
Framework-agnostic fluent Excel/CSV/ODS export builder on top of PhpSpreadsheet, with first-class Laravel support.
Requires
- php: ^8.0
- phpoffice/phpspreadsheet: >=2.1.0 <2.4.1
Requires (Dev)
- illuminate/support: ^10.10 || ^11.0
- phpunit/phpunit: ^10.5
Suggests
- illuminate/support: Required to use the Laravel ServiceProvider & Facade integration.
- mpdf/mpdf: Required to use the PDF exporter (roadmap, not yet implemented).
README
Framework-agnostic fluent Excel, CSV, and ODS export builder for PHP applications.
SpreeCore Spreadsheet is a modern spreadsheet export library built on top of PhpSpreadsheet.
It provides a clean fluent API for generating professional spreadsheet reports without writing repetitive PhpSpreadsheet boilerplate.
Create reports with:
- Titles and subtitles
- Company logos
- Custom headers
- Nested/grouped headers
- Multiple worksheets
- Auto formatting
- Freeze panes
- Filters
- Number formats
- Images
- Custom PhpSpreadsheet styling
Works with:
- Laravel
- Symfony
- CodeIgniter
- Yii
- Lumen
- Plain PHP
- Any PHP framework
Why SpreeCore?
PhpSpreadsheet is powerful, but creating business reports usually requires many repetitive steps:
- Creating workbook
- Configuring worksheet
- Styling cells
- Managing merges
- Formatting columns
- Handling output responses
SpreeCore provides a fluent builder approach:
SpreeCore::make() ->headers([ 'No', 'Name', 'Email', 'Department' ]) ->rows($employees) ->download('employees.xlsx');
Simple, readable, and maintainable.
Features
Spreadsheet Export
✅ Excel export (.xlsx)
✅ CSV export (.csv)
✅ ODS export (.ods)
✅ Multiple worksheet support
✅ Raw binary output support
Report Builder
✅ Title ✅ Subtitle ✅ Description ✅ Logo support ✅ Header grouping ✅ Automatic merge cells ✅ Custom styling ✅ Column sizing
Formatting
✅ Header styling ✅ Font customization ✅ Row height ✅ Text wrapping ✅ Alignment ✅ Border support ✅ Number formats
Supported formats:
- Currency
- Date
- DateTime
- Percentage
- Number
Worksheet Features
✅ Freeze panes ✅ Auto filter ✅ Multiple sheets ✅ Custom merge ✅ Cell images ✅ PhpSpreadsheet escape hatch
Requirements
- PHP >= 8.0
- ext-gd (only required when embedding images/logos)
Installation
Install via Composer:
composer require mnurhad/spreedcore
Quick Example
use SpreeCore\Spreadsheet\SpreeCore; SpreeCore::make() ->setTitle('Employee Report') ->setSubtitle('January 2026') ->headers([ 'No', 'Name', 'Email', 'Department' ]) ->rows($employees) ->download('employees.xlsx');
Laravel Support
SpreeCore provides first-class Laravel integration.
Features:
- Service Provider
- Facade
- Auto discovery
- Publishable configuration
No manual registration required.
Example:
use SpreeCore\Spreadsheet\Facades\SpreeCore; SpreeCore::make() ->headers([ 'No', 'Name', 'Email' ]) ->rows(Employee::all()) ->download('employees.xlsx');
Publish configuration:
php artisan vendor:publish --tag=spree-spreadsheet-config
Plain PHP / Other Frameworks
No framework dependency required.
Example:
use SpreeCore\Spreadsheet\SpreeCore; $content = SpreeCore::make() ->headers([ 'No', 'Name', 'Email' ]) ->rows($data) ->raw();
The generated binary output can be returned using any framework response handler.
Headers
Simple header:
->headers([ 'No', 'Name', 'Email' ])
Grouped header:
->headers([ 'No', 'Name', 'Contact' => [ 'Email', 'Phone' ], ])
Nested headers are automatically merged and formatted.
Rows
Supports:
- Array
- Generator
- Iterator
- Laravel Collection
- LazyCollection
- Cursor
Example:
->rows($employees)
Generator example:
->rows(function () { yield [ 1, 'John Doe' ]; yield [ 2, 'Jane Doe' ]; })
Title, Subtitle, Description
->setTitle('Employee Report') ->setSubtitle('January 2026') ->setDescription('Generated automatically')
The title area is automatically merged, centered, and formatted.
Logo
->withLogo( public_path('logo.png') ) ->logoWidth(120) ->logoHeight(80) ->logoPosition('left')
Supported sources:
->withLogo('/local/path/logo.png') ->withLogo('https://example.com/logo.png') ->withLogo('storage:s3::branding/logo.png')
Header Styling
->withColorHeader('#0F4C81') ->headerFontSize(12) ->headerFontColor('#FFFFFF') ->headerBold()
Body Styling
->rowHeight(20) ->font('Calibri') ->fontSize(11) ->alternateColor('#F5F5F5') ->wrapText() ->alignCenter()
Freeze Pane
->freeze('A2') ->freezeHeader() ->freezeColumn('B') ->freezeRow(3)
Filter and Column
->filter() ->autoWidth() ->columnWidth([ 'A' => 30, 'B' => 20 ])
Multiple Sheets
SpreeCore::make() ->headers([ 'Name' ]) ->rows($employees) ->addSheet('Departments', function ($sheet) { $sheet ->headers([ 'Department' ]); }) ->download('report.xlsx');
Output Methods
->download('report.xlsx');
HTTP download response.
->stream('report.xlsx');
Inline response.
->store($path);
Save file.
->raw();
Return binary content.
Architecture
SpreeCore is designed with a layered architecture:
SpreeCore
├── Builder
│ └── Fluent API
├── Pipeline
│ └── Export stages
├── Exporter
│ └── XLSX / CSV / ODS
├── Output Handler
│ └── Download / Stream / Store
└── Laravel Adapter
└── ServiceProvider
└── Facade
The core package remains framework independent.
Testing
Install dependencies:
composer install
Run tests:
vendor/bin/phpunit
Roadmap
Future improvements:
- Import Excel
- Queue export
- Large dataset streaming
- Progress tracking
- Password protection
- Watermark
- Barcode / QR Code
- Pivot table
- Charts
- Conditional formatting
- Formula support
- Template export
- Multi-language support
Contributing
Contributions are welcome.
Please:
- Create a feature branch
- Add PHPUnit tests
- Submit a pull request
License
MIT License