laravel5.4Excel导入导出,Excel数据导入并把失败数据导出

laravel中使用Excel

首先下载,在命令行中

composer require maatwebsite/excel

这里写图片描述

然后在项目中配置:

在app/config/app.php配置文件中

providers数组添加Maatwebsite\Excel\ExcelServiceProvider::class, 如下图1;

aliasses数组中添加'Excel' => Maatwebsite\Excel\Facades\Excel::class, 如下图2;

图1:

这里写图片描述

图2:

这里写图片描述

下面我把方法都提了出来

控制器前面一定use这个Excel;

use Maatwebsite\Excel\Facades\Excel;

上传文件调用的方法:

private function upload_data(Request $request)//导入的时候  上传文件
{
    if (!$request->hasFile('file')) {
        return [
            'success' => false,
            'message' => '上传文件为空'
        ];
    }
    $file = $request->file('file');
    if (!$file->isValid()) {
        return [
            'success' => false,
            'message' => '文件上传出错'
        ];
    }
    $extension = $file->getClientOriginalExtension();
    $storage_path = storage_path('app/public/excel');//上传文件保存的路径
    if (!file_exists($storage_path)) {//如果$storage_path(文件保存的目录)不存在
        mkdir($storage_path, 0777, true);//创建一个目录
    }
    $filename = md5(millisecond()) . '.' . $extension;//文件名
    if ($file->move($storage_path, $filename) == false) {//移动一个已上传的文件
        return [
            'success' => false,
            'message' => '文件保存失败'
        ];
    }
    return [//上传成功返回文件名称
        'success' => true,
        'message' => $filename
    ];
}

给上传的文件按照时间戳命名时调用的方法:

function millisecond()
{
    return ceil(microtime(true) * 1000);
    //ceil() 函数向上舍入为最接近的整数   microtime()返回当前 Unix 时间戳的微秒数:当设置为 TRUE 时,规定函数应该返回浮点数,否则返回字符串。默认为 FALSE。
}

文件上传成功后读取文件数据时调用的方法:

private function load_excel($filename)
{
    $filePath = 'storage/app/public/excel/' . $filename;
    $reader = Excel::load($filePath);//要开始导入文件,可以使用->load($filename)。回调是可选的。
    $reader = $reader->getSheet(0);//得到Excel的第一页内容,如下图3
    return $reader->toArray();
}

图3:

这里写图片描述

导入文件方法:

如果部分数据导入失败,把这部分失败数据存起来,存到session里面,然后返回给前台一个标识信息,前台收到信息后调用下面的err_download()方法,去session里面把这部分数据下载下来。

public function import(Request $request)
{   
    $time_star = time();//得到当前时间戳,用来在最后计算文件导入完毕后的用时
//set_time_limit — 设置脚本最大执行时间。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。如果设置为0(零),没有时间方面的限制。
    $rlt = $this->upload_data($request);//调用上面的方法,上传文件得到文件名

    if ($rlt["success"] == false) {
        return Response::json($rlt);
    } else {
        try {
            $data = [];
            $table = $this->load_excel($rlt["message"]);//调用load_excel方法导入文件
            if ($table[0][0] == "姓名" && $table[0][1] == "就职单位" && $table[0][2] == "联系电话" ) {//Excel第一行
                $title = [
                    0   => '姓名',
                    1   => '就职单位',
                    2   => '联系电话',
                ];
                foreach ($table as $v) {
                    try{
                        if ($v[0] == "姓名" && $v[1] == "就职单位" && $v[2] == "联系电话") {
                            continue;
                        }
                        if ($v[0] == "" && $v[1] == "" && $v[2] == "") {

                        } else {

                            $row["name"] = trim($v[0]);//姓名
                            $row["address"] = trim($v[1]);//就职单位
                            $row["phone"] = trim($v[2]);//联系电话

                            array_push($data, $row);
                        }
                    }catch(\Exception $e){
                        $err_count++;
                        array_push($error,$v);//失败数据存起来后面将把失败数据导出
                        Log::info($e);
                        continue;
                    }
                }
                //插入
                foreach($data as $d){
                    if(!$d)continue;
                    try{
                        DB::transaction(function ()use($d,$process_template) {//一些导入操作
                            $insert_id = DB::table("student")->insertGetId($d);
                            //一些数据库操作
                        });
                        $success_count++;
                    }catch (\Exception $e){
                        $err_count++;
                        array_push($error,$d);//失败数据存起来后面将把失败数据导出
                        continue;
                    }
                }
                if($error){
                    array_unshift($error,$title);//将标题插入失败数据的第一行,后面导出
                    session(['error'=>$error]);//将要导出的内容存入session 键值为error
                    $download = true;//向前台返回一个标识,true说明有失败数据
                }else{
                    $download = false;
                }
                $time_end = time();
                return Response::json(["success" => true, "message" => "本次共导入 ".($success_count+$err_count).' 条数据 , 其中失败 '.$err_count.' 条 。 ','download'=>$download,'time'=>($time_end-$time_star)]);

            } else {
                return Response::json(["success" => false, "message" => "数据格式错误"]);
            }
        } catch (\Exception $e) {
            Log::info($e);
            return Response::json(["success" => false, "message" => "数据导入失败"]);
        }
    }
}

导入成功后前台执行的方法,访问admin/exam/download_err下载失败数据:

success(res) {
    if(res.download){//后台传过来的一个标识,true说明有失败数据,将失败数据导出
        location.href = 'admin/exam/download_err';
    }
}

访问admin/exam/download_err需要配置路由信息:

//下载失败数据表格
Route::get('/exam/download_err','Admin\ExamController@err_download');//根据自己的控制器进行更改

下面是导出失败数据的方法,从session中将失败数据导出来:

function err_download(){
    $err = session()->pull('error');//得到session中error对应的数据
    if($err){
        Excel::create('导入失败数据',function($excel) use($err){
            $excel->sheet('列表', function($sheet) use($err) {

                $sheet->rows($err);

            })->download('xls');
        });
    }
}  

下面是数据导出功能:

还是要先配置路由信息

location = 'admin/student/export';
//导出表格对应的路由信息
Route::get('student/export', 'Admin\StudentController@export');

导出数据调用的方法,从数据库里面得到数据,将数据组织成Excel格式导出。

public function export(Request $request){//导出数据
    $data =  DB::table('student')->where('status',1)->get()->toArray();//通过查询得到数据
    $title = [
        0   => '姓名',
        1   => '就职单位',
        2   => '联系电话',
    ];
    $export = null;
    foreach ($data as $key => $val) {
        $export[$key][0] = $val->name;
        $export[$key][1] = $val->address;
        $export[$key][2] = $val->phone;
    }
    $data = array_merge($title,$export);
    Excel::create('学员列表_'.date('Y-m-d H:i:s'),function($excel) use($data){
        $excel->sheet('学员列表', function($sheet) use($data) {
            $sheet->setWidth(array(
                'A'     =>  10,
                'B'     =>  15,
                'C'     =>  20,
            ));
            $sheet->rows($data);
        });
    })->export('xls');
}

成长路上的一些知识分享,如有错误,欢迎指正批评!O(∩_∩)O

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值