Posted on: March 16, 2026 01:30 AM
Posted by: Renato
Categories: Laravel
Views: 23
Otimizando exportação com Fast-Excel
A biblioteca rap2hpoutre/fast-excel é uma das ferramentas mais populares e eficientes no ecossistema Laravel para manipulação de arquivos Excel (.xlsx) e CSV.
Ela foi criada como uma alternativa leve ao "Laravel Excel" (Maatwebsite), focando em velocidade e baixo consumo de memória, o que a torna ideal para o seu caso, onde você está exportando listas de pedidos que podem crescer significativamente.
Por que usar o Fast-Excel?
-
Performance: Ao contrário de outras bibliotecas que carregam todos os dados na memória antes de gerar o arquivo, o Fast-Excel utiliza "generators" (streams). Isso significa que ele consegue processar milhares de linhas sem estourar o limite de memória do PHP.
-
Simplicidade: A API é extremamente direta. Você não precisa criar classes de "Export" complexas para tarefas simples.
-
Flexibilidade: Aceita Collections, Models, QueryBuilders e até Arrays puros.
Como você está utilizando no seu Controller
No seu código, a implementação está no método getExportedExcelFile. Vamos analisar os pontos principais:
PHP
private function getExportedExcelFile(QueryBuilder $query): StreamedResponse
{
// ... lógica de permissões ...
// O FastExcel recebe o resultado da query e gera o download
return (new FastExcel($query->get()))->download('arquivo.xlsx', function ($item) {
// O "Closure" (função anônima) define o mapeamento das colunas
return [
'ID do pedido' => $item->client_orders_uuid,
// ...
];
});
}
Pontos de Melhoria no seu uso:
-
Uso de Memória com
PHP->get(): Atualmente você está fazendo$query->get(). Se houver 50 mil pedidos, o Laravel tentará carregar 50 mil instâncias de modelos na memória de uma vez. OFastExcelsuporta Generators. Para grandes volumes, você poderia usar ocursor():return (new FastExcel($query->cursor()))->download(...);Isso mantém o consumo de memória baixo e constante, não importa o tamanho da tabela.
-
Eager Loading: No seu
index(), você já está usando owith(['user', 'items...']). Isso é excelente para evitar o problema de "N+1" consultas durante a exportação das linhas no Excel.
Outras formas de utilizar a biblioteca
Além do que você já faz, aqui estão outras funcionalidades úteis:
1. Importação de Dados
Se você precisar que o usuário envie uma planilha para atualizar pedidos ou cadastrar produtos:
PHP
use Rap2hpoutre\FastExcel\FastExcel;
$users = (new FastExcel)->import('arquivo.xlsx', function ($line) {
return User::create([
'name' => $line['Nome'],
'email' => $line['E-mail']
]);
});
2. Exportação de múltiplas abas (Sheets)
Se quiser separar pedidos por status em abas diferentes no mesmo arquivo:
PHP
$sheets = new SheetCollection([
'Pagos' => Order::where('status', 'paid')->get(),
'Pendentes' => Order::where('status', 'pending')->get(),
]);
return (new FastExcel($sheets))->download('relatorio.xlsx');
3. Salvando no disco (Storage)
Em vez de baixar direto pelo navegador (download), você pode salvar no servidor para enviar por e-mail depois:
PHP
(new FastExcel($query->get()))->export(storage_path('app/public/pedidos.xlsx'));
Resumo de boas práticas para o seu Controller:
-
Tratamento de Datas: Você usou
$item->created_at->isoFormat(...). Isso é ótimo, pois garante que o Excel exiba a data legível, e não um objeto ou timestamp. -
Campos Calculados: Você chamou
$item->brazilianAmountByTypeUser(...). Certifique-se de que esses métodos no seu ModelOrdernão façam novas consultas ao banco de dados, senão a exportação ficará lenta. -
Colunas Complexas: Para o "Nome do produto", você usou
implode. Como um pedido pode ter vários itens, essa é a forma correta de condensar isso em uma única célula do Excel.
Donate to Site
Renato
Developer