PauloRB.dev

Desenvolvedor de Software

Tutorial: Exportando Imagens Base64 Usando Laravel Excel | PauloRB.dev Tutorial: Exportando Imagens Base64 Usando Laravel Excel – PauloRB.dev
Tutorial: Exportando Imagens Base64 Usando Laravel Excel

Tutorial: Exportando Imagens Base64 Usando Laravel Excel

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

 

Mais Posts

Script para automatizar as instalações de extensões do php em distribuições LINUX

Script para automatizar as instalações de extensões do php em distribuições LINUX

Publiquei neste artigo https://paulorb.dev/alternar-entre-multiplas-versoes-no-php/ formas de como instalar diversas versões do PHP em distros Linux mas surgiu um problema que... Leia mais

Controlando um Semáforo e Servo Motor com Arduino: Um Projeto Prático para Iniciantes

Controlando um Semáforo e Servo Motor com Arduino: Um Projeto Prático para Iniciantes

A robótica e a eletrônica são áreas fascinantes que combinam criatividade e lógica para construir soluções incríveis. Hoje, vamos explorar... Leia mais

Instalando e Gerenciando o SQLite no Linux

Instalando e Gerenciando o SQLite no Linux

Introdução ao SQLite O SQLite é um sistema de banco de dados leve, sem servidor e autocontido, amplamente utilizado em... Leia mais

Construir array de texto a partir de um array.

Construir array de texto a partir de um array.

No dia de hoje(17/08/2022) me deparei com o seguinte problema onde recebiamos um array javascript contendo textos e cujas chaves... Leia mais