Como gerar Excel com Laravel 10


Neste tutorial, será apresentado como gerar Excel com Laravel 10.

Primeiramente, será demonstrado como realizar pesquisas no banco de dados com Laravel.

Em seguida, será explicado como converter caracteres especiais para gerar Excel.

Por fim, será mostrado como gerar Excel com Laravel e forçar o download do arquivo.

Download do código fonte desenvolvido na aula: Download

Curso de Laravel: Mais Detalhes do Curso

Playlist completa sobre Laravel: Acessar

Receber as aulas gratuitas do curso de Laravel: Acessar


Para começar, é utilizado como base o projeto da aula "Como incluir Select2 no formulário no Laravel 10 com Vite".

Criada a rota para gerar Excel no arquivo "routes/web.php".

Route::get('/gerar-csv-conta', [ContaController::class, 'gerarCsv'])->name('conta.gerar-csv');

Na controller "app/Http/Controllers/ContaController.php", foi criado o método "gerarCsv". No mesmo, os registros da tabela "contas" são recuperados do banco de dados, o conteúdo a ser salvo no arquivo é criado, o arquivo é gerado e o download do Excel é realizado com o Laravel.

// Gerar CSV
public function gerarCsv(Request $request)
{

    // Recuperar e pesquisar os registros do banco dados
    $contas = Conta::when($request->has('nome'), function ($whenQuery) use ($request) {
        $whenQuery->where('nome', 'like', '%' . $request->nome . '%');
    })
        ->when($request->filled('data_inicio'), function ($whenQuery) use ($request) {
            $whenQuery->where('vencimento', '>=', \Carbon\Carbon::parse($request->data_inicio)->format('Y-m-d'));
        })
        ->when($request->filled('data_fim'), function ($whenQuery) use ($request) {
            $whenQuery->where('vencimento', '<=', \Carbon\Carbon::parse($request->data_fim)->format('Y-m-d'));
        })
        ->with('situacaoConta')
        ->orderBy('vencimento')
        ->get();

    // Calcular a soma total dos valores
    $totalValor = $contas->sum('valor');

    // Criar o arquivo temporário
    $csvNomeArquivo = tempnam(sys_get_temp_dir(), 'csv_' . Str::ulid());

    // Abrir o arquivo na forma de escrita
    $arquivoAberto = fopen($csvNomeArquivo, 'w');

    // Criar o cabeçalho do Excel - Usar a função mb_convert_encoding para converter carateres especiais
    $cabecalho = ['id', 'Nome', 'Vencimento', mb_convert_encoding('Situação', 'ISO-8859-1', 'UTF-8'), 'Valor'];

    // Escrever o cabeçalho no arquivo
    fputcsv($arquivoAberto, $cabecalho, ';');

    // Ler os registros recuperados do banco de dados
    foreach($contas as $conta){

        // Criar o array com os dados da linha do Excel
        $contaArray = [
            'id' => $conta->id,
            'nome' => mb_convert_encoding($conta->nome, 'ISO-8859-1', 'UTF-8'),
            'vencimento' => $conta->vencimento,
            'situacao' => mb_convert_encoding($conta->situacaoConta->nome, 'ISO-8859-1', 'UTF-8'),
            'valor' => number_format($conta->valor, 2, ',', '.'),
        ];

        // Escrever o conteúdo no arquivo
        fputcsv($arquivoAberto, $contaArray, ';');
    }

    // Criar o rodapé do Excel
    $rodape = ['', '', '', '', number_format($totalValor, 2, ',', '.')];

    // Escrever o conteúdo no arquivo
    fputcsv($arquivoAberto, $rodape, ';');

    // Fechar o arquivo após a escrita
    fclose($arquivoAberto);

    // Realizar o download do arquivo
    return response()->download($csvNomeArquivo, 'relatorio_contas_celke_' . Str::ulid() . '.csv');
}

Para finalizar, é criado o botão gerar Excel na view "resources/views/contas/index.blade.php".

<a href="{{ url('gerar-csv-conta?' . request()->getQueryString()) }}" class="btn btn-success btn-sm">Gerar Excel</a>

Baixar o código-fonte completo do projeto.

Bom, era isso. Espero que o tutorial tenha sido útil!