• 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

  • 相关阅读:
    wso2使用
    wso2安装
    CLR 编译函数的两种结果的原因
    hduoj4311
    通过Git在本地局域网中的两台电脑间同步代码
    Git基本操作之强制推送覆盖仓库
    设置Mac共享网络给其他设备
    谷歌浏览器设置无图浏览模式
    加载到SGA中的库缓存对象超过阈值
    webBrowser 禁止屏蔽alert confirm open showModalDialog
  • 原文地址:https://www.cnblogs.com/zmdComeOn/p/10345851.html
Copyright © 2020-2023  润新知