Como importar e exportar arquivos csv ou .xlsx para o banco de dados no laravel

Para importar e exportar arquivos CSV ou Excel (XLSX) para o banco de dados no Laravel, você pode usar o pacote Laravel Excel que fornece uma API poderosa para lidar com arquivos Excel e CSV.


1. Instalação do Laravel Excel

Primeiro, instale o pacote utilizando o Composer:

composer require maatwebsite/excel

Após a instalação, registre o ServiceProvider no Laravel (se você estiver usando uma versão antiga do Laravel, pois, a partir do Laravel 5.5, o pacote é registrado automaticamente):

// config/app.php
'providers' => [
    ...
    Maatwebsite\Excel\ExcelServiceProvider::class,
],

Opcionalmente, adicione a facade ao seu arquivo config/app.php:

'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
],

Publique o arquivo de configuração:

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

2. Configuração do Banco de Dados

Certifique-se de que o banco de dados esteja configurado corretamente no arquivo .env e que você tenha a tabela onde os dados serão importados.


3. Criando a Tabela

Se você ainda não tem uma tabela para armazenar os dados importados, crie uma migration:

php artisan make:migration create_users_table --create=users

No arquivo da migration (database/migrations/<timestamp>_create_users_table.php), adicione os campos que você deseja importar/exportar:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->string('phone')->nullable();
        $table->timestamps();
    });
}

Execute a migration:

php artisan migrate

4. Importando Arquivos (CSV ou Excel)

Criar uma Classe de Importação

Crie uma classe para gerenciar a lógica de importação:

php artisan make:import UsersImport --model=User

Edite o arquivo app/Imports/UsersImport.php:

<?php

namespace App\Imports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\ToModel;

class UsersImport implements ToModel
{
    /**
     * Cada linha do arquivo será convertida em uma instância de User.
     */
    public function model(array $row)
    {
        return new User([
            'name' => $row[0], // Nome na primeira coluna do arquivo
            'email' => $row[1], // Email na segunda coluna do arquivo
            'phone' => $row[2] ?? null, // Telefone na terceira coluna (opcional)
        ]);
    }
}

Criar um Controlador para Importação

Crie um controlador para importar os arquivos:

php artisan make:controller ImportController

Edite o arquivo app/Http/Controllers/ImportController.php:

<?php

namespace App\Http\Controllers;

use App\Imports\UsersImport;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;

class ImportController extends Controller
{
    public function showImportForm()
    {
        return view('import');
    }

    public function import(Request $request)
    {
        $request->validate([
            'file' => 'required|mimes:csv,xlsx|max:2048',
        ]);

        Excel::import(new UsersImport, $request->file('file'));

        return back()->with('success', 'Arquivo importado com sucesso!');
    }
}

Criar a Rota

Adicione as rotas em routes/web.php:

use App\Http\Controllers\ImportController;

Route::get('/import', [ImportController::class, 'showImportForm']);
Route::post('/import', [ImportController::class, 'import']);

Criar a View para Upload do Arquivo

Crie um formulário em resources/views/import.blade.php para permitir o envio do arquivo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Importar Arquivo</title>
</head>
<body>
    <h1>Importar Arquivo CSV ou Excel</h1>

    @if(session('success'))
        <p style="color: green;">{{ session('success') }}</p>
    @endif

    @if($errors->any())
        <ul>
            @foreach($errors->all() as $error)
                <li style="color: red;">{{ $error }}</li>
            @endforeach
        </ul>
    @endif

    <form action="/import" method="POST" enctype="multipart/form-data">
        @csrf
        <label for="file">Escolha o arquivo:</label>
        <input type="file" name="file" id="file" required>
        <button type="submit">Importar</button>
    </form>
</body>
</html>

Agora você pode acessar http://localhost/import para importar os arquivos.


5. Exportando Arquivos (CSV ou Excel)

Criar uma Classe de Exportação

Crie uma classe para exportar os dados:

php artisan make:export UsersExport --model=User

Edite o arquivo app/Exports/UsersExport.php:

<?php

namespace App\Exports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\FromCollection;

class UsersExport implements FromCollection
{
    /**
     * Retorna os dados que serão exportados.
     */
    public function collection()
    {
        return User::all(); // Exporta todos os usuários
    }
}

Criar um Controlador para Exportação

Adicione o método de exportação no controlador:

<?php

namespace App\Http\Controllers;

use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;

class ExportController extends Controller
{
    public function export()
    {
        return Excel::download(new UsersExport, 'users.xlsx'); // ou 'users.csv'
    }
}

Criar a Rota

Adicione a rota de exportação em routes/web.php:

use App\Http\Controllers\ExportController;

Route::get('/export', [ExportController::class, 'export']);

Agora você pode acessar http://localhost/export para exportar os dados.


6. Testar Importação e Exportação

  • Importação: Acesse http://localhost/import, envie um arquivo CSV ou XLSX no formato adequado (por exemplo: name,email,phone) e clique em “Importar”.
  • Exportação: Acesse http://localhost/export para baixar os dados salvos no banco de dados em formato Excel ou CSV.

7. Observações e Melhorias

  • Validação do Formato do Arquivo: Certifique-se de que os dados no arquivo têm o formato correto antes de importá-los.
  • Filtrar Dados para Exportação: Se necessário, personalize a lógica em UsersExport para exportar apenas os dados relevantes.
  • Paginação para Grandes Arquivos: Para exportar grandes volumes de dados, use o recurso de chunk do Laravel Excel para evitar problemas de memória:
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;

class UsersExport implements FromQuery
{
    use Exportable;

    public function query()
    {
        return User::query();
    }
}
  • Mensagens Personalizadas: Mostre mensagens de erro/sucesso personalizadas para o usuário em caso de falha.

Com isso, você terá uma solução completa para importar e exportar arquivos CSV e Excel no Laravel.

Posts Similares