laravel excel 导出导入

2018-03-28  本文已影响0人  敲代码的小仙女

一、扩展包安装

"maatwebsite/excel": "~2.1.0"

加入composer.json中的require中,执行composer update

二、导出

1. 直接导出
public function excelExport(Request $request)

{

//获取数据

    $report = Xzcase::all();

    Excel::create('excel导出',function($excel) use ($report){

        $excel->sheet('score',function ($sheet) use ($report){

            $sheet->appendRow(['案件编号','文书字号']);

//处理数据

            foreach ($report as $key){

                $sheet->appendRow([

                    $key->case_code,

                    $key->number,

                ]);

            }

//定义单元格宽度

            $sheet->setWidth(array(

                'A'    =>  10,

                'B'    =>  10,

            ));

//定义字体大小

            $sheet->setFontSize(10);

//定义字体加粗

            $sheet->setFontBold(true);

        });

    })->export('xlsx');

}
2. view导出
1)在excel导出部分进行修改:

Excel::create('excel导出', function ($excel) use ($data) {

    $excel->sheet('score', function ($sheet) use ($data) {

//使用with()将数据传到指定的页面中

        $sheet->loadView('admin/table/case_quality')->with('data', $data);

        $sheet->setFontSize(10);

    });

})->export('xlsx');
2)在view中就是根据html进行表格的编写就行,注意两点
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .td{
            border: 1px solid #000000;
            width: 10;
            height: 30;
        }
        .td-m{
            border: 1px solid #000000;
            width: 15;
            height: 30;
        }
        .td-h{
            width: 13;
            height: 30;
            border: 1px solid #000000;
        }
    </style>
</head>
<body>
<table>
    <tr>
        <td valign="middle" colspan="16" align="center" style="height: 40;">
            <span><h1>{{$day}}每日法制汇报表</h1></span>
        </td>
    </tr>
    <tr>
        <td class="td-h" valign="middle" colspan="13" align="center"><b>强制措施</b></td>
        <td class="td-h" valign="middle" colspan="3" align="center"><b> 移送起诉</b></td>
    </tr>
    <tr>
        <td class="td-h" valign="middle" colspan="4" align="center"><b>强制措施合计</b></td>
        <td class="td-h" valign="middle" colspan="4" align="center"><b>侵财</b></td>
        <td class="td-h" valign="middle" colspan="5" align="center"><b>涉黑涉恶</b></td>
        <td class="td-h" valign="middle" rowspan="2" align="center"><b>移送起诉合计</b></td>
        <td class="td-h" valign="middle" rowspan="2" align="center"><b>侵财</b></td>
        <td class="td-h" valign="middle" rowspan="2" align="center"><b>涉黑涉恶</b></td>
    </tr>
    <tr>
        <td class="td-h" valign="middle" align="center" ><b>刑拘</b></td>
        <td class="td-h" valign="middle" align="center" ><b>取保</b></td>
        <td class="td-h" valign="middle" align="center" ><b>监居</b></td>
        <td class="td-h" valign="middle" align="center" ><b>总数</b></td>
        <td class="td-h" valign="middle" align="center" ><b>刑拘</b></td>
        <td class="td-h" valign="middle" align="center" ><b>取保</b></td>
        <td class="td-h" valign="middle" align="center" ><b>监居</b></td>
        <td class="td-h" valign="middle" align="center" ><b>总数</b></td>
        <td class="td-h" valign="middle" align="center" ><b>刑拘</b></td>
        <td class="td-h" valign="middle" align="center" ><b>取保</b></td>
        <td class="td-h" valign="middle" align="center" ><b>监居</b></td>
        <td class="td-h" valign="middle" align="center" ><b>总数</b></td>
        <td class="td-h" valign="middle" align="center" ><b>逮捕后增加</b></td>

    </tr>
    <tr>
        @for($i=0;$i<=15;$i++)
        <td class="td-h" valign="middle" align="center"><b>{{$res[$i]}}</b></td>
        @endfor
    </tr>
</table>

</body>

