Maatwebsite Excel in Laravel Project

January 07, 2022 Kehinde Olawuwo 3 minutes

Introduction

During my course of working on a project, I implemented bulk import using excel, and I would like to share how to integrate this in your Laravel project. There are couples of packages out there which provides this functionality, but I will be using Laravel Excel (formally Maatwebsite Excel) for this writeup.

This is a walk-through on how to integrate Maatwebsite Excel in Laravel application, please refer to documentation if you have any concern.

Requirement and Set Up.

Package requirement

  • PHP version ^7.0
  • Laravel version ^5.5
  • PhpSpreadsheet version ^1.6.

Download the package in your project by running the code below.

$ composer require maatwebsite/excel

However, Maatwebsite\Excel\ExcelServiceProvider is auto-discovered by default, but you can do it yourself by Adding to the ServiceProvider in config/app.php

.....
'providers' => [
/*
 * Package Service Providers…
 */
  Maatwebsite\Excel\ExcelServiceProvider::class
]

The Excel facade is also auto-discovered, but you can add it yourself by adding the code below to the facade in config/app.php.

.....
'aliases' => [
.....
    'Excel' => Maatwebsite\Excel\Facades\Excel::class
]

Lastly, to publish the config, run the vendor publish command:

$ php artisan vendor:publish - provider="Maatwebsite\Excel\ExcelServiceProvider"

This will create a new config file in the config/excel.php where you can make a lot of changes and configurations.

Excel Import

There’s a lot you can do here. Please check the documentation for the available functions. I will be using import to collection here.

i). Import to Collection.

Create an import class in app/Imports by either running this command below

$ php artisan make:import MovieImport

or manually by creating Imports directory in app, then ClassNameImport.php (i.e Imports\MovieImport.php) in Imports directory.

<?php
namespace App\Imports;

use App\Movies;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class MoviesImport implements ToCollection, WithHeadingRow
{
    /**
     * @param array $row
     *
     * @return Movies|null
     */
    public function collection(Collection $rows)
    {
        $errorMsg = "";
        DB::beginTransaction();

        $i = 1;
        foreach ($rows as $row) {
            if ($row['title'] != null) {
                $data['title'] = $row['title'];
            } else {
                $errMsg = "Title is empty on SN $i";
                break;
            }
            //You can validate other values using same steps.
            $data['synopsis'] = $row['synopsis'];
            $data['release_date'] = $row['release_date'];
            if (!Movies::create($data)) {
                $errMsg = "Error while creating movies";
                break;
            }
            $i++;
        }
        if (!empty($errorMsg)) {
            DB::rollBack(); // Rollback in case there is error

            return redirect()->back()->with('error', $errorMsg);
        } else {
            DB::commit(); // Commit to database

            return redirect()->back()->with('success', 'Uploaded Successfully');
        }
    }
}

ii). Now create a method in the controller for the import.

public function bulkMovieUpload(Request $request)
{
    if ($request->hasFile('excel_file')) {
        $data = $request->file('excel_file');
        $data->move(('path'), $data->getClientOriginalName());
        
        //You can choose to validate file type. e.g csv,xls,xlsx.
        $file_url = ('path') . $data->getClientOriginalName();
        
        Excel::import(new MovieImport, $file_url);
        return back()->with('success', 'Uploaded Successfully!');
    } else {
        return back()->with('error', "File is required");
    }
}

Call through the route (View)

Route::post('movies/bulkupload', [
    'as' => 'movies-bulkupload',
    'uses' =>'MovieController@bulkMovieUpload'
]);

This will handle the Excel import. I will write a second article on Maatwebsite Excel Export ASAP.

If you have any error or issue, please reach out on Twitter.

If you find this useful, kindly share and repost. Thank you 😊!

NOTE: Previously posted on Medium