Lightweight and very fast XLSX Excel Spreadsheet read/write library for Laravel in pure PHP (wrapper around FastExcelWriter and FastExcelReader)
Exporting data from your Laravel application has never been so fast! Importing models into your Laravel application has never been so easy!
This library is a wrapper around avadim/fast-excel-writer and avadim/fast-excel-reader, so it's also lightweight, fast, and requires a minimum of memory. Using this library, you can export arrays, collections and models to a XLSX-file from your Laravel application, and you can import data to Laravel application.
Features
Install via composer:
composer require avadim/fast-excel-laravel
And then you can use facade Excel
// Create workbook...
$excel = \Excel::create();
// export model...
$excel->sheet()->withHeadings()->exportModel(Users::class);
// and save XLSX-file to default storage
$excel->saveTo('path/file.xlsx');
// or save file to specified disk
$excel->store('disk', 'path/file.xlsx');
// Open saved workbook
$excel = \Excel::open(storage_path('path/file.xlsx'));
// import records to database
$excel->withHeadings()->importModel(User::class);
Jump To:
Easy and fast export of a model. This way you export only model data without headers and without any styling
// Create workbook with sheet named 'Users'
$excel = \Excel::create('Users');
// Export all users to Excel file
$sheet->exportModel(Users::class);
$excel->saveTo('path/file.xlsx');
The following code will write the field names and styles (font and borders) to the first row, and then export all the data of the User model
// Create workbook with sheet named 'Users'
$excel = \Excel::create('Users');
// Write users with field names in the first row
$sheet->withHeadings()
->applyFontStyleBold()
->applyBorder('thin')
->exportModel(Users::class);
$excel->saveTo('path/file.xlsx');
You can map the data that needs to be added as row
$sheet = $excel->getSheet();
$sheet->mapping(function($model) {
return [
'id' => $model->id, 'date' => $model->created_at, 'name' => $model->first_name . $model->last_name,
];
})->exportModel(User::class);
$excel->save($testFileName);
// Create workbook with sheet named 'Users'
$excel = \Excel::create('Users');
$sheet = $excel->getSheet();
// Get users as collection
$users = User::where('age', '>', 35)->get();
// Write attribute names
$sheet->writeRow(array_keys(User::getAttributes()));
// Write all selected records
$sheet->writeData($users);
$sheet = $excel->makeSheet('Records');
// Get collection of records using Query Builder
$records = \DB::table('users')->where('age', '>=', 21)->get(['id', 'name', 'birthday']);
$sheet->writeData($records);
$sheet = $excel->makeSheet('Collection');
// Make custom collection of arrays
$collection = collect([
[ 'id' => 1, 'site' => 'google.com' ],
[ 'id' => 2, 'site.com' => 'youtube.com' ],
]);
$sheet->writeData($collection);
$sheet = $excel->makeSheet('Array');
// Make array and write to sheet
$array = [
[ 'id' => 1, 'name' => 'Helen' ],
[ 'id' => 2, 'name' => 'Peter' ],
];
$sheet->writeData($array);
$sheet = $excel->makeSheet('Callback');
$sheet->writeData(function () {
foreach (User::cursor() as $user) {
yield $user;
}
});
See detailed documentation for avadim/fast-excel-writer here: https://github.com/aVadim483/fast-excel-writer/tree/master#readme
$excel = \Excel::create('Users');
$sheet = $excel->getSheet();
// Set column B to 12
$sheet->setColWidth('B', 12);
// Set options for column C
$sheet->setColOptions('C', ['width' => 12, 'text-align' => 'center']);
// Set column width to auto
$sheet->setColWidth('D', 'auto');
$title = 'This is demo of avadim/fast-excel-laravel';
// Begin area for direct access to cells
$area = $sheet->beginArea();
$area->setValue('A2:D2', $title)
->applyFontSize(14)
->applyFontStyleBold()
->applyTextCenter();
// Write headers to area, column letters are case independent
$area
->setValue('a4:a5', '#')
->setValue('b4:b5', 'Number')
->setValue('c4:d4', 'Movie Character')
->setValue('c5', 'Birthday')
->setValue('d5', 'Name')
;
// Apply styles to headers
$area->withRange('a4:d5')
->applyBgColor('#ccc')
->applyFontStyleBold()
->applyOuterBorder('thin')
->applyInnerBorder('thick')
->applyTextCenter();
// Write area to sheet
$sheet->writeAreas();
// You can set value formats for some fields
$sheet->setFieldFormats(['birthday' => '@date', 'number' => '@integer']);
// Write data to sheet
$sheet->writeData($data);
// Save XLSX-file
$excel->saveTo($testFileName);
To import models, you can use method importModel()
.
If the first row contains the names of the fields you can apply these using method withHeadings()
// Open XLSX-file
$excel = Excel::open($file);
// Import a workbook to User model using the first row as attribute names
$excel->withHeadings()->importModel(User::class);
// Done!!!
You can define the columns or cells from which you will import
// Import row to User model from columns range A:B - only 'name' and 'birthday'
$excel->withHeadings()->importModel(User::class, 'A:B');
// Import from cells range
$excel->withHeadings()->importModel(User::class, 'B4:D7');
// Define top left cell only
$excel->withHeadings()->importModel(User::class, 'B4');
In the last two examples, we also assume that the first row of imported data (row 4) is the names of the attributes.
However, you can set the correspondence between columns and field names yourself.
// Import row to User model from columns range B:E
$excel->mapping(function ($record) {
return [
'id' => $record['A'], 'name' => $record['B'], 'birthday' => $record['C'], 'random' => $record['D'],
];
})->importModel(User::class, 'B:D');
// Define top left cell only
$excel->mapping(['B' => 'name', 'C' => 'birthday', 'D' => 'random'])->importModel(User::class, 'B5');
// Define top left cell only (shorter way)
$excel->importModel(User::class, 'B5', ['B' => 'name', 'C' => 'birthday', 'D' => 'random']);
See detailed documentation for avadim/fast-excel-reader here: https://github.com/aVadim483/fast-excel-reader/tree/master#readme
$excel = Excel::open($file);
$sheet = $excel->getSheet('Articles');
$sheet->setReadArea('B5');
foreach ($sheet->nextRow() as $rowNum => $rowData) {
$user = User::create([
'name' => $rowData['B'],
'birthday' => new \Carbon($rowData['C']),
'password' => bcrypt($rowData['D']),
]);
Article::create([
'user_id' => $user->id,
'title' => $rowData['E'],
'date' => new \Carbon($rowData['F']),
'public' => $rowData['G'] === 'yes',
]);
}
You can see more features for export in the documentation for FastExcelWriter.
You can see more features for import in the documentation for FastExcelReader)
if you find this package useful you can support and donate to me for a cup of coffee:
Or just give me a star on GitHub :)