zoukankan      html  css  js  c++  java
  • laravel maatwebsite/excel 使用教程 (导入篇)

    官方文档

    https://docs.laravel-excel.com/3.1/getting...

    GIT 地址

    https://github.com/maatwebsite/Laravel-Exc...

    作为一个和 laravel 契合度很高的 excel 工具包,大家应该都是用过这个工具。特别是 2.x 版本几乎是用 laravel 框架都接触过,3.x 基本上全部重构,全网几乎找不到比较完善的教程,我就先抛砖引玉,大概把我用到的功能使用方式列一下,欢迎大家补充。

    环境要求
    • PHP: ^7.0

    • Laravel: ^5.5

    安装方式
    composer require maatwebsite/excel

    因为目前 3.1 只支持 Laravel 5.5 以上,所以会自动注册。

    excel 导入

    新建导入文件,导入导出业务代码尽量不要和原来业务耦合。我们拿官网 user 模块举例

    php artisan make:import UsersImport --model=User

    会在 app 目录下创建 Exports 目录

    .
    ├── app
    │   ├── Imports
    │   │   ├── UsersImport.php
    │ 
    └── composer.json

    UsersImport.php 代码内容

    <?php
    
    namespace AppImports;
    
    use AppUser;
    use IlluminateSupportFacadesHash;
    use MaatwebsiteExcelConcernsToModel;
    
    class UsersImport implements ToModel
    {
        /**
         * @param array $row
         *
         * @return User|null
         */
        public function model(array $row)
        {
            return new User([
               'name'     => $row[0],
               'email'    => $row[1], 
               'password' => Hash::make($row[2]),
            ]);
        }
    }

    业务控制器中调用

    use AppImportsUsersImport;
    use MaatwebsiteExcelFacadesExcel;
    use AppHttpControllersController;
    
    class UsersController extends Controller 
    {
        public function import() 
        {
            Excel::import(new UsersImport, 'users.xlsx');
        }
    }
    

      需要说明的是,上面所用的模式是 toModel,不需要手动去调用 save 方法,如果需要手动控制存储过程,请使用下列方法。

    <?php
    
    namespace AppImports;
    
    use AppUser;
    use IlluminateSupportFacadesHash;
    //替换 toModel
    use MaatwebsiteExcelConcernsToCollection;
    
    class UsersImport implements ToModel
    {
        /**
         * 使用 ToCollection
         * @param array $row
         *
         * @return User|null
         */
        public function ToCollection(Collection $rows)
        {
            //如果需要去除表头
            unset($rows[0]);
            //$rows 是数组格式
            $this->createData($rows);
        }
    
        public function createData($rows)
        {
            //todo
        }
    }

    Excel 导入基本功能到这基本完成,应该可以满足 80% 业务需求。如果有更多需求请继续阅读,下面将介绍分块导入、多表导入。

    分块导入

    如果 excel 数据量比较大,不适合一次性导入数据库,可以通过按量分块导入的方式节约内存。

    按 1000 条为基准取出导入

    namespace AppImports;
    
    use AppUser;
    use MaatwebsiteExcelConcernsToModel;
    //新增
    use MaatwebsiteExcelConcernsWithBatchInserts;
    use MaatwebsiteExcelConcernsWithChunkReading;
    
    class UsersImport implements ToModel, WithBatchInserts, WithChunkReading
    {
        public function model(array $row)
        {
            return new User([
                'name' => $row[0],
            ]);
        }
    
        //批量导入1000条
        public function batchSize(): int
        {
            return 1000;
        }
        //以1000条数据基准切割数据
        public function chunkSize(): int
        {
            return 1000;
        }
    }

    需要注意的是 批量导入 只支持 ToModel 模式,如果你需要对数据进行更改,建议先批量导入临时表,再修改数据导入业务相关表。

    多 sheet 导入

    和导出比较类似,需要两步操作,第一步读取整体 excel 结构,第二步完成对应表数据导入。

    第一个文件 UsersImport.php

    namespace AppImports;
    
    use MaatwebsiteExcelConcernsWithMultipleSheets;
    
    class UsersImport implements WithMultipleSheets 
    {
    
        public function sheets(): array
        {
            //这里需要注意的是键,这个键可以是sheet表的名称,比如 'sheet1'=> new FirstSheetImport()
            return [
                0 => new FirstSheetImport(),
                1 => new SecondSheetImport(),
            ];
        }
    }

    这里我没有找到获取所有 sheet 的方法,所以只能一个个指定,如果你调用的方法是一致的,可以参考以下我的写法。如果你有更好的方式,欢迎交流。

    public function sheets(): array
    {
        $sheet = [];
        for ($i=1; $i<=26; $i++) {
            $sheet[$i] = new CustomSheetImport();
        }
        return $sheet;
    }

    第二个文件处理数据

    namespace AppImports;
    
    use IlluminateSupportCollection;
    use MaatwebsiteExcelConcernsToCollection;
    
    class FirstSheetImport implements ToCollection
    {
        public function collection(Collection $rows)
        {
            //todo
        }
    }

    maatwebsite/Excel 3.1 使用教程 (导入篇) - Laravel实战 - E度笔记
    http://www.edbiji.com/doccenter/showdoc/209/nav/3723.html

  • 相关阅读:
    面向对象高级
    面向对象基础总结
    面向对象基础剩余
    组合和封装
    继承与派生
    面向对象
    4.10
    4.9
    常用模块
    【转】CentOS: 开放80、22、3306端口操作
  • 原文地址:https://www.cnblogs.com/dreamboycx/p/15324497.html
Copyright © 2011-2022 走看看