</html>
3.导入
1)保存excel到storage中
public function upload_data(Request $request) {

    $file = $request->file('excel');

// 文件是否上传成功

    if (!$file->isValid()) {

        return $this->show(2, "上传失败");

    }

    // 获取文件相关信息

    $ext = $file->getClientOriginalExtension();    // 扩展名

//文件格式

    $fileTypes = ['xls', 'xlsx'];

    $isInFileType = in_array($ext, $fileTypes);

    //文件格式是否成功

    if (!$isInFileType) {

        return $this->show(2, "上传文件格式不正确");

    }

    // 上传文件

    $filename = date('Ymd') . uniqid() . '.' . $ext;

    //路径

    $path = $request->file('excel')->storeAs('excel', $filename);

    return $this->show(1, $path);

}
2)读取excel数据
private function load_excel($filename) {

    $filePath = 'storage/app/' . $filename;

    $reader = Excel::load($filePath);//要开始导入文件,可以使用->load($filename)。回调是可选的。

    $reader = $reader->getSheet(0);//得到Excel的第一页内容

    return $reader->toArray();

}
3)导入数据
public function excelImport(Request $request) {

        session()->forget('error');

        $rlt = $this->upload_data($request);//调用上面的方法,上传文件得到文件名

        if ($rlt["status"] != 1) {

            return redirect('index')->with('err', $rlt['message']);

        } else {

            try {

                $data = [];

                $error = [];

                $err_count = 0;

                $success_count = 0;

                $table = $this->load_excel($rlt["message"]);//调用load_excel方法导入文件

                if ($table[0][0] == "案件编号" && $table[0][1] == "文书字号"  ) {//Excel第一行

                    $title = [

                        0 => '案件编号',

                        1 => '文书字号',

                    ];

                    array_unshift($error, $title);//将标题插入失败数据的第一行,后面导出

                    foreach ($table as $v) {

                        try {

                            if ($v[0] == "案件编号" && $v[1] == "文书字号" ) {

                                continue;

                            }

                            if ($v[0] == "" && $v[1] == "" ) {

                            } else {

                                $row["case_code"]      = trim($v[0]);

                                $row["number"]        = trim($v[1]);

                                array_push($data, $row);

                            }

                        } catch (\Exception $e) {

                            $err_count++;

                            array_push($error, $v);//失败数据存起来后面将把失败数据导出

                            Log::info($e);

                            continue;

                        }

                }

                    //插入

                    foreach ($data as $k => $d) {

                        if (!$d) continue;

                        try {

                                $insert_id = new Xzcase();

                                $insert_id->case_code      = $d['case_code'];

                                $insert_id->number        = $d['number'];

                                $insert_id->save();

                                $success_count++;

                            //一些数据库操作

                        } catch (\Exception $e) {

                            $err_count++;

                            array_push($error, $d);//失败数据存起来后面将把失败数据导出

                            Log::info($e);

                            continue;

                        }

                }

                    if ($error) {

                        session(['error' => $error]);//将要导出的内容存入session 键值为error

                        $download = true;//向前台返回一个标识,true说明有失败数据

                    } else {

                        $download = false;

                    }

                    Storage::delete($rlt["message"]);

                    return redirect('xzcase-index')->with('mess', "本次共导入 " . ($success_count + $err_count) . " 条数据 , 其中失败 " . $err_count . "条 。 ", $download);

                } else {

                    Storage::delete($rlt["message"]);

                    return redirect('xzcase-index')->with('err', "数据格式错误");

                }

            } catch (\Exception $e) {

                Log::info($e);

                Storage::delete($rlt["message"]);

                return redirect('xzcase-index')->with('err', "数据导入失败");

            }

        }

}
4)导出导入失败的数据
public function errorExport() {

    $data = session('error');

    if (empty($data)) {

        return redirect('index')->with('mess', '没有错误数据');

    }

    $cellData = [];

    foreach ($data as $k => $v) {

        if ($k == 0) {

            array_push($cellData, $v);

        } else {

            $res = [];

            if (!empty($v['case_code'])) {

                $res[] = $v['case_code'];

                $res[] = $v['number'];

            }else{

                $res[] = $v[0];

                $res[] = $v[1];

            }

            array_push($cellData, $res);

        }

}

    Excel::create('导入失败信息汇总', function ($excel) use ($cellData) {

        $excel->sheet('score', function ($sheet) use ($cellData) {

            $sheet->rows($cellData);

        });

    })->export('xls');

}

更多参数和操作方法请看官网!!

上一篇下一篇

猜你喜欢

热点阅读