Tutorial: Exportando Imagens Base64 Usando Laravel Excel
Por Paulo RB em 23/10/2024
Neste tutorial, vamos aprender como exportar uma lista de cadastros de clientes para uma planilha Excel, incluindo as fotos dos clientes que estão armazenadas como strings base64. Usaremos o pacote Laravel Excel para realizar essa exportação, integrando dados e imagens de forma eficaz.
1. Instalação do Laravel Excel
Primeiro, certifique-se de que o pacote Laravel Excel está instalado no seu projeto. Se ainda não o instalou, você pode fazer isso com o seguinte comando:
composer require maatwebsite/excel
Mais informações sobre a instalação do Laravel excel consulte : https://docs.laravel-excel.com/3.1/getting-started/installation.html
2. Criando a Exportação de Clientes
Agora, vamos criar a classe de exportação. Esta classe será responsável por organizar os dados da lista de clientes e adicionar as imagens correspondentes de cada cliente.
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithDrawings;
use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
class ClientesExport implements FromArray, WithHeadings, WithDrawings
{
protected $clientes;
protected $drawings = [];
public function __construct($clientes)
{
$this->clientes = $clientes;
}
// Função para montar os dados em array
public function array(): array
{
$data = [];
foreach ($this->clientes as $cliente) {
$data[] = [
'id' => $cliente->id,
'nome' => $cliente->nome,
'email' => $cliente->email,
'foto' => '' // A imagem será adicionada via `drawings()`
];
}
return $data;
}
// Função para definir os cabeçalhos das colunas
public function headings(): array
{
return ['ID', 'Nome', 'Email', 'Foto'];
}
// Função que adiciona as imagens na planilha
public function drawings()
{
$drawings = [];
$rowIndex = 2; // As imagens começam na linha 2, após o cabeçalho.
foreach ($this->clientes as $cliente) {
if (!empty($cliente->foto_base64)) {
// Chama o método para criar o desenho da imagem
$drawing = $this->createMemoryDrawing($cliente->foto_base64, 'D' . $rowIndex);
$drawings[] = $drawing;
}
$rowIndex++;
}
return $drawings;
}
// Função para criar a imagem a partir da string base64 e ajustá-la proporcionalmente
private function createMemoryDrawing($base64Image, $coordinates)
{
// Cria o recurso de imagem a partir da string base64
$imageResource = $this->createImageFromBase64($base64Image);
// Obtém as dimensões originais da imagem
$originalWidth = imagesx($imageResource);
$originalHeight = imagesy($imageResource);
// Define a nova largura (80px) e calcula a altura proporcional
$newWidth = 80;
$newHeight = ($originalHeight / $originalWidth) * $newWidth;
// Cria a imagem na planilha com as novas dimensões
$drawing = new MemoryDrawing();
$drawing->setImageResource($imageResource);
$drawing->setRenderingFunction(MemoryDrawing::RENDERING_PNG);
$drawing->setMimeType(MemoryDrawing::MIMETYPE_PNG);
$drawing->setCoordinates($coordinates);
$drawing->setWidth($newWidth); // Define a largura como 80px
$drawing->setHeight($newHeight); // Define a altura proporcional
return $drawing;
}
// Função para converter a string base64 em um recurso de imagem
private function createImageFromBase64($base64Image)
{
// Remove a parte 'base64,' se estiver presente
if (strpos($base64Image, 'base64,') !== false) {
$imageParts = explode('base64,', $base64Image);
$base64Image = $imageParts[1];
}
// Decodifica a imagem
$imageData = base64_decode($base64Image);
$imageResource = imagecreatefromstring($imageData);
if (!$imageResource) {
throw new \Exception('A imagem base64 não pôde ser convertida em um recurso de imagem.');
}
return $imageResource;
}
}
2.1. Criando a Classe ClientesExport
No terminal, execute o comando:
php artisan make:export ClientesExport --model=Cliente
Depois, edite o arquivo gerado em app/Exports/ClientesExport.php
para incluir as funcionalidades de imagens.
3. Controlador para Exportação
Agora, vamos criar o controlador para lidar com a exportação de clientes. No terminal, crie o controlador:
php artisan make:controller ClienteController
No controlador ClienteController.php
, adicione a função para exportar a lista de clientes com imagens:
<?php
namespace App\Http\Controllers;
use App\Exports\ClientesExport;
use App\Models\Cliente;
use Maatwebsite\Excel\Facades\Excel;
class ClienteController extends Controller
{
public function exportarClientes()
{
$clientes = Cliente::all(); // Pega todos os clientes do banco
return Excel::download(new ClientesExport($clientes), 'clientes.xlsx');
}
}
4. Criando as Rotas
No arquivo routes/web.php
, adicione uma rota para acessar a funcionalidade de exportação:
use App\Http\Controllers\ClienteController;
Route::get('exportar-clientes', [ClienteController::class, 'exportarClientes']);
5. Testando a Exportação
Agora que tudo está configurado, você pode testar a exportação. Basta acessar a rota http://localhost:8000/exportar-clientes
no seu navegador, e a planilha Excel será gerada para download, contendo as fotos dos clientes.
6. Considerações Finais
- As imagens são processadas utilizando a classe
MemoryDrawing
, que converte as imagens base64 para o formato PNG.
- As coordenadas das imagens são definidas de acordo com a linha correspondente dos dados do cliente.
- O campo
foto_base64
na tabela de clientes deve armazenar a imagem codificada em base64. Você pode usar bibliotecas JavaScript para capturar e converter a imagem diretamente no front-end.
Fontes:
Laravel Excel Documentation
.Laravel Export with Images
.PhpSpreadsheet Drawings