美文网首页
laravel项目集成excel文件上传功能

laravel项目集成excel文件上传功能

作者: 追梦人在路上不断追寻 | 来源:发表于2022-10-31 21:52 被阅读0次

    laravel可以说是目前使用人数最多的php框架之一,最新的laravel大的版本已经来到了9.0,可以说每次更新,laravel都给我们带来了新的开发体验,而且很多扩展都和laravel完美的契合,可以说一方面是laravel促进了相关插件的研发,另一方面相关插件的更新也让laravel变得越来越强大。

    maxresdefault.jpg

    关于excel的php类库有很多,其中和laravel集成度最好的应该就是php-excel这个扩展类了。

    安装依赖

    如果laravel的版本低于9的话,使用下面的安装.

    composer require maatwebsite/excel
    

    如果laravel的版本是9的话,需要使用下面的安装命令。

    composer require psr/simple-cache:^2.0 maatwebsite/excel
    

    创建配置文件

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

    创建导入类

    php artisan make:import UsersImport --model=User
    

    编辑导入类文件

    <?php
    
    namespace App\Imports;
    
    use App\Models\User;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\Facades\Hash;
    use Maatwebsite\Excel\Concerns\ToModel;
    use Maatwebsite\Excel\Concerns\WithHeadingRow;
    
    class UsersImport implements ToModel, WithHeadingRow
    {
        /**
        * @param array $row
        *
        * @return \Illuminate\Database\Eloquent\Model|null
        */
        public function model(array $row)
        {
            return new User([
                "first_name" => $row['first_name'],
                "last_name" => $row['last_name'],
                "email" => $row['email'],
                "mobile_number" => $row['mobile_number'],
                "role_id" => 2, // User Type User
                "status" => 1,
                "password" => Hash::make('password')
            ]);
        }
    }
    

    在控制器中添加导入方法

    public function uploadUsers(Request $request)
    {
            Excel::import(new UsersImport, $request->file);
    
            return redirect()->route('users.index')->with('success', 'User Imported Successfully');
    }
    
    maxresdefault (1).jpg

    laravel-excel 3.1主要特点

    • 导入功能。
    • 大块阅读
    • 批量插入
    • 排队导入
    • 导出的 ToArray 关注点。
    • 用于导入和导出的自定义值绑定器。

    laravel-excel工作流程

    1. 扩展的核心是先导出Export类对象,所有的方法和业务逻辑都被封装在这个类中。
    <?php
    
    namespace App\Exports;
    
    use App\User;
    use Maatwebsite\Excel\Concerns\FromCollection;
    
    class UsersExport implements FromCollection
    {
        public function collection()
        {
            return User::all();
        }
    }
    
    1. 接下来,Export 对象将被传递给 Laravel Excel 包。这个的主要入口点是Maatwebsite/Excel/Excel类。可以通过多种方式调用此类。

    3.使用该类的最简单方法Excel是使用Maatwebsite\Excel\Facades\Excel外观。如果您使用自动发现 (打开新窗口),您可以直接使用别名\Excel,而不是使用完全限定的命名空间。

    1. 您可以将Maatwebsite/Excel/Excel通过构造函数注入到类中。
    <?php
    use App\Exports\UsersExport;
    use Maatwebsite\Excel\Excel;
    
    class ExportController
    {
        private $excel;
    
        public function __construct(Excel $excel)
        {
            $this->excel = $excel;
        }
        
        public function exportViaConstructorInjection()
        {
            return $this->excel->download(new UsersExport, 'users.xlsx');
        }
        
        public function exportViaMethodInjection(Excel $excel)
        {
            return $excel->download(new UsersExport, 'users.xlsx');
        }
    }
    

    5.使用该Maatwebsite\Excel\Exporter接口将更多内容与具体的 Excel 管理器实现分离。合约提供与类相同的方法Excel。这将使您在单元测试中更容易地删除导出器。Exporter合约可以通过构造函数或控制器中的方法注入。

    use App\Exports\UsersExport;
    use Maatwebsite\Excel\Exporter;
    
    class ExportsController
    {
        private $exporter;
    
        public function __construct(Exporter $exporter)
        {
            $this->exporter = $exporter;
        }
        
        public function export()
        {
            return $this->exporter->download(new UsersExport, 'users.xlsx');
        }
    }
    

    6.Maatwebsite\Excel\Excel通过容器绑定将管理器绑定到你自己的类,你可以使用excel容器绑定。

    $this->app->bind(YourCustomExporter::class, function() {
        return new YourCustomExporter($this->app['excel']);
    });
    

    7.使用这个Maatwebsite\Excel\Concerns\Exportable特性。Export这个 trait 将公开几个方法,可以直接导出Export对象。

    namespace App\Exports;
    
    use App\User;
    use Maatwebsite\Excel\Concerns\FromCollection;
    use Maatwebsite\Excel\Concerns\Exportable;
    
    class UsersExport implements FromCollection
    {
        use Exportable;
    
        public function collection()
        {
            return User::all();
        }
    }
    

    Excel将处理委托给Maatwebsite\Excel\Writer. 的第一个动作Writer是注册已注册的事件监听器。接下来它将创建一个新PhpOffice\PhpSpreadsheet\Spreadsheet实例,我们将使用它来将我们的Export对象转换为。

    引发的第一个事件是BeforeExport事件。这是在Spreadsheet创建实例后立即引发的,并允许早期访问它。

    需要注意的是,laravel-excel底层调用的依然是PhpSpreadsheet

    批量插入大文件

    对于大文件,可能需要占用更大的内存,这个时候最好的办法是分批导入,这个时候可以继承WithChunkReadingWithBatchInserts的方法来处理。

    
    namespace App\Imports;
    
    use App\User;
    use Maatwebsite\Excel\Concerns\ToModel;
    use Maatwebsite\Excel\Concerns\WithBatchInserts;
    use Maatwebsite\Excel\Concerns\WithChunkReading;
    
    class UsersImport implements ToModel, WithBatchInserts, WithChunkReading
    {
        public function model(array $row)
        {
            return new User([
                'name' => $row[0],
            ]);
        }
        
        public function batchSize(): int
        {
            return 1000;
        }
        
        public function chunkSize(): int
        {
            return 1000;
        }
    }
    

    相关文章

      网友评论

          本文标题:laravel项目集成excel文件上传功能

          本文链接:https://www.haomeiwen.com/subject/nkmltdtx.html