megaads-vn / fast-excel
Fast Excel import/export for Laravel
Requires
- php: ^7.0
- box/spout: ^2.7
- illuminate/support: 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0 || ^8.0
Requires (Dev)
- illuminate/database: 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0 || ^8.0
- phpunit/phpunit: ^6.4
This package is not auto-updated.
Last update: 2024-12-14 02:50:37 UTC
README
Fast Excel import/export for Laravel, thanks to Spout. See benchmarks below.
Quick start
Install via composer:
composer require megaads-vn/fast-excel
Export a Model to .xlsx
file:
use Rap2hpoutre\FastExcel\FastExcel; use App\User; // Load users $users = User::all(); // Export all users (new FastExcel($users))->export('file.xlsx');
Export
Export a Model or a Collection:
$list = collect([ [ 'id' => 1, 'name' => 'Jane' ], [ 'id' => 2, 'name' => 'John' ], ]); (new FastExcel($list))->export('file.xlsx');
Export xlsx
, ods
and csv
:
$invoices = App\Invoice::orderBy('created_at', 'DESC')->get(); (new FastExcel($invoices))->export('invoices.csv');
Export only some attributes specifying columns names:
(new FastExcel(User::all()))->export('users.csv', function ($user) { return [ 'Email' => $user->email, 'First Name' => $user->firstname, 'Last Name' => strtoupper($user->lastname), ]; });
Download (from a controller method):
return (new FastExcel(User::all()))->download('file.xlsx');
Import
import
returns a Collection:
$collection = (new FastExcel)->import('file.xlsx');
Import a csv
with specific delimiter, enclosure characters and "gbk" encoding:
$collection = (new FastExcel)->configureCsv(';', '#', '\n', 'gbk')->import('file.csv');
Import and insert to database:
$users = (new FastExcel)->import('file.xlsx', function ($line) { return User::create([ 'name' => $line['Name'], 'email' => $line['Email'] ]); });
Facades
You may use FastExcel with the optional Facade. Add the following line to config/app.php
under the aliases
key.
'FastExcel' => Rap2hpoutre\FastExcel\Facades\FastExcel::class,
Using the Facade, you will not have access to the constructor. You may set your export data using the data
method.
$list = collect([ [ 'id' => 1, 'name' => 'Jane' ], [ 'id' => 2, 'name' => 'John' ], ]); FastExcel::data($list)->export('file.xlsx');
Global helper
FastExcel provides a convenient global helper to quickly instantiate the FastExcel class anywhere in a Laravel application.
$collection = fastexcel()->import('file.xlsx'); fastexcel($collection)->export('file.xlsx');
Advanced usage
Export multiple sheets
Export multiple sheets by creating a SheetCollection
:
$sheets = new SheetCollection([ User::all(), Project::all() ]); (new FastExcel($sheets))->export('file.xlsx');
Use index to specify sheet name:
$sheets = new SheetCollection([ 'Users' => User::all(), 'Second sheet' => Project::all() ]);
Import multiple sheets
Import multiple sheets by using importSheets
:
$sheets = (new FastExcel)->importSheets('file.xlsx');
You can also import a specific sheet by its number:
$users = (new FastExcel)->sheet(3)->import('file.xlsx');
Export large collections with chunk
Export rows one by one to avoid memory_limit
issues using yield
:
function usersGenerator() { foreach (User::cursor() as $user) { yield $user; } } // Export consumes only a few MB, even with 10M+ rows. (new FastExcel(usersGenerator()))->export('test.xlsx');
Add header and rows style
Add header and rows style with headerStyle
and rowsStyle
methods.
$header_style = (new StyleBuilder())->setFontBold()->build(); $rows_style = (new StyleBuilder()) ->setFontSize(15) ->setShouldWrapText() ->setBackgroundColor("EDEDED") ->build(); return (new FastExcel($list)) ->headerStyle($header_style) ->rowsStyle($style) ->download('file.xlsx');
Why?
FastExcel is intended at being Laravel-flavoured Spout: a simple, but elegant wrapper around Spout with the goal of simplifying imports and exports.
It could be considered as a faster (and memory friendly) alternative to Laravel Excel, with less features. Use it only for simple tasks.
Benchmarks
Tested on a MacBook Pro 2015 2,7 GHz Intel Core i5 16 Go 1867 MHz DDR3. Testing a XLSX export for 10000 lines, 20 columns with random data, 10 iterations, 2018-04-05. Don't trust benchmarks.
Still, remember that Laravel Excel has many more features. Please help me improve benchmarks, more tests are coming. Feel free to criticize.