📜  快速 excel 导出 laravel - PHP (1)

📅  最后修改于: 2023-12-03 15:25:39.303000             🧑  作者: Mango

快速 Excel 导出 Laravel - PHP

介绍

Excel 是一种广泛使用的电子表格应用程序,可以方便地处理数据。在 Laravel 开发中,我们有时需要把数据导出到 Excel 文件中,以方便对数据进行分析和处理。本篇文章将介绍如何在 Laravel 中快速导出 Excel 文件。

准备工作

在 Laravel 开发中,我们通常使用 maatwebsite/excel 这个包来实现 Excel 导入导出功能。我们需要在 Laravel 项目中安装该包,具体步骤如下:

在 Laravel 项目中执行以下命令:

composer require maatwebsite/excel

安装完成后,在 config/app.php 文件中添加以下内容:

'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Notifications\NotificationServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Package Service Providers...
         */
        Maatwebsite\Excel\ExcelServiceProvider::class,

],

同时,在 config/app.php 文件的 aliases 数组中添加以下内容:

'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Arr' => Illuminate\Support\Arr::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
        'Bus' => Illuminate\Support\Facades\Bus::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'Date' => Illuminate\Support\Facades\Date::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
        'Event' => Illuminate\Support\Facades\Event::class,
        'File' => Illuminate\Support\Facades\File::class,
        'Gate' => Illuminate\Support\Facades\Gate::class,
        'Hash' => Illuminate\Support\Facades\Hash::class,
        'Http' => Illuminate\Support\Facades\Http::class,
        'Lang' => Illuminate\Support\Facades\Lang::class,
        'Log' => Illuminate\Support\Facades\Log::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Notification' => Illuminate\Support\Facades\Notification::class,
        'Password' => Illuminate\Support\Facades\Password::class,
        'Queue' => Illuminate\Support\Facades\Queue::class,
        'RateLimiter' => Illuminate\Support\Facades\RateLimiter::class,
        'Redirect' => Illuminate\Support\Facades\Redirect::class,
        'Redis' => Illuminate\Support\Facades\Redis::class,
        'Request' => Illuminate\Support\Facades\Request::class,
        'Response' => Illuminate\Support\Facades\Response::class,
        'Route' => Illuminate\Support\Facades\Route::class,
        'Schema' => Illuminate\Support\Facades\Schema::class,
        'Session' => Illuminate\Support\Facades\Session::class,
        'Storage' => Illuminate\Support\Facades\Storage::class,
        'Str' => Illuminate\Support\Str::class,
        'URL' => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,
        'Excel' => Maatwebsite\Excel\Facades\Excel::class, //添加该行

],

至此,我们已经通过 Composer 安装了 maatwebsite/excel 的依赖包,并在 Laravel 项目中注册了该包的服务提供者和别名。现在我们可以开始在 Laravel 项目中进行 Excel 导入导出功能的实现了。

Excel 导出

在 Laravel 项目中实现 Excel 导出功能的步骤如下:

  • 创建导出类
  • 在控制器中使用导出类
  • 在路由中定义导出接口
创建导出类

我们需要创建一个 Excel 导出类,用于导出指定的数据到 Excel 文件中。在 Laravel 项目中,我们可以使用以下 artisan 命令来创建该类:

php artisan make:export UsersExport --model=User

该命令会在 Laravel 项目的 app/Exports 目录中创建一个名为 UsersExport 的导出类,并让该类基于 User 模型。

接下来,我们需要对该类进行配置。打开 app/Exports/UsersExport.php 文件,可以看到该文件包含了一个名为 query() 的方法,该方法用于定义需要导出的数据,默认返回所有 User 模型实例。我们需要在该方法中指定需要导出的数据。例如,我们可以修改该方法如下:

public function query()
{
    return User::query()->select('id', 'name', 'email');
}

该方法实现了一个简单的查询,返回了 User 的 id、name 和 email 字段的值。

接下来,我们需要通过实现 headings() 方法,指定表头。例如:

public function headings(): array
{
    return ['ID', 'Name', 'Email'];
}

该方法返回一个数组,指定表头的字段名。

最后,我们需要指定导出的文件名和类型。在该类中,我们可以实现一个名为 fileName() 的方法,用于指定文件名。例如:

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;

class UsersExport implements FromCollection, WithHeadings, ShouldAutoSize
{
    use Exportable;

    public function collection()
    {
        return User::query()->select('id', 'name', 'email')->get();
    }

    public function headings(): array
    {
        return ['ID', 'Name', 'Email'];
    }

    public function fileName(): string
    {
        return 'users.xlsx';
    }
}

在该类中,我们使用了 Maatwebsite\Excel\Concerns\Exportable trait,该 trait 提供了一个 download() 方法,可以实现自动下载导出的文件。

在控制器中使用导出类

在 Laravel 项目中,我们需要先创建一个控制器类,用于调用导出类的方法。例如,我们可以实现以下控制器类:

namespace App\Http\Controllers;

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

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

在该控制器类中,我们使用了 $export 变量来实例化导出类 UsersExport,并调用 download() 方法来自动下载导出的 Excel 文件。

在路由中定义导出接口

在 Laravel 项目中,我们需要通过路由来定义 Excel 导出的接口。例如,我们可以实现以下路由:

Route::get('/export/users', 'ExportController@users')->name('export.users');

在该路由中,我们指定了一个 GET 请求,调用 ExportController 控制器的 users() 方法,并将其命名为 export.users

至此,我们已经通过创建导出类、在控制器中使用导出类、在路由中定义导出接口的步骤,实现了 Excel 导出功能。通过访问 /export/users 接口可以下载一个名为 users.xlsx 的 Excel 文件。

总结

在本篇文章中,我们介绍了如何在 Laravel 中快速实现 Excel 导出功能。具体来说,我们通过安装 maatwebsite/excel 包、创建导出类、在控制器中使用导出类、在路由中定义导出接口的步骤,实现了一个简单的 Excel 导出功能。