Laravel Excel: como exportar os dados de uma tabela

Facebook
Twitter
LinkedIn

Nesse artigo irei mostrar o passo a passo de como exportar os dados de uma tabela do banco de dados para um arquivo em Excel utilizando a famosa biblioteca Laravel Excel.

Acessando o site da biblioteca na parte de instalação, ele já mostra o quais são os passos que você precisa seguir para realizá-la sem erro.

Instalação

O primeiro passo é fazer a instalação da biblioteca através do composer com o seguinte comando no terminal na raiz do nosso projeto:

composer require maatwebsite/excel

Configuração

Após a instalação da biblioteca, precisamos registrá-la dentro dos providers da nossa aplicação. Para isso, basta abrir o arquivo app.php localizado em config/app.php. e dentro do providers adicionar na ultima linha o seguinte trecho de código

Maatwebsite\Excel\ExcelServiceProvider::class,

Não esqueça de deixar a virgula no final da linha para evitar erros futuros.

Um pouco mais abaixo, precisamos registrar a Facades do Excel em nossos aliases, então assim como fizemos o registro do nosso providers, iremos também registrar na ultima linha dentro do nosso array de aliases. Atenção na virgula no final!

'Excel' => Maatwebsite\Excel\Facades\Excel::class,

Agora devemos executar um comando publish no artisan para ele “publicar” as nossas alterações feitas no config de nossa aplicação com o seguinte comando.

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

Caso não apareça nenhum erro no console você deve notar que dentro do diretório config foi criado um arquivo chamado excel.php. Isso significa que já podemos começar a utilizar todo o poder que essa biblioteca pode nos apresentar.

Banco de Dados

Para esse artigo, eu gerei 50 usuários na tabela users e nossa base de dados utilizando as factories seeds

UserFactory.php

$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'remember_token' => Str::random(10),
    ];
});

UserSeeder.php

    public function run()
    {
        factory(User::class, 50)->create();
    }

Controller

Pois bem, antes de criarmos as nossas rotas precisamos de um controlador para nossos usuários. Para esse exemplo irei criar sem o método resource, mas em sua aplicação pode ser necessário que você o utilize.

php artisan make:controller UserController

Meu arquivo de UserController esta assim, com apenas dois métodos:

use App\User;

class UserController extends Controller
{

    public function index()
    {
        $users = User::paginate(8);

        return view('user.index', [
            'users' => $users,
        ]);
    }

    public function export()
    {
        //
    }
}

Blade

Nossa view index ainda não foi criada, portanto precisamos criá-la para não dar erro na hora de carregar nossas rotas.

Dentro de nossas views, criei um uma pasta chamada users e dentro dela criei um arquivo chamado index.blade.php, que é onde iremos listar os nossos usuários. Dentro do nosso index eu coloquei a estrutura padrão do Bootstrap 4, puxando os arquivos de CSS e JavaScript do próprio CDN que eles disponibilizam no site.

Meu users/index.blade.php esta assim:

<form action="{{ route('user.export') }}" method="post" enctype="multipart/form-data">
@csrf
        <button type="submit" class="btn btn-success">Exportar</button>
</form>

<table class="table">
    <thead>
        <tr>
            <th scope="col">#</th>
            <th scope="col">Nome</th>
            <th scope="col">E-mail</th>
        </tr>
    </thead>
    <tbody>

        @foreach ($users as $user)
        <tr>
            <th scope="row">
                {{ $user->id }}
            </th>
            <th>
                {{ $user->name }}
            </th>
            <th>
                {{ $user->email }}
            </th>
        </tr>
        @endforeach

    </tbody>
</table>
{{ $users->links() }}

Como no controller estou chamando o método User::paginate(8), isso significa que ele irá pegar todos os registros da minha tabela users no banco de dados, porém irá mostrar apenas por página. Por isso que após o fechamento da tabela estou passando o $users->links(), para o Laravel entender que onde esta sendo chamado esse método ele irá criar um componente para paginação padrão do próprio Bootstrap.

Rotas

Em nosso arquivo de rotas fiz o cadastro de apenas das 2 rotas que que iremos trabalhar nesse artigo. A primeira contento a nossa listagem de usuários e a segunda apontando para o método de exportar os dados.

Route::get('users', 'UserController@index')->name('users.index');
Route::post('users/export', 'UserController@export')->name('users.export');

Ao carregar a nossa rota /users o retorno é de fato os nossos usuários vindo do banco de dados com a nossa paginação funcionando perfeitamente.

cats

Exportando os dados

Para começarmos a exportação dos nossos dados precisamos rodar o seguinte comando abaixo

php artisan make:export UsersExport --model=User

NOTA: em –model= você deve apontar o model que você esta trabalhando

Você vai notar que em app irá aparecer uma pasta denominada Exports e dentro dela irá conter um arquivo chamado UsersExport.php e dentro dela irá conter a classe de exportação dos usuários.

Por padrão, quando criamos uma classe com o make:export já vai vir com a função para exportar todos os dados do seu model indicado através do método all().

class UsersExport implements FromCollection
{
    public function collection()
    {
        return User::all();
    }
}

No método export em nosso UserController precisamos dar o use na nossa classe UsersExport que foi criada com o comando anterior e também na Facades do Excel

use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;

class UsersController extends Controller 
{
    public function export() 
    {
        return Excel::download(new UsersExport, 'users.xlsx');
    }
}

Agora sempre que utilizarmos a rota users.export ele estará apontando para o método de exportação que já esta funcionando corretamente.

Ahh, lembrando o seguinte! o nome ali no return ‘users.xlsx’ é o nome do arquivo que irá ser gerado.

=]

Mais para explorar

Comentários