美文网首页
laravel excel 导出导入

laravel excel 导出导入

作者: 敲代码的小仙女 | 来源:发表于2018-03-28 10:16 被阅读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进行表格的编写就行,注意两点
    • a. 设置单元格宽高时,不要加上px单位,会报错或者导出空的报表。

    • b. 在html中,如果第一行合并了列的单元格,在第二行是不需要在写<td></td>的,但是excel导出时是需要加上的。

    <!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');
    
    }
    
    

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

    相关文章

      网友评论

          本文标题:laravel excel 导出导入

          本文链接:https://www.haomeiwen.com/subject/mfhycftx.html