• Laravel -- Excel 导入(import) (v2.1.0)


    原博客地址 https://www.jianshu.com/p/7287ebdc77bb

    Install (安装)
    //> composer.json 中 require中添加如下:
    "maatwebsite/excel": "~2.1.0"
    //> 然后使用如下composer命令安装
    composer update
    
    //> config/app.php 中注册 服务提供类 providers数组中
    MaatwebsiteExcelExcelServiceProvider::class,
    //> config/app.php 中注册 门面类 aliases 数组中
    'Excel' => MaatwebsiteExcelFacadesExcel::class,
    
    //> 移动配置文件 excel.php 到 config目录下面 命令:
    php artisan vendor:publish --provider="MaatwebsiteExcelExcelServiceProvider"
    
    //> 服务器容器中绑定 的是'excel'
    App::make('excel')
    
    Import(导入)
    • 我们来修改 config/excel.php 的导入配置参数
    //> 修改一下 excel.php 配置文件 的 import 数组参数,否则导入时只解析ASCII(对中文不敏感)
    'to_ascii'  => false # 这个参数改为false(否则,只会得到excel的ascii编码以内组成的字符串)
    'heading' => 'slugged' # 表示得到关联数组(键是Excel的A1行标题)
    # 'heading' => false # 表示得到索引数组(从0开始到...)(其他参数请自行尝试)
    'startRow' => 1 # 如果没特殊需求,就使用默认值(表示开始取得位置 row :从第几行还是取值)
    # 这里就采用默认值吧(输入、输出编码)
    'encoding'  => [
        'input'  => 'UTF-8',
        'output' => 'UTF-8'
    ],
    # 根据需要适当配置该参数(作用:如果设置为true,会自动忽略为空的某一数值)
    # 比如 SPU标题下存在一行为空值,那么该行中就不会出现 apu => null 情况(会自动忽略)
    'ignoreEmpty'  => false,
    # 改值为 false (表示:当前我们默认只或的一个sheet文件);true:表示当前默认获取多个sheet文件;(如果不是多文件导入,默认设置为false)
    'force_sheets_collection' => false,
    //> 其他import参数,遇到再详细讨论
    
    //> 文件导入
        Excel::load($fileName, function ($reader){
            foreach ($reader->get() as $item){
                    dump($item);
            }
        });
    # 参看一下上传控制器 动作
    public function excel(Request $request){
            //> 判断请求类型
            if( $request->isMethod('post') && $_FILES['file'] ){
                //> 获取上传文件路径 $_FILES
                if( $_FILES['file']['error'] == 0 ){
                    //> 获取上传文件名称(已便于后面判断是否上传需要后缀文件)
                    $name = $_FILES['file']['name'];
                    //> 获取上传文件后缀 如(xls exe xlsx 等)
                    $ext = strtolower(trim(substr($name,(strpos($name,'.')+1))));
                    //> 判断文件是否为指定的上传文件后缀
                    if( ! in_array($ext,array('xls','xlsx')) ){
                        //> 返回上一次请求位置,并携带错误消息
                        return redirect()->back()->withErrors('请输入xls或xlsx后缀文件')->withInput();
                    }
                    //> 获取文件上传路径
                    $fileName = $_FILES['file']['tmp_name'];
                    //> excel文件导入 上传文件
                    Excel::load($fileName, function ($reader){
                        //> 处理上传文件数据 此时 处理多个上传的 sheet 文件
                        foreach ($reader->get() as $item){
                            //> 处理相关上传excel数据
                            dump($item);
                        }
                    });
                }
                exit;
            }
            return redirect()->route('home.index');
        }
    //> 现在我们讨论一下get()和all()方法
    load回调的$reader->get()或$reader->all()并没有很大的区别(得到结果都是一样的)
    # 获取 sheet 标题 (改标题)
    $reader->getTitle()
    
    # 获取指定 前 $limit 行 数据
    # ->takeRows($limit) 获取指定的前$limit条数据
    Excel::load($fileName, function ($reader){
              //> takeRows 限制获取数据
              foreach ($reader->takeRows(10)->get() as $item) {
                      dump($item);
              }
    });
    # ->limitRows($start=0,$end) 获取指定长度数据
    Excel::load($fileName, function ($reader){
              //> limitRows(5,10):获取第5条到第10条数据
              foreach ($reader->limitRows(5,10)->get() as $item) {
                       dump($item);
              }
    });
    # ->skipRows($num):跳过指定行
    Excel::load($fileName, function ($reader){
              //> skipRows($num) :开始跳过多少行,在取数据(这里:从第5行开始,取10条数据)
              //> skipRows和takeRows一起使用才能达到上面描述的效果(和limitRows()好像就无效了)
              foreach ($reader->skipRows(5)->takeRows(10)->get() as $item) {
                       dump($item);
              }
    });
    
    //> 上面是获取行;下面介绍获取列
    # ->takeColumns()  类比 takeRows()方法:只是takeColumns获取的是列数据
    # ->limitColumns() 类比 limitRows()方法:只是limitColumns()获取的是列数据
    # ->skipColumns() 类比 skipColumns()方法: 只是skipColumns()跳过的列
    
    //> toArray() 对象转换为数组
    Excel::load($fileName, function ($reader){
             //> 这样使用也是可以的 $reader->get()->toArray();
             foreach ($reader->get() as $item) {
                     //> toArray() 转换为数组
                     dump($item->toArray());
             }
    });
    //> toObject() 转换为对象
    # toObject() 好像并没有多大用处(一直提示错误)
    
    Laravel Excel提供了两个打印方法(并没有多个用处)
    $reader->dump();
    $reader->dd();
    
    //> each() 遍历方法(该方法类似 foreach)
    Excel::load($fileName, function ($reader){
          $reader->each(function($sheet){
                $sheet->each(function($row){
                     dump($row);
                });
          });
    });
    
    • 选择页和列
    //> Excel门面提供一个 selectSheets(...$sheet) 方法:允许打开指定的sheet文件
    # 当我们上传多个sheet文件需要被处理时,加载指定的sheet文件就可以使用该方法
    Excel::selectSheets('sheet1', 'sheet2')->load();  //> 当然我们也可以选择一张sheet表加载
    //> 通过索引加载sheet文件
    Excel::selectSheetsByIndex(0, 1)->load(); //> 表示加载第一个第二个sheet文件
    
    //> 获取指定sheet文件指定字段
    $reader->select(array('firstname', 'lastname'))->get();  //> 获取firstname和lastname字段
    # Or
    $reader->get(array('firstname', 'lastname'));  //> 直接给get()传递参数
    
    • 日期处理
    //> 日期形式默认会被解析成Carbon对象 如 2017-01-01 08:00
    //> 我们来看一下日期配置参数
    dates => [
        //> 是否开启日期解析:默认开启(解析日期字符串)
        //> 如果设置为false:2017-01-01 08:00 可能会得到一个 1/1/17 08:00结果(由于美格式(月/日/年)可能会有些区别)
        'enabled' => true,
        //> 日期格式:如果设置为false 将返回一个Carbon时间对象
        # 'format' => 'U' 时:返回一个时间戳 如 2016/1/1 8:12:00 => 1451635920
        'format' => false,
        //> 日期字段,那些字段是日期字段 如果不存在值:默认解析值为字符串 时间的形式的 数据
        //> 如果写上:解析指定的字段 值 为指定字符串的形式
        'columns' => []
    ],
    //> ----------------------------------------------------------
    //> date 参数是处理整个导入文件时(如果我们想处理单独某个字段数据时)
    # ->formatDates($boolean, $format) 开启或关闭 日期 参数
    $reader->formatDates(true);
    $reader->formatDates(false);
    $reader->formatDates(true, 'Y-m-d H:i');  //> 转换为 Y-m-d H:i 时间形式
    Excel::load($fileName, function ($reader){
        $reader->formatDates(false)->each(function($sheet){
              $sheet->each(function($row){
                  dump($row);
              });
        });
    });
    $reader->formatDates(true, 'U'); 装换为时间戳形式
    //> format($dateFormat)  转换为指定数据形式
    Excel::load($fileName, function ($reader){
        $reader->each(function($sheet){
             $sheet->each(function($row){
                   dump($row->{"颜色分类"});
                   dump($row->{"颜色分类"}->format('U'));
                   dump($row->{"颜色分类"}->format('Y-m-d'));
             });
             exit;
         });
    });
    //> setDateFormat($format) 默认返回指定形式,不在返回Carbon对象
    $reader->setDateFormat('Y-m-d');
    //> 设置日期列 setDateColumns()
    $reader->setDateColumns(array(
        'created_at',
        'deleted_at'
    ))->get();
    
    import配置文件 参数 :calculate 是否开启计算 (经测试,没什么用处)
    // Enable calculation
    $reader->calculate();
    // Disable calculation
    $reader->calculate(false);
    

     
  • 相关阅读:
    while for循环
    Python模块
    python内置函数
    【简介】《GM/T 0034-2014 基于SM2密码算法的证书认证系统密码及其相关安全技术规范》
    Markdown的Diagrams
    密码设备管理-对称密钥管理
    TortoiseSVN的简单使用
    Android Studio安装后的设置
    Android Studio升级后,新建Activity后setContentView(R.layout.activity_layout_main);中R变红
    简介Floyd算法
  • 原文地址:https://www.cnblogs.com/matengfei123/p/11239045.html
Copyright © 2020-2023  润新知