zoukankan      html  css  js  c++  java
  • Laravel Excel 实现 Excel-CSV 文件导入导出功能

    Laravel Excel 是一款基于 PHPExcel 开发的Laravel框架专用的 Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便。 

    它的 Github 地址是:https://github.com/Maatwebsite/Laravel-Excel 

    安装

    我们就按照GIthub上的readme文件进行安装吧。

    composer require "maatwebsite/excel:~2.1.0"

    在 config/app.php 中注册服务提供者到 providers 数组:

    MaatwebsiteExcelExcelServiceProvider::class,

    在 config/app.php 中注册门面到 aliases 数组:

    'Excel' => MaatwebsiteExcelFacadesExcel::class,

    生成 Laravel Excel 的配置文件,使用如下命令:

    php artisan vendor:publish --provider="MaatwebsiteExcelExcelServiceProvider"

    然后你会发现在 config 目录下有一个 excel.php 文件 ,大概的配置项,主要就是缓存表单,和导入导出的一些设置。

    导出文件

    我待会直接拿我的测试代码进行展示,不过在这之前你需要一条路由和一个控制器(一个导出方法)

    //Excel导出
    Route::get('/excel/export','MemberMemberController@export')->name('/excel/export');
    
    //Excel导入
    Route::get('/excel/import','MemberMemberController@import')->name('/excel/import');

    创建控制器,可以使用 artisan 命令或者手动创建:

    php artisan make:controller 控制器名称

    导出方法:

    <?php
    namespace AppHttpControllersMember;
    use AppHttpControllersBaseController;
    use AppModelMemberMemberFollow;
    use IlluminateHttpRequest;
    use IlluminateDatabaseQueryException;
    use Excel;
    
    class MemberController extends BaseController
    {
        /**
         *
         * Excel导出
         */
        public function export()
        {
            ini_set('memory_limit','500M');
            set_time_limit(0);//设置超时限制为0分钟
            $cellData = MemberFollow::select('xt_name','sex','face')->limit(5)->get()->toArray();
            $cellData[0] = array('昵称','性别','头像');
            for($i=0;$i<count($cellData);$i++){
                $cellData[$i] = array_values($cellData[$i]);
            }
            //dd($cellData);
            Excel::create('用户信息',function($excel) use ($cellData){
                $excel->sheet('score', function($sheet) use ($cellData){
                    $sheet->rows($cellData);
                });
            })->export('xls');
            die;
        }
    }

    我来对上面的代码进行解释下。 

    a. ini_set 设置内存溢出大小和超时时间是因为我的数据量比较大,不想直接去 php.ini 中修改,所以直接在这设置。你也可以修改 excel.php 配置项中的缓存大小,适当调整。 

    b. 首先你得需要知道 cellData 是一个二维数组,并且二维数组中的每一个一维数组必须是索引数组才行,这样格式上才能正确。 

    所以,我对我查询出的 $cellData 先进行了 toArray() 转化操作。然后我让你看下查询出的结构,因为我们数组表中的每个列都是一个字段,所以决定了一维数组是关联数组,需要去键处理。 

    for 循环处理后就是: 

     

    如果你要导出 csv 或者 xlsx 文件,只需将 export 方法中的参数改成 csv 或 xlsx 即可。也可以进行连贯操作直接将导出的文件直接保存到服务器上。 

    使用 store 方法:

    Excel::create('用户信息',function($excel) use ($cellData){
          $excel->sheet('score', function($sheet) use ($cellData){
            $sheet->rows($cellData);
          });
          })->store('xls')->export('xls');

    导入 Excel 文件

    导入我们可以直接用第一步注册的门面 Excel 门面上的 load 方法

     public function import(Request $request)
        {
            if(!$request->hasFile('question_file')){
                exit(' 操作有误,请重新上传!');
            }
            $file = $_FILES;
            $excel_file_path = $file['question_file']['tmp_name'];
    
            Excel::load($excel_file_path, function($reader) {
                $data = $reader->toArray();
                $question_data = [];
                foreach($data[0] as $key=>$val){
                    if(($val['tx']) == 2){
                        $option = ['A'=>$val['a'],'B'=>$val['b']];
                    }else{
                        $option = ['A'=>$val['a'],'B'=>$val['b'],'C'=>$val['c']];
                    }
                    $question_data[] =[
                        'cid' =>intval($val['cid']), //用取整函数 intval(11.0) 结果:11
                        'title' => $val['title'],
                        'option' => serialize($option),
                        'answer' => $val['answer'],
                        'score' => intval($val['score']),
                        'status' =>intval($val['status']),
                        'time' =>time(),
                        'tx' =>intval($val['tx'])
                    ];
                }
                dd($question_data);
            });
        }

    以上代码是我在本地环境做测试时写的,功能虽然实现了但是写得不够严谨,未做任何数据验证!

     

    foreach 循环处理后就是:

     

    参考文章: 

    Laravel Excel 实现 Excel/CSV 文件导入导出功能:

    https://blog.csdn.net/gu_wen_jie/article/details/79296470

    在Laravel5中使用LaravelExcel实现Excel/CSV文件导入导出功能(PHPExcel):

    http://blog.023xs.cn/Article/52

  • 相关阅读:
    PAT (Advanced Level) 1060. Are They Equal (25)
    PAT (Advanced Level) 1059. Prime Factors (25)
    PAT (Advanced Level) 1058. A+B in Hogwarts (20)
    PAT (Advanced Level) 1057. Stack (30)
    PAT (Advanced Level) 1056. Mice and Rice (25)
    PAT (Advanced Level) 1055. The World's Richest (25)
    PAT (Advanced Level) 1054. The Dominant Color (20)
    PAT (Advanced Level) 1053. Path of Equal Weight (30)
    PAT (Advanced Level) 1052. Linked List Sorting (25)
    PAT (Advanced Level) 1051. Pop Sequence (25)
  • 原文地址:https://www.cnblogs.com/zmdComeOn/p/10345851.html
Copyright © 2011-2022 走看看