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

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/dreamboycx/p/15324497.html
Copyright © 2011-2022 走看看