DEV Community

Cover image for Como exportar grandes conjuntos de dados para CSV no Laravel?
Saymon Tavares
Saymon Tavares

Posted on

Como exportar grandes conjuntos de dados para CSV no Laravel?

Exportar grandes conjuntos de dados no Laravel pode ser desafiador, pois você precisa estar atento aos limites de memória e tempo de processamento.

Exportar grandes conjuntos de dados no Laravel pode ser desafiador, pois você precisa estar atento aos limites de memória e tempo de processamento.

Você viu esta mensagem de erro ao exportar grandes conjuntos de dados no Laravel?
Allowed memory size of 134217728 bytes exhausted (tried to allocate 20971520 bytes)

Este foi um problema com o qual lutei por muito tempo usando o pacote Laravel Excel até encontrar spatie/simple-excel, o que torna isso muito fácil.

O exemplo abaixo exportará uma lista de usuários para um CSV de forma rápida e eficiente sem esgotar a memória. Usei esse método com mais de 200 mil registros gerando um arquivo CSV de mais de 30 MB em poucos minutos.

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Spatie\SimpleExcel\SimpleExcelWriter;

class UserExportController extends Controller
{
    public function export()
    {
        $writer = SimpleExcelWriter::streamDownload('users.csv');
        $query = User::orderBy('created_at');

        $i = 0;
        foreach ($query->lazy(1000) as $user) 
        {
            $writer->addRow($user->toArray());

            if ($i % 1000 === 0) {
                flush(); // Flush the buffer every 1000 rows
            }
            $i++;
        }

        return $writer->toBrowser();
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)