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 e 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 8 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.
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.
=